2012-08-30 12 views
13

Ho un problema quando si utilizza riga di comando per eseguire i test: se corro phpunit come questo:Non è possibile eseguire test di singolo con provider di dati in PHPUnit

phpunit -–no-configuration -–filter testAdd DataTest DataProviderTest.php 

funziona benissimo. Ma usiamo un'espressione regolare per specificare esattamente il nome del metodo che vogliamo testare:

phpunit -–no-configuration -–filter /::testAdd$/ DataTest DataProviderTest.php 

Il secondo approccio non funziona purtroppo. Il codice sorgente è:

<?php 
class DataTest extends PHPUnit_Framework_TestCase 
{ 
    /** 
    * @dataProvider provider 
    */ 
    public function testAdd($a, $b, $c) 
    { 
     $this->assertEquals($c, $a + $b); 
    } 

    public function provider() 
    { 
     return array(
      array(0, 0, 0), 
      array(0, 1, 1), 
      array(1, 0, 1), 
      array(1, 1, 3) 
     ); 
    } 
} 

?> 

risposta

1

In questo caso, l'espressione regolare viene confrontato con la seguente stringa:

DataTest::testAdd with data set #0 
DataTest::testAdd with data set #1 
... 

Così, naturalmente, la tua espressione regolare testAdd$ non funzionerà.

6

Come @sjoerd ha sottolineato il nome con cui viene confrontato contiene il numero del set di dati.

Ciò significa che questo funziona:

phpunit --filter "testAdd with data set #0" DataTest DataProviderTest.php 

contro il file produce:

PHPUnit 3.7.0RC1 by Sebastian Bergmann. 

. 

Time: 0 seconds, Memory: 5.25Mb 

OK (1 test, 1 assertion) 

provati in PHPUnit 3.5 e verso l'alto.


Non è davvero carino e avere un'altra sintassi per questo all'interno PHPUnit è sicuramente preferibile, ma per ora si potrebbe risolvere il tuo problema e una volta che qualcuno invia un PR sarà più piacevole da usare;)

Issue Tracking per la sintassi migliore sul phpunit github issue tracker

13

la regex per gestire prove con o senza set di dati è

phpunit --filter "/::<method>(with data set .*)?$/" <class> <file> 

Per esempio

phpunit --filter "/::testAdd(with data set .*)?$/" DataTest DataProviderTest.php 

Dal momento che un metodo di prova non avranno uno spazio nel nome se non ha un set di dati, si potrebbe davvero restringersi questo per

phpunit --filter "/::testAdd(.*)?$/" DataTest DataProviderTest.php 
+2

Bell'esempio! Si noti che il numero di set di dati potrebbe anche una stringa (nome dataproviders utilizzando le chiavi degli array nei set di dati) quindi \ d + potrebbe non catturare tutto, ma 'phpunit --filter"/:: test. + (con dat un insieme #. +)?$/"' o qualcosa è un ottimo modo per eseguire tutti i test con i fornitori di dati;) – edorian

+0

@edorian - Buona chiamata. L'ho cambiato in '. *' per catturare qualsiasi set di dati. –

+0

Penso che la nuova sintassi per '- -filter' è sempre più semplice https://phpunit.de/manual/current/en/textui.html#textui.examples.filter-patterns – martin

1

La regex nella risposta non è più sembra funzionare (almeno non in 4.0.12).

Sembra --Filter non piace lo spazio, e dà il seguente errore:

Fatal error: "preg_match(): Compilazione non riuscita: manca) all'offset

Questa è fissato da sostituire lo spazio con l \ le citazioni anche bisogno di ottenere rimosso (oppure la \ deve essere \)

phpunit --filter /::testAdd(\s.*)?$/ DataTest DataProviderTest.php 
+0

Hai perso le virgolette intorno alla regex per trattarlo come un singolo parametro sul comando- linea. –

Problemi correlati