¿Cómo omitir pruebas en PHPunit?

88

Estoy usando phpunit en relación con jenkins y quiero omitir ciertas pruebas estableciendo la configuración en el archivo XML phpunit.xml

Sé que puedo usar en la línea de comando:

phpunit --filter testStuffThatBrokeAndIOnlyWantToRunThatOneSingleTest

¿Cómo traduzco eso al archivo XML ya que la <filters>etiqueta es solo para cobertura de código?

Me gustaría ejecutar todas las pruebas excepto testStuffThatAlwaysBreaks

Filype
fuente
1
KO: ¿qué hay de arreglar la prueba? por cierto, hola de welly ;-)
zerkms
No escribí las pruebas, es algo irrelevante y tampoco quiero cambiar los archivos principales
Filype
Dudo que puedas hacerlo. Es un requisito muy extraño
zerkms
PD: mencionaste filtros, pero no pudo ayudarte, porque excluye toda la ruta. De <exclude>lo contrario , haría el trabajo por usted
zerkms
¿Puede publicar el archivo phpunit.xml.dist propuesto?
Filype

Respuestas:

167

La forma más rápida y fácil de omitir las pruebas que están rotas o en las que necesita continuar trabajando más tarde es simplemente agregar lo siguiente al principio de su prueba de unidad individual:

$this->markTestSkipped('must be revisited.');
jsteinmann
fuente
siempre puede agregar directorios o pruebas al archivo de configuración xml, sin embargo, si se trata de un controlador o similar, eso no es muy práctico porque probablemente tenga docenas de otras pruebas en ese archivo. Supongo que si no tiene acceso a las pruebas unitarias, no estoy seguro de entender por qué, entonces no tiene otra opción que excluir.
jsteinmann
5
Como es un método estático (al menos en PHPUnit 3), y algunas clases usan afaik de enlace estático tardío, debe usar en static::markTestSkipped('');lugar de $this->. Generará una advertencia en las versiones más recientes de PHP. Firma: public static function markTestSkipped($message = '')
Daniel W.
Necesita un mejor ejemplo del archivo de prueba unitario completo. No solo un fragmento.
Ligemer
@DanielW. el manual oficial de phpunit tiene ejemplos que muestran$this->markTestSkipped()
nulll
@nulll que puede ver en el código fuente de 6.5 , markTestSkipped()sigue siendo un método estático.
Daniel W.
30

Si puede lidiar con ignorar todo el archivo, entonces

<?xml version="1.0" encoding="UTF-8"?>

<phpunit>

    <testsuites>
        <testsuite name="foo">
            <directory>./tests/</directory>
            <exclude>./tests/path/to/excluded/test.php</exclude>
                ^-------------
        </testsuite>
    </testsuites>

</phpunit>
zerkms
fuente
Esto es lo que probé, todavía dice 893 pruebas sin el <exclude>y 893 pruebas con el<exclude>
Filype
1
Las pruebas tardan unos 20 minutos en ejecutarse, ¿hay alguna manera fácil de ver cuántas pruebas se ejecutarán? actualmente, tengo que esperar hasta que se complete la primera fila....... 63 / 893 ( 7%)
Filype
5
@Filype: entonces probablemente especificó la ruta incorrecta. Funciona bien para mi No estoy seguro de si es posible contar las pruebas. PD: las pruebas unitarias no deberían durar tanto. Recomendaría usar @groupanotaciones y pruebas divididas por su naturaleza
zerkms
20

A veces es útil omitir todas las pruebas de un archivo en particular según las condiciones personalizadas definidas como código php. Puede hacerlo fácilmente usando la función setUp en la que también funciona makeTestSkipped.

protected function setUp()
{
    if (your_custom_condition) {
        $this->markTestSkipped('all tests in this file are invactive for this server configuration!');
    }
}

your_custom_condition se puede pasar a través de algún método / propiedad de clase estática, una constante definida en el archivo de arranque de phpunit o incluso una variable global.

Konrad Gałęzowski
fuente
¿Qué es una Configclase? ¿Dónde lo coloco?
cronfy
@cronfy puede ser cualquier clase accesible de alcance global (patrón de diseño Singleton / Register) o incluso una variable global establecida en el archivo bootstrap en phpunit. Básicamente, la lógica es: if ($ testsFromThisFileShouldBeSkipped) {$ this-> markTestSkipped (...); }
Konrad Gałęzowski
elimine el condicional y su respuesta sería sencilla ... "markTestSkipped dentro de la configuración para omitir el archivo completo"
SparK
1
@SparK Veo su punto, pero estaba proporcionando una forma de omitir condicionalmente toda la clase de prueba. Lo cambié un poco, eliminando mi forma personalizada de hacerlo a favor de la regla general.
Konrad Gałęzowski