2010-04-29 6 views
24

Je suit, très simple, configuration XML pour PHPUnit:Comment exclure un fichier de la suite de tests PHPUnit dans une config xml?

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

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

+0

Êtes-vous en essayant d'éviter l'exécution d'un ou plusieurs de vos tests? –

+0

Oui, c'est exactement ce que j'essaie de faire. 1 classe de test = 1 fichier. –

Répondre

28

Il y a plusieurs façons de ne pas exécuter un test particulier - le mettre dans une liste noire de sorte qu'il n'a jamais exécuté peut-être pas la manière - comme changer cela signifie l'édition de la liste noire, et vous finirez souvent par rebondir dans et hors du contrôle de version.

Il existe plusieurs autres moyens qui peuvent être plus appropriés:

Si un test est pas encore prêt à fonctionner:

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

S'il y a une raison à l'extérieur il ne devrait pas être courir, le sauter:

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

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

Vous pouvez faire un test dépend d'un précédent suivant:

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'un des meilleurs moyens d'arrêter spécifiquement, ou exécuter un groupe de tests

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

testSomething() est maintenant en deux groupes, et si l'on ajoute 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 appartenant à un groupe particulier - par exemple, un nom après une fonctionnalité ou un rapport de bogue.

+0

"@group" était exactement ce que je cherchais. Merci! –

+0

Je souhaite que @group ait travaillé à l'intérieur du nœud de la suite de tests en plus du nœud phpunit dans la configuration. J'avais un test qui devait être exécuté avant qu'une variable statique ne soit définie pour tous les autres tests. J'ai donc mis ce test dans une classe de test séparée, avec le nom RunFirst.php et modifié ma configuration pour l'exécuter dans une suite tout seul, mais avant toutes les autres suites. – b01

+0

Merci pour @group! – timbroder

-4

Hé là, Assurez-vous de mettre vos exclusions dans la liste blanche. Exemple:

<phpunit> 
    <filter> 
     <blacklist> 
      <directory suffix=".php">/not/even/looked/at/</directory> 
     </blacklist> 
     <whitelist> 
      <directory suffix=".php">/path/to/test/dir/</directory> 
      <exclude> 
       <file suffix=".php">/path/to/fileToExclude.php</file> 
      </exclude> 
     </whitelist> 
    </filter> 
</phpunit> 

http://www.phpunit.de/manual/current/en/appendixes.configuration.html#appendixes.configuration.blacklist-whitelist

+13

Cela fonctionne uniquement pour la couverture de code, pas pour les tests eux-mêmes. –

6

Whit 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

+5

Où dans cette configuration excluez-vous les répertoires/fichiers? Les balises sont pour la couverture de code. –

4

Le phpunit documentation est un peu minimalistes en matière d'exclusion dans une suite de tests. Apparemment, seulement répertoires entiers peuvent être exclus mais pas fichiers individuels. Je serais très heureux d'avoir tort. La solution de contournement semble utiliser la fonctionnalité @group comme posted above par Alister Bulman.

C'est un peu difficile d'identifier chaque test dans les suites de tests que j'aimerais conserver.

15

Pour exclure le nom de fichier TestCase.php.

ajouter à 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 a real-live test-suite je peux le confirmer travailler:

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

cela fonctionne-t-il réellement pour vous? selon le commentaire précédent (http://stackoverflow.com/a/15632735/2314626) exclure les travaux pour les répertoires. votre configuration proposée échoue toujours avec: Aucun test trouvé dans la classe "TestCase". –

+0

@ ElanRuusamäe: Oui, cela fonctionne réellement. Ce * commentaire précédent * est en fait une réponse d'il y a des années qui demande même à être prouvée fausse. – hakre

+0

Confirmé. Peut-être que ça ne fonctionnait pas, mais c'est certainement le cas avec phpunit 5.3, en plus d'être la réponse la plus simple et la plus claire. – petercoles