Comment sauter des tests dans PHPunit?


88

J'utilise phpunit en relation avec jenkins et je souhaite ignorer certains tests en définissant la configuration dans le fichier XML phpunit.xml

Je sais que je peux utiliser sur la ligne de commande:

phpunit --filter testStuffThatBrokeAndIOnlyWantToRunThatOneSingleTest

comment puis-je traduire cela dans le fichier XML puisque la <filters>balise est uniquement pour la couverture de code?

Je souhaite exécuter tous les tests sauf testStuffThatAlwaysBreaks


1
KO: qu'en est-il de la fixation du test? btw, salut de welly ;-)
zerkms

Je n'ai pas écrit les tests, c'est quelque chose de non pertinent, et je ne veux pas non plus changer les fichiers de base
Filype

Vous pouvez certainement le faire. C'est une exigence très étrange
zerkms

PS: vous avez mentionné les filtres - mais cela ne pouvait pas vous aider, car cela exclut tout le chemin. Sinon <exclude>- ferait le travail pour vous
zerkms

pouvez-vous publier le fichier phpunit.xml.dist proposé?
Filype

Réponses:


167

Le moyen le plus rapide et le plus simple d'ignorer les tests qui sont interrompus ou sur lesquels vous devez continuer à travailler plus tard consiste simplement à ajouter ce qui suit en haut de votre test unitaire individuel:

$this->markTestSkipped('must be revisited.');

vous pouvez toujours ajouter des répertoires ou des tests au fichier de configuration xml, cependant, s'il s'agit d'un contrôleur ou similaire, ce n'est vraiment pas très pratique car vous avez probablement des dizaines d'autres tests dans ce fichier. Je suppose que si vous n'avez pas accès aux tests unitaires, je ne suis pas sûr de comprendre pourquoi, alors vous n'avez pas d'autre choix que d'exclure.
jsteinmann

5
Comme il s'agit d'une méthode statique (au moins dans PHPUnit 3), et que certaines classes utilisent un afaik de liaison statique tardive, vous devriez utiliser à la static::markTestSkipped('');place de $this->. Cela générera un avertissement dans les nouvelles versions de PHP. Signature: public static function markTestSkipped($message = '')
Daniel

Nécessite un meilleur exemple du fichier de test unitaire complet. Pas seulement un extrait.
Ligemer

@DanielW. le manuel officiel de phpunit a des exemples montrant$this->markTestSkipped()
nulll

@nulll que vous pouvez voir dans le code source de la version 6.5 , markTestSkipped()est toujours une méthode statique.
Daniel W.

30

Si vous pouvez ignorer tout le fichier, alors

<?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>

C'est ce que j'ai essayé, ça dit quand même 893 tests sans le <exclude>et 893 tests avec le<exclude>
Filype

1
Les tests durent environ 20 minutes, y a-t-il un moyen simple de voir combien de tests il va exécuter? actuellement, je dois attendre que la première ligne soit terminée....... 63 / 893 ( 7%)
Filype

5
@Filype: alors vous avez probablement spécifié le mauvais chemin. Cela fonctionne bien pour moi. Je ne sais pas s'il est possible d'obtenir le nombre de tests. PS: les tests unitaires ne devraient pas durer si longtemps. Je recommanderais d'utiliser des @groupannotations et des tests fractionnés de par leur nature
zerkms

20

Parfois, il est utile d'ignorer tous les tests d'un fichier particulier en fonction des conditions personnalisées définies en tant que code php. Vous pouvez facilement le faire en utilisant la fonction setUp dans laquelle makeTestSkipped fonctionne également.

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

your_custom_condition peut être passé via une méthode / propriété de classe statique, une constante définie dans le fichier de démarrage de phpunit ou même une variable globale.


Qu'est-ce qu'une Configclasse? Où dois-je le placer?
cronfy

@cronfy il peut s'agir de n'importe quelle classe accessible à la portée globale (modèle de conception Singleton / Register) ou même d'une variable globale définie dans le fichier de démarrage de phpunit. En gros, la logique est la suivante: if ($ testsFromThisFileShouldBeSkipped) {$ this-> markTestSkipped (...); }
Konrad Gałęzowski

supprimez le conditionnel et votre réponse serait simple ... "markTestSkipped dans la configuration pour ignorer le fichier entier"
SparK

1
@SparK Je vois votre point mais je fournissais un moyen de sauter conditionnel de toute la classe de test. Je l'ai un peu changé, supprimant ma façon habituelle de le faire en faveur de la règle générale.
Konrad Gałęzowski
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.