2012-04-20 3 views
21

Attualmente ho un problema che devo aggirare in codice legacy per far funzionare correttamente l'interazione con un'estensione PHP (Singleton Testing Question).Come determinare se i test PHPUnit sono in esecuzione?

Come tale, non voglio eseguire questo codice quando si esegue il nostro normale codice di produzione con l'applicazione. Pertanto, ho bisogno di controllare il normale codice PHP se il codice in esecuzione viene eseguito come parte di un test o meno.

Qualche suggerimento su come determinarlo? Ho pensato a una variabile definita legata alla presenza dei file di test stessi (non spediamo i test ai clienti) ma i nostri sviluppatori hanno bisogno che l'estensione funzioni normalmente, mentre il server CI deve eseguire i test.

Si consiglia un set Globale nel file PHPUnit.xml? Altri pensieri?

risposta

23

Definire una costante nel file PHPUnit bootstrap.php. Questo viene eseguito prima di caricare o eseguire qualsiasi test. Ciò non dovrebbe incidere sugli sviluppatori che eseguono l'applicazione normalmente, ma solo sui test delle unità.

+0

Grazie. Funziona come un incantesimo e riesco ancora a rilevare il mio ambiente di sviluppo per altri processi di codice. –

+0

Perfetto, ha funzionato alla grande qui. Grazie mille. – GoinAum

29

Un approccio alternativo è quello di set a constant in the PHP section of your phpunit.xml.*:

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

Nella propria applicazione PHP, si potrebbe quindi utilizzare il seguente controllo:

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

Ricorda che PHP valuta stranamente una costante indefinita come una stringa (se "ESEMPIO" non è definito, viene valutato come "ESEMPIO". Significato, dovresti valutarlo correttamente usando '==='. ancora lanciare una notifica su una costante indefinita –

+2

Non '===' corrisponde anche al tipo up, e poiché è definito come 'true' (un booleano) ma sta verificando se è' 1' (un numero intero) , fallirà? Comprendo il tuo commento, ma in questo esempio, '==' è migliore. –

+3

Grazie alla tua risposta ho scoperto che (in 'Laravel 5') l'APP_ENV' è impostato su' testing'. è davvero molto semplice implementare la tua risposta: raccomanderei davvero questa soluzione per Laravel –

10

Si potrebbe verificare i modi diversi.

+2

$ _SERVER ['argv'] [0] invece di $ argv [0] –

1

Io uso il file di registro di Laravel per determinare se i test di PHPUnit sono in esecuzione.

+5

In Laravel il phpunit.xml imposta 'APP_ENV' su' testing. Forse è più facile per te che il file di log? (solo un suggerimento) –

+0

Grazie, buono a sapersi. –