2012-05-09 4 views
32

Mi chiedo in che modo "strict mode è in PHPUnit"?Cosa fa la modalità PHPUnit Strict?

esempio:

phpunit --strict 

o in phpunit.xml

<phpunit strict="true"> 

ho acceso solo per provare e le mie prove ha iniziato non riuscendo con

PHP_Invoker_TimeoutException: Execution aborted after 1 second 

risposta

19

Risposta breve: per le prove esecuzione prolungata utilizzare un'annotazione per aumentare il tempo di esecuzione consentito:

@large // 10 seconds 
@medium // 5 seconds 
@small // 1 second max <-- Default, so no point using 

risposta Lunghi:

Ecco un set aggiornato di informazioni che è stato derivato con l'aiuto di @Crozin.

Nel mio caso l'errore era che un test richiedeva troppo tempo (> 1 secondo.) (Lo schema + creazione di Doctrine ORM può rallentare le cose, see this ZendCast for what I was doing). Ciò causava un problema (e un po 'di output) da PHP_Invoker. La modalità rigorosa non consente alcun output.

Da lettura/Reverse engineering /usr/share/php/pear/share/pear/PHPUnit/Util/Test.php::getSize() (e getGroups() sulla stessa classe) .. Ho capito sono 3 annotazioni senza documenti che possiamo utilizzare:

@large // 10 seconds 
@medium // 5 seconds 
@small // 1 second max run time 

possono essere specificati a livello di classe o al livello di metodo. Issue #490 on the PHPUnit github suggerimenti su come fornire sia livello di classe che livello di metodo, quindi YMMV se li si mescola. Come ha detto il crozin, i time out assegnati sono rispettivamente di 10,5,1 secondi.

Una soluzione alternativa era di aumentare il tempo di esecuzione di una funzione invocata (sul mio computer lento).

sudo vi /usr/share/php/pear/share/pear/PHP/Invoker.php 

Increase line 1 "declare(ticks = 1);" to 
    "declare(ticks = 10);" // or any higher int that meets your needs 

Ecco una serie di informazioni sulla modalità rigorosa che mi ha aiutato a trovare la soluzione:

PHP_Invoker
una classe di utilità per invocare callable con un timeout. Questo pacchetto è necessario per applicare i timeout del test in modalità rigorosa. [PHPUnit Install Instructions]

modalità rigorosa I test che non affermano nulla sono contrassegnati come incompleti di prova che sono incompleti (o saltati) cedere senza copertura del codice Slideshare by Sebastian Bergmann (slide 10)

Nota
prega di notare che PHPUnit inghiotte tutto l'output che è emesso durante l'esecuzione di un test. In modalità rigorosa, un test che emette l'output fallirà. Testing output section of PHPUnit Manual

+5

Modifica il tempo consentito per i test che esegui anche nel file phpunit.xml come descritto qui http://stackoverflow.com/a/13722524/1387163 –

31

Si prega di notare che PHPUnit ingoia tutto l'output che viene emesso durante l'esecuzione di un test . In modalità rigorosa, un test che emette l'output fallirà.

è tutto quello che sono riuscito a trovare nella documentazione, ma mi piacerebbe anche controllato le fonti e ho scoperto che in modalità rigorosa:

  1. test senza affermazioni potrebbero essere contrassegnati come incompleti/fallimenti.
  2. Ogni test può essere eseguito con un limite di tempo di esecuzione a seconda delle dimensioni e della presenza di pcntl extension e PHP_Invoker library. Ci sono tre valori timeout:

    • timeoutForSmallTests (valore di default: 1)
    • timeoutForMediumTests (predefinita: 10)
    • timeoutForLargeTests (valore di default: 60)

    Le dimensioni di prova (piccoli , medio o grande) è determinato dal metodo PHPUnit_Util_Test::getSize():

    • Test casi descendi ng da PHPUnit_Extensions_Database_TestCase o PHPUnit_Extensions_SeleniumTestCase sono grandi.
    • I test e i singoli test possono anche essere resi grandi o medi aggiungendoli al "grande" o al "medum" groups, rispettivamente.
    • In caso contrario, il test è di piccole dimensioni.

E 'Sembra che la modalità rigorosa non solo le suddette tre cambiamenti, ma non sono assolutamente sicuro di questo. Non ho mai studiato le origini di PHPUnit in precedenza, né ho usato la modalità strict.

+1

+1: Grazie per aver scavato i dettagli, molto apprezzato. – hakre