2010-10-28 4 views
26

Da quello che ho letto, sembra che dovrei essere in grado di configurare una cartella, ad es. prova /, inserisce alcuni file in esso con le classi di test unitari, quindi esegue phpunit su quel file e fa in modo che trovi ed esegua i test.Come posso ottenere phpunit per eseguire test da tutti i file in una cartella?

Per qualsiasi motivo, nella mia installazione (su OS X), si pensa che il test delle cartelle/è un file, o almeno così sembrerebbe:

$ ls tests 
test1.php test2.php 
$ phpunit tests/test1.php 
PHPUnit 3.5.3 by Sebastian Bergmann. 

F 

Time: 0 seconds, Memory: 5.00Mb 

There was 1 failure: 

1) FailingTest::testFail 
Your test successfully failed! 

/Users/****/tmp/tests/test1.php:4 

FAILURES! 
Tests: 1, Assertions: 0, Failures: 1. 
$ phpunit tests/test2.php 
PHPUnit 3.5.3 by Sebastian Bergmann. 

. 

Time: 0 seconds, Memory: 5.00Mb 

OK (1 test, 1 assertion) 
$ phpunit tests 
PHP Fatal error: Uncaught exception 'PHPUnit_Framework_Exception' with message 'Neither "tests.php" nor "tests.php" could be opened.' in /usr/local/PEAR/PHPUnit/Util/Skeleton/Test.php:102 
Stack trace: 
#0 /usr/local/PEAR/PHPUnit/TextUI/Command.php(157): PHPUnit_Util_Skeleton_Test->__construct('tests', '') 
#1 /usr/local/PEAR/PHPUnit/TextUI/Command.php(129): PHPUnit_TextUI_Command->run(Array, true) 
#2 /usr/local/bin/phpunit(53): PHPUnit_TextUI_Command::main() 
#3 {main} 
    thrown in /usr/local/PEAR/PHPUnit/Util/Skeleton/Test.php on line 102 

Fatal error: Uncaught exception 'PHPUnit_Framework_Exception' with message 'Neither "tests.php" nor "tests.php" could be opened.' in /usr/local/PEAR/PHPUnit/Util/Skeleton/Test.php:102 
Stack trace: 
#0 /usr/local/PEAR/PHPUnit/TextUI/Command.php(157): PHPUnit_Util_Skeleton_Test->__construct('tests', '') 
#1 /usr/local/PEAR/PHPUnit/TextUI/Command.php(129): PHPUnit_TextUI_Command->run(Array, true) 
#2 /usr/local/bin/phpunit(53): PHPUnit_TextUI_Command::main() 
#3 {main} 
    thrown in /usr/local/PEAR/PHPUnit/Util/Skeleton/Test.php on line 102 

ho quello che mi auguro è un'installazione abbastanza standard di phpunit via PEAR, seguendo queste istruzioni http://www.newmediacampaigns.com/page/install-pear-phpunit-xdebug-on-macosx-snow-leopard, su OS X Snow Leopard.

$ pear version 
PEAR Version: 1.9.1 
PHP Version: 5.3.2 
Zend Engine Version: 2.3.0 
Running on: **** 10.4.0 Darwin Kernel Version 10.4.0: Fri Apr 23 18:28:53 PDT 2010; root:xnu-1504.7.4~1/RELEASE_I386 i386 
$ phpunit --version 
PHPUnit 3.5.3 by Sebastian Bergmann. 

Sto sperando che qualcuno altro là fuori ha funzionato in questa edizione ed è solo una semplice correzione, altrimenti sto solo facendo qualcosa di sbagliato?

+1

Grazie , ma l'ho capito (vedi la mia risposta). Poiché mi hai collegato al tracker dei problemi, inserirò un ticket per verificare se aggiorneranno la loro documentazione. – jsdalton

risposta

52

Non è un bug, è una funzionalità.

Hai una directory piena di file .php, nel tuo caso contengono tutti i testicoli.

Tuttavia, con la crescita della suite di test, è probabile che si desideri avere altri file php nella directory di test, file che non contengono test, che esistono esclusivamente per supportare i test. Quei file non dovrebbero mai essere eseguiti da PHPUnit stesso.

Questo è uno scenario molto comune.

Quindi, come fa PHPUnit a sapere quali file devono essere eseguiti e quali no? Controllare il suffisso del nome del file è un'opzione per farlo - per impostazione predefinita PHPUnit considera tutto come un nome che termina con Test.php come test e ignora tutto il resto.

È possibile modificare questo comportamento, se si vuole veramente - con la creazione di un file denominato phpunit.xml nella directory test con il seguente contenuto

<?xml version="1.0" encoding="utf-8" ?> 
<phpunit> 
<testsuite name='Name your suite'> 
    <directory suffix='.php'>./</directory> 
</testsuite> 
</phpunit> 

Una volta che avete fatto, PHPUnit verrà eseguito tutti i file con '.php' alla fine del nome del file (in questo contesto l'estensione del file è considerata parte del nome del file)

Ma è davvero meglio abituarsi alla convenzione e nominare di conseguenza i test.

+5

Concordato. Non penso che il comportamento di phpunit fosse scorretto, è solo che questo requisito non è stato reso esplicito nella documentazione da nessuna parte, e quindi sono stato risucchiato in una tana di coniglio cercando di capirlo per circa un'ora. Ho archiviato un biglietto e il manutentore ha già inviato una patch alla documentazione che la chiarisce. – jsdalton

+0

Ottimo, i miglioramenti della documentazione sono sempre utili :) –

19

Un fastidioso fastidioso, ma l'ho capito.

Almeno con la configurazione predefinita, i file di test devono terminare con "Test.php", ad es. fooTest.php, o non vengono trovati dal test runner.

+5

questo dovrebbe essere scritto in grassetto e rosso nel manuale di PhpUnit – hkarask

+2

Potrebbe non essere in grassetto ma è il primo punto del primo test di esempio nei documenti. "1. I test per una classe di classe entrano in una classe ClassTest." http://phpunit.de/manual/current/en/phpunit-book.html#writing-tests-for-phpunit –

17

Il modo più semplice per l'esecuzione di test sul dispositivo di piegatura è di aggiungere "Test.php" alla fine tutti i test ed eseguire phpunit specificando la cartella come questo

phpunit . 

o

phpunit your_test_folder/. 
+1

se non vuoi che il tuo nome del file termini con 'Test.php' nella cartella, puoi eseguire con' --test-suffix = anything.php' per sovrascriverlo. – checksum