2012-04-20 11 views
21

Ich habe derzeit ein Problem, dass ich in Legacy-Code umgehen muss, um unsere Interaktion mit einer PHP-Erweiterung richtig funktionieren zu lassen (Singleton Testing Question).Wie kann festgestellt werden, ob PHPUnit-Tests ausgeführt werden?

Daher möchte ich diesen Code nicht ausführen, wenn unser normaler Produktionscode mit der Anwendung ausgeführt wird. Daher muss ich regulären PHP-Code einchecken, wenn der ausgeführte Code als Teil eines Tests ausgeführt wird oder nicht.

Haben Sie Vorschläge, wie Sie das ermitteln können? Ich dachte über eine definierte Variable nach, die an das Vorhandensein der Testdateien selbst gebunden ist (wir liefern die Tests nicht an Kunden), aber unsere Entwickler benötigen die Extension, um normal zu arbeiten, während der CI-Server die Tests ausführen muss.

Wird ein Global-Set in der PHPUnit.xml-Datei empfohlen? Andere Gedanken?

Antwort

23

Definieren Sie eine Konstante in Ihrer PHPUnit bootstrap.php Datei. Dies wird vor dem Laden oder Ausführen von Tests ausgeführt. Dies sollte keine Auswirkungen auf Entwickler haben, die die Anwendung normal ausführen - nur die Komponententests.

+0

Danke. Das funktioniert wie ein Zauber, und ich kann meine Entwicklungsumgebung immer noch für andere Code-Prozesse erkennen. –

+0

Perfekt, hat super hier geklappt. Ich danke dir sehr. – GoinAum

29

Ein alternativer Ansatz ist zu set a constant in the PHP section of your phpunit.xml.*:

<php> 
    <const name="PHPUNIT_YOURAPPLICATION_TESTSUITE" value="true"/> 
</php> 

In Ihrer PHP-Anwendung, können Sie dann die folgenden Kontroll verwenden:

if (defined('PHPUNIT_YOURAPPLICATION_TESTSUITE') && PHPUNIT_YOURAPPLICATION_TESTSUITE) 
{ 
    echo 'TestSuite running!'; 
} 
+0

Denken Sie daran, dass PHP eine undefinierte Konstante seltsamerweise als String evaluiert (wenn 'BEISPIEL' nicht definiert ist, wird es als '' BEISPIEL'' interpretiert. Das heißt, Sie sollten es mit '===' richtig bewerten. Es wird erhalte immer noch eine Meldung über eine undefinierte Konstante –

+2

Wird ''==' auch nicht mit dem Typ übereinstimmen, und weil es als 'true' (ein Boolescher Wert) definiert ist, prüft er, ob es' 1' ist (eine Ganzzahl) Ich verstehe Ihren Kommentar, aber in diesem Beispiel ist "==" besser. –

+3

Dank Ihrer Antwort habe ich festgestellt, dass (in 'Laravel 5')' APP_ENV' auf 'testing' gesetzt ist Es ist wirklich einfach, Ihre Antwort zu implementieren. Ich würde diese Lösung wirklich für Laravel empfehlen. –

10

Sie könnten die verschiedene Möglichkeiten prüfen.

if(PHP_SAPI == 'cli') { 

    if(strpos($_SERVER['argv'][0], 'phpunit') !== FALSE) { ... } 
    // or 
    if($_SERVER['argv'][0] == '/usr/bin/phpunit') { ... } 

} 
+2

$ _SERVER ['argv'] [0] anstelle von $ argv [0] –

1

Ich benutze Laravel Log-Datei zu bestimmen, ob PHPUnit Tests ausgeführt werden.

+5

In Laravel setzt die phpunit.xml 'APP_ENV' auf' Testen ". Vielleicht ist das einfacher für Sie als die Protokolldatei? (nur ein Vorschlag) –

+0

Danke, gut zu wissen. –

Verwandte Themen