Comment exécuter une méthode de test unique avec phpunit?


335

J'ai du mal à exécuter une seule méthode de test nommée testSaveAndDropdans le fichier escalation/EscalationGroupTest.phpavec phpunit. J'ai essayé les combinaisons suivantes:

phpunit EscalationGroupTest escalation/EscalationGroupTest.php --filter=escalation/EscalationGroupTest.php::testSaveAndDrop
phpunit EscalationGroupTest escalation/EscalationGroupTest.php --filter=EscalationGroupTest.php::testSaveAndDrop
phpunit EscalationGroupTest escalation/EscalationGroupTest.php --filter=EscalationGroupTest::testSaveAndDrop
phpunit EscalationGroupTest escalation/EscalationGroupTest.php --filter=testSaveAndDrop

Dans chaque cas, toutes les méthodes de test du fichier escalation/EscalationGroupTest.phpsont exécutées. Comment sélectionner une seule méthode à la place?

Le nom de la classe est EscalationGroupTestet la version de phpunitest 3.2.8.


Quel est le nom de classe de votre classe de test?
sectus

Réponses:


459

La commande suivante exécute le test sur une seule méthode:

phpunit --filter testSaveAndDrop EscalationGroupTest escalation/EscalationGroupTest.php

phpunit --filter methodName ClassName path/to/file.php

Pour les nouvelles versions de phpunit, c'est juste:

phpunit --filter methodName path/to/file.php

1
La rédaction de EscalationGroupTest est-elle requise? Quelle en est l'utilité?
mujaffars

2
Ok j'ai compris c'est le nom de la classe
mujaffars

15
Il exécutera également la méthode de test avec le nom testSaveAndDrop * (exemple: testSaveAndDropSomething). Pour exécuter exactement testSaveAndDrop, utilisez --filter '/ :: testSaveAndDrop $ /'
Farid Movsumov

1
@mujaffars J'en doute, "je l'ai eu" n'est pas un identifiant valide en php en raison de l'espace.
Jon McClung

2
Ça ne marche plus maintenant. C'est juste phpunit --filter methodName path/to/testing/filenon ClassName .
CJ Dennis

213

Je préfère marquer le test dans l'annotation comme

/**
 * @group failing
 * Tests the api edit form
 */
public function testEditAction()

Ensuite, exécutez-le avec

phpunit --group failing

Pas besoin de spécifier le chemin complet dans la ligne de commande, mais vous devez vous rappeler de le supprimer avant de valider, pour ne pas encombrer le code.

Vous pouvez également spécifier plusieurs groupes pour un seul test

/**
  * @group failing
  * @group bug2204 
  */
public function testSomethingElse()
{
}

4
J'aime cette méthode, est-il possible d'affecter plusieurs groupes via l'annotation? @group failing, Integration
Dizzy Bryan High

4
Oui bien sûr. Mais pas séparés par des virgules. Modifié la réponse pour illustrer cela.
iamtankist

J'aime mieux cette méthode ... pour référence, l'élément <groups> dans phpunit.xml peut également être utilisé pour filtrer les tests ... utilisez quelque chose comme ceci juste sous <phpunit>: <groups><include> <group> failing </ group > </include> </groups>
Nicolas Galler

2
Mais la question était - d'exécuter le test UNIQUE. De plus, le groupe nommé failing est le pire que vous puissiez utiliser. Parce qu'après l'échec de certains tests, vous pouvez exécuter phpunit --group à défaut d'exécuter les tests ayant échoué sans leur donner le groupe. C'est confu.
Rafał Mnich

La meilleure réponse! il n'y a AUCUN test au cas où il proviendrait @dependsd'un autre, vous devez donc localiser tous les tests interconnectés et donc utiliser l' @groupannotation.
centurien

117

Voici la réponse la plus générique:

Si vous êtes sûr que le nom de la méthode est unique, vous ne pouvez filtrer que par nom de méthode (cela fonctionne pour moi)

phpunit --filter {TestMethodName}

Cependant, il est plus sûr de spécifier également le chemin / la référence du fichier

phpunit --filter {TestMethodName} {FilePath}

Exemple:

phpunit --filter testSaveAndDrop reference/to/escalation/EscalationGroupTest.php

Note rapide: j'ai remarqué que si j'ai une fonction nommée testSaveet qu'une autre fonction nommée à l' testSaveAndDropaide de la commande phpunit --filter testSaves'exécutera également testSaveAndDropet que toute autre fonction commençant par testSave*, c'est bizarre !!


4
Ce n'est pas bizarre du tout, c'est essentiellement une correspondance de sous-chaîne. Si vous voulez ce comportement, utilisez le jeton de fin de chaîne:/testSave$/
Christian

Que se passe-t-il si vous souhaitez uniquement spécifier le chemin du fichier pour que tous les tests de ce fichier soient exécutés?
still_dreaming_1

48

La commande suivante exécutera exactement le testSaveAndDrop test.

phpunit --filter '/::testSaveAndDrop$/' escalation/EscalationGroupTest.php

4
N'a pas travaillé pour moi. En utilisant au \blieu de $finalement fait l'affaire: --filter '/::testSaveAndDrop\b/'.
Joe

1
Les deux noms de méthode se terminent '/::testSaveAndDrop\b/'et '/::testSaveAndDrop$/'fonctionnent pour moi comme ça phpunit --filter ClassName::methodName$et phpunit --filter ClassName::methodName\b(sous Linux)
Valentine Shi

22

pour exécuter le test phpunit dans laravel de plusieurs façons ..

vendor/bin/phpunit --filter methodName className pathTofile.php

vendor/bin/phpunit --filter 'namespace\\directoryName\\className::methodName'

pour test classe unique:

vendor/bin/phpunit --filter  tests/Feature/UserTest.php
vendor/bin/phpunit --filter 'Tests\\Feature\\UserTest'
vendor/bin/phpunit --filter 'UserTest' 

pour la méthode d'essai unique:

 vendor/bin/phpunit --filter testExample 
 vendor/bin/phpunit --filter 'Tests\\Feature\\UserTest::testExample'
 vendor/bin/phpunit --filter testExample UserTest tests/Feature/UserTest.php

pour exécuter des tests de toutes les classes dans l'espace de noms:

vendor/bin/phpunit --filter 'Tests\\Feature'

pour plus de test de fonctionnement, voir plus


21

Donc, quelque chose comme ça

phpunit --filter 'EscalationGroupTest::testSaveAndDrop' EscalationGroupTest escalation/EscalationGroupTest.php 

Sans =et avec'

https://phpunit.de/manual/3.7/en/textui.html


Non, cela ne fonctionne pas. Tous les tests de la classe EscalationGroupTestsont en cours de traitement.
Alex

Les 9 tests sont toujours en cours. phpunit version 3.2.8
Alex

2
Déplacez le --filteravant le nom de fichier et les choses devraient fonctionner correctement.
Schleis

A travaillé pour moi sur PHPUnit 4.8.10
Asaph

Cela me donne No tests executed!sur PHPUnit 4.8.35 @Schleis Comment avez-vous changé la commande exactement?
Andru

14
  • Exécutez cela dans le répertoire racine de votre projet que j'utilise dans le répertoire racine de laravel.

vendor/bin/phpunit --filter 'Your method name'

Exemple avec un nom de méthode personnalisé.

 /** @test //Initilize this for custom method name, without test keyword
  *  
  * Test case For Dashboard When User Not logged In it will redirect To login page
  */
  public function only_logged_in_user_see_dashboard()
  {
    $response = $this->get('/dashboard')
                   ->assertRedirect('/login');
  }

Exemple avec mot-clé test

/**
* A basic test example.
*
* @return void
*/
 public function testBasicTest()
 {
  $this->assertTrue(true);
 }

1
Bien sûr, je suis un débutant, j'essaierai maintenant un code plus spécifique sur les réponses à venir
Connectify_user

7

Si vous êtes dans des netbeans, vous pouvez cliquer avec le bouton droit dans la méthode de test et cliquer sur «Exécuter la méthode de test ciblée».

Menu Exécuter la méthode de test ciblée


7

Vous pouvez essayer cela, je peux exécuter des cas de test uniques

phpunit tests/{testfilename}

Par exemple:

phpunit tests/StackoverflowTest.php

Si vous souhaitez exécuter des cas de test uniques dans Laravel 5.5 Essayez

vendor/bin/phpunit tests/Feature/{testfilename} 

vendor/bin/phpunit tests/Unit/{testfilename} 

Par exemple:

vendor/bin/phpunit tests/Feature/ContactpageTest.php 

vendor/bin/phpunit tests/Unit/ContactpageTest.php

La question était de savoir comment exécuter la
méthode de

4

La raison pour laquelle tous vos tests sont exécutés est que vous avez l' --filterindicateur après le nom du fichier. PHPUnit ne lit pas du tout les options et exécute donc tous les cas de test.

Depuis l'écran d'aide:

 Usage: phpunit [options] UnitTest [UnitTest.php]
        phpunit [options] <directory>

--filterDéplacez donc l' argument avant le fichier de test souhaité, comme mentionné dans les réponses @Alex et @Ferid Mövsümov. Et vous ne devriez avoir que le test que vous souhaitez exécuter.


Je ne pense pas que cela réponde à la question d'origine ... J'ai eu le même problème de devoir exécuter un seul des tests dans un fichier contenant de nombreux tests unitaires, et les deux autres réponses utilisant des filtres ont fonctionné pour moi
jfoo

@jfoo L'un des problèmes avec les commandes de l'OP était que l' --filteroption se trouvait après le nom du fichier. Les deux autres réponses avaient la bonne réponse mais n'ont pas précisé pourquoi le filtre était appliqué.
Schleis


1

Mais je suis en retard à la fête. Mais en tant que personnel, je déteste écrire toute la ligne.

Au lieu de cela, j'utilise les raccourcis suivants dans le fichier .bash_profile assurez-vous de source .bash_profile le fichier après avoir ajouté un nouvel alias sinon cela ne fonctionnera pas.

alias pa="php artisan"
alias pu="vendor/bin/phpunit" 
alias puf="vendor/bin/phpunit --filter"

Usage:

puf function_name

puf filename

Si vous utilisez Visual Studio Code, vous pouvez utiliser le package suivant pour simplifier vos tests.

Package Name: Better PHPUnit
Link: https://marketplace.visualstudio.com/items?itemName=calebporzio.better-phpunit

Vous pouvez ensuite définir la liaison de touches dans les paramètres. J'utilise la liaison Command + T dans mon MAC.

Maintenant, une fois que vous placez votre curseur sur une fonction , puis utilisez la liaison de touches, il exécutera automatiquement ce test unique.

Si vous devez exécuter la classe entière , placez le curseur sur la classe, puis utilisez la liaison de clé.

Si vous avez d'autres choses, tweekez toujours avec le terminal

Codage heureux!


0

Vous devez utiliser --filter pour exécuter une seule méthode de test php phpunit --filter "/::testMethod( .*)?$/" ClassTest ClassTest.php

Le filtre ci-dessus exécutera testMethod seul.

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.