2012-08-30 16 views
13

Tengo un problema cuando se utiliza la línea de comandos para ejecutar las pruebas: si me quedo PHPUnit así:No se puede ejecutar una sola prueba con el proveedor de datos en PHPUnit

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

funciona bien. Pero usamos una expresión regular para especificar exactamente el nombre del método que se quiere ensayar:

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

El segundo enfoque no funciona por desgracia. El código fuente es:

<?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) 
     ); 
    } 
} 

?> 

Respuesta

1

En este caso, la expresión regular se compara con la siguiente cadena:

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

Así que, naturalmente, su expresión regular testAdd$ no va a funcionar.

6

Al igual que @sjoerd, señaló que el nombre que se compara con contiene el número del conjunto de datos.

Eso significa que este funciona:

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

contra su archivo produce:

PHPUnit 3.7.0RC1 by Sebastian Bergmann. 

. 

Time: 0 seconds, Memory: 5.25Mb 

OK (1 test, 1 assertion) 

probados en PHPUnit 3,5 y hacia arriba.


no es realmente bonita y tener otra sintaxis para esto dentro de PHPUnit es sin duda preferible, pero por ahora se podría resolver su problema y una vez que alguien envía un PR será más agradable de usar;)

seguimiento de problemas para la sintaxis más agradable en la phpunit github issue tracker

13

la expresión regular para manejar pruebas con o sin los conjuntos de datos es

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

Por ejemplo

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

Desde un método de prueba no tendrá un espacio en el nombre a menos que tenga un conjunto de datos, que realmente podría reducir esto a

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

ejemplo agradable! Tenga en cuenta que el número de datos también podría una cadena (dataproviders nombre propio utilizando claves de matriz en los conjuntos de datos) así que \ d + podría no captar todo. Pero 'phpunit --filter"/:: test. + (con dat un conjunto #. +)?$/"' o algo así como una manera genial de ejecutar todas las pruebas con los proveedores de datos;) – edorian

+0

@edorian - Buena llamada. Lo cambié a '. *' para capturar cualquier conjunto de datos. –

+0

Creo que la nueva sintaxis para '- -filter' es cada vez más fácil https://phpunit.de/manual/current/en/textui.html#textui.examples.filter-patterns – martin

1

la expresión regular en la respuesta ya no se parece funcionar (al menos no en 4.0.12).

Parece que --filter no le gusta el espacio, y da el siguiente error:

Fatal error: "preg_match(): Compilación falló: falta) en el desplazamiento

Esto se corrige reemplazando el espacio con \ T las citas también tienen que quedar eliminado (o bien el \ tiene que ser \)

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

Has omitido las comillas alrededor de la expresión regular para tratarlo como un parámetro único en el comando- línea. –

Cuestiones relacionadas