web-dev-qa-db-fra.com

Comment exclure un fichier de la suite de tests PHPUnit dans la configuration xml?

J'ai une configuration XML très simple pour PHPUnit:

<phpunit bootstrap="/_tests/TestAutoload.php">
    <testsuites>
        <testsuite name="Unit Tests">
            <directory suffix=".php">_tests</directory>
        </testsuite>
    </testsuites>
</phpunit>

Comment exclure certains fichiers de ce répertoire de la suite de tests? J'ai essayé <exclude> et <blacklist>, mais cela ne semble pas fonctionner dans ce contexte. Je n'ai pas pu trouver d'autre documentation que phpunit.de one, qui ne mentionne rien à ce sujet. Sinon, cette config fonctionne parfaitement.

39
Ondrej Slinták

Il existe un certain nombre de façons de ne pas exécuter un test particulier - le placer dans une liste noire afin qu'il ne soit jamais exécuté peut ne pas être le moyen - car le modifier signifie éditer la liste noire, et vous finirez souvent par le faire rebondir dans et hors du contrôle de version .

Il existe plusieurs autres méthodes qui peuvent être plus appropriées:

Si un test n'est pas encore prêt à être exécuté:

$this->markTestIncomplete('This test has not been implemented yet.');

S'il y a une raison extérieure à ne pas l'exécuter, sautez-la:

if (!extension_loaded('mysqli')) {
    $this->markTestSkipped('The MySQLi extension is not available.');
}

Vous pouvez également mettre cela dans la fonction setUp(), donc il sautera tous les tests dans une classe de test.

Vous pouvez faire dépendre un test de la réussite d'un test précédent:

public function testEmpty()
{
    $stack = array();
    $this->assertTrue(empty($stack));
    return $stack;   // also sends this variable to any following tests - if this worked
}
/**
 * only runs if testEmpty() passed
 *
 * @depends testEmpty
 */
public function testPush(array $stack)
{
}

L'annotation @group -name- est l'une des meilleures façons d'arrêter spécifiquement ou d'exécuter un groupe de tests

/**
 * @group database
 * @group remoteTasks
 */
public function testSomething()
{
}

testSomething() est maintenant dans deux groupes, et si l'un ou l'autre est ajouté sur la ligne de commande (ou dans le config.xml) --exclude-group paramètre. il ne sera pas exécuté. De même, vous ne pouvez exécuter que des tests qui appartiennent à un groupe particulier - par exemple nommé d'après une fonctionnalité ou un rapport de bogue.

39
Alister Bulman

Pour exclure le nom de fichier TestCase.php.

ajoutez ceci à votre phpunit.xml

<testsuites>
    <testsuite name="BLABLA">
        <directory suffix=".php">./tests</directory>
        <exclude>./tests/TestCase.php</exclude>
    </testsuite>
</testsuites>

Voici un extrait supplémentaire de ne suite de tests en direct Je peux confirmer qu'elle fonctionne avec:

...
    <testsuites>
        <testsuite name="n98-magerun-tests">
            <directory>./tests</directory>
            <exclude>tests/N98/Magento/Command/Installer/UninstallCommandTest.php</exclude>
        </testsuite>
    ...
38
Mahmoud Zalt

Avec ce fichier de configuration PHPUnit, j'ai fait de très bonnes expériences.

<?xml version="1.0" encoding="UTF-8"?>
<phpunit
    convertErrorsToExceptions="true"
    convertNoticesToExceptions="true"
    convertWarningsToExceptions="true"
    colors="true"
    processIsolation="true"
    stopOnFailure="true"
    syntaxCheck="false"
    backupGlobals="false"
    bootstrap="test-bootstrap.php">
    <testsuites>
        <testsuite name="php-dba-cache">
          <directory suffix="Test.php">tests</directory>
        </testsuite>
    </testsuites>
    <logging>
        <log type="coverage-html"
             target="build/coverage"
             charset="UTF-8"
             yui="true"
             highlight="true"
             lowUpperBound="35"
             highLowerBound="70"/>
   </logging>
    <filter>
        <whitelist addUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">src</directory>
            <exclude>
             <file>test-bootstrap.php</file>
            </exclude>
        </whitelist>
    </filter>
</phpunit>

https://github.com/gjerokrsteski/php-dba-cache

8
gjerokrsteski

documentation phpunit est un peu minimaliste en ce qui concerne l'exclusion dans une suite de tests. Apparemment, seuls des répertoires entiers peuvent être exclus mais pas les fichiers individuels . Je serais très heureux d'avoir tort. La solution de contournement semble utiliser la fonctionnalité @group comme publiée ci-dessus par Alister Bulman.

C'est un peu pénible de devoir marquer chaque test dans les suites de tests que j'aimerais conserver.

4
Bernhard Wagner

Pour Phpunit 6.5, exclude est sous whitelist

<filter>
    <whitelist>
        <directory suffix=".php">src</directory>
        <exclude>
            <directory>src/Migrations</directory>
            <file>src/kernel.php</file>
        </exclude>
    </whitelist>
</filter>
4
goto

En plus des solutions ci-dessus, vous pouvez utiliser un flux de travail de test davantage axé sur l'architecture où vous gérez vos tests, répertoires et suites de tests à partir de phpunit.xml comme ça:

  • Regroupez vos tests dans les répertoires (par exemple tests/Unit, tests/Feature);
  • Faites des suites de tests comme vous le souhaitez en regroupant vos répertoires avec <testsuite> élément;
  • Créez une suite de tests All qui combine tous les tests par défaut que vous exécuteriez en tant que suite de tests complète et affectez-la via defaultTestSuite="All" touche dans <phpunit> élément.
  • Créez une suite de tests Tinker dédiée avec des tests que vous pourriez utiliser pour bricoler, conserver des exemples de tests, etc. que vous excluriez du flux de travail de test normal. Ne l'incluez pas dans la suite de tests All.

Vous pourrez ainsi:

  • utilisez la commande CLI phpunit pour toujours exécuter les tests All par défaut.
  • utilisez CLI pour filtrer la suite de tests, le fichier de test ou le niveau de test unique pour n'importe laquelle de vos suites de tests, par exemple :
    • phpunit --testsuite SuiteOne,
    • phpunit --filter SomeTest ou
    • phpunit --filter SomeTest::test_some_test_method
    • combiner --testsuite avec --filter arguments

Associez ce flux de travail à la possibilité d'exécuter le test ou le fichier de test actuel à partir de votre IDE (pour Sublime Text il y a Mac et Linux/Windows plugins) et vous serez complètement équipé pour choisir instantanément le test à exécuter.

2
Valentine Shi