Wie führe ich eine einzelne Testmethode mit phpunit aus?

334

Ich habe Probleme, eine einzelne Testmethode auszuführen, die testSaveAndDropin der Datei escalation/EscalationGroupTest.phpmit benannt ist phpunit. Ich habe folgende Kombinationen ausprobiert:

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

In jedem Fall werden alle Testmethoden in der Datei escalation/EscalationGroupTest.phpausgeführt. Wie wähle ich stattdessen nur EINE Methode aus?

Der Name der Klasse ist EscalationGroupTestund die Version von phpunitist 3.2.8.

Alex
quelle
Wie lautet der Klassenname Ihrer Testklasse?
Sekte

Antworten:

458

Der folgende Befehl führt den Test mit einer einzelnen Methode aus:

phpunit --filter testSaveAndDrop EscalationGroupTest escalation/EscalationGroupTest.php

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

Für neuere Versionen von phpunit gilt Folgendes:

phpunit --filter methodName path/to/file.php
Alex
quelle
1
War das Schreiben von EscalationGroupTest erforderlich? Was nützt es?
Mujaffars
2
Ok, ich habe es ist der Klassenname
Mujaffars
15
Es wird auch eine Testmethode mit dem Namen testSaveAndDrop * (Beispiel: testSaveAndDropSomething) ausgeführt. Um genau testSaveAndDrop auszuführen, verwenden Sie --filter '/ :: testSaveAndDrop $ /'
Farid Movsumov
1
@mujaffars Ich bezweifle es, "Ich habe es" ist aufgrund des Leerzeichens keine gültige Kennung in PHP.
Jon McClung
2
Das funktioniert jetzt nicht. Es ist nur phpunit --filter methodName path/to/testing/filenein ClassName .
CJ Dennis
213

Ich bevorzuge es, den Test in Anmerkungen als zu markieren

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

Dann laufe es mit

phpunit --group failing

Sie müssen den vollständigen Pfad nicht in der Befehlszeile angeben, müssen ihn jedoch vor dem Festschreiben entfernen, um den Code nicht zu überladen.

Sie können auch mehrere Gruppen für einen einzelnen Test angeben

/**
  * @group failing
  * @group bug2204 
  */
public function testSomethingElse()
{
}
iamtankist
quelle
4
Ich mag diese Methode. Ist es möglich, mehrere Gruppen über die Anmerkung zuzuweisen? @group failing, Integration
Dizzy Bryan High
4
Ja natürlich. Aber nicht durch Kommas getrennt. Die Antwort wurde bearbeitet, um dies zu veranschaulichen.
iamtankist
Ich mag diese Methode besser ... als Referenz kann das <groups> -Element in phpunit.xml auch zum Filtern der Tests verwendet werden ... verwenden Sie Folgendes wie folgt <phpunit>: <groups> <include> <group> failed </ group > </ include> </ group>
Nicolas Galler
2
Aber die Frage war - einen einzigen Test durchzuführen. Außerdem ist eine Gruppe mit dem Namen "Fehler" die schlechteste, die Sie verwenden können. Denn nachdem einige Tests fehlgeschlagen sind, können Sie phpunit --group ausführen, ohne die fehlgeschlagenen Tests auszuführen, ohne ihnen die Gruppe zu geben. Es ist verwirrend.
Rafał Mnich
Die beste Antwort! Es gibt KEINEN EINZELNEN Test, falls er @dependsvon einem anderen stammt. Sie müssen also alle miteinander verbundenen Tests genau bestimmen und daher die @groupAnmerkung verwenden.
Centurian
116

Hier ist die allgemeinere Antwort:

Wenn Sie sicher sind, dass der Methodenname eindeutig ist, können Sie nur nach Methodennamen filtern (dies funktioniert bei mir).

phpunit --filter {TestMethodName}

Es ist jedoch sicherer, auch den Dateipfad / die Referenz anzugeben

phpunit --filter {TestMethodName} {FilePath}

Beispiel:

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

Kurze Anmerkung: Ich habe bemerkt , dass , wenn ich eine Funktion mit dem Namen habe testSaveund eine andere Funktion namens testSaveAndDropBefehl phpunit --filter testSaveauch ausführen testSaveAndDropund andere Funktion, die beginnt mit testSave*, es ist seltsam !!

Mahmoud Zalt
quelle
4
Es ist überhaupt nicht seltsam, es ist im Grunde ein Teilstring-Match. Wenn Sie dieses Verhalten wollen, verwenden Sie das Ende des String-Tokens:/testSave$/
Christian
Was ist, wenn Sie nur den Dateipfad angeben möchten, damit alle Tests in dieser Datei ausgeführt werden?
still_dreaming_1
48

Der folgende Befehl führt den Test genau aus testSaveAndDrop .

phpunit --filter '/::testSaveAndDrop$/' escalation/EscalationGroupTest.php
Farid Movsumov
quelle
4
Hat bei mir nicht funktioniert. Verwenden \bstatt $endlich hat den Trick getan : --filter '/::testSaveAndDrop\b/'.
Joe
1
Beide Methodennamen enden '/::testSaveAndDrop\b/'und '/::testSaveAndDrop$/'funktionierten für mich so phpunit --filter ClassName::methodName$und phpunit --filter ClassName::methodName\b(unter Linux)
Valentine Shi
22

für Run Phpunit Test in Laravel in vielerlei Hinsicht ..

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

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

für Test einzelne Klasse:

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

für Test einzelne Methode:

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

für Lauftests aller Klassen im Namespace:

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

Weitere Informationen zum Test finden Sie unter mehr

Jignesh Joisar
quelle
21

Also so etwas

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

Ohne =und mit'

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

Sekte
quelle
Nein, das funktioniert nicht. Alle Tests in der Klasse EscalationGroupTestwerden verarbeitet.
Alex
Es werden noch alle 9 Tests ausgeführt. PHPUNIT Version 3.2.8
Alex
2
Verschieben Sie das --filternach vor den Dateinamen und die Dinge sollten richtig funktionieren.
Schleis
Arbeitete für mich an PHPUnit 4.8.10
Asaph
Dies gibt mir No tests executed!auf PHPUnit 4.8.35 @Schleis Wie genau haben Sie den Befehl geändert?
Andru
13
  • Führen Sie dies in Ihrem Projektstammverzeichnis aus, das ich im Laravel-Stammverzeichnis verwende.

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

Beispiel mit benutzerdefiniertem Methodennamen.

 /** @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');
  }

Beispiel mit Testschlüsselwort

/**
* A basic test example.
*
* @return void
*/
 public function testBasicTest()
 {
  $this->assertTrue(true);
 }
Connectify_user
quelle
1
Seien Sie genauer, was Ihr Code tut.
Papadopoulos
1
Sicher, ich bin ein Anfänger und werde jetzt einen genaueren Code für bevorstehende Antworten ausprobieren
Connectify_user
7

Wenn Sie sich in Netbeans befinden, können Sie mit der rechten Maustaste auf die Testmethode klicken und auf "Fokussierte Testmethode ausführen" klicken.

Führen Sie das Menü Fokussierte Testmethode aus

Tony
quelle
7

Sie können dies versuchen. Ich kann einzelne Testfälle ausführen

phpunit tests/{testfilename}

Z.B:

phpunit tests/StackoverflowTest.php

Wenn Sie einzelne Testfälle in Laravel 5.5 ausführen möchten, versuchen Sie es

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

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

Z.B:

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

vendor/bin/phpunit tests/Unit/ContactpageTest.php
Amit Kumar
quelle
Die Frage war, wie man einen einzelnen Test METHODE (nicht Klasse)
Aleksei Akireikin
4

Der Grund, warum Ihre Tests alle ausgeführt werden, ist, dass Sie das --filterFlag nach dem Dateinamen haben. PHPUnit liest die Optionen überhaupt nicht und führt daher alle Testfälle aus.

Auf dem Hilfebildschirm:

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

Verschieben Sie also das --filterArgument vor die gewünschte Testdatei, wie in den Antworten von @Alex und @Ferid Mövsümov erwähnt. Und Sie sollten nur den Test ausführen lassen, den Sie ausführen möchten.

Schleis
quelle
Ich glaube nicht, dass dies die ursprüngliche Frage anspricht ... Ich hatte das gleiche Problem, nur einen der Tests in einer Datei ausführen zu müssen, die viele
Komponententests
@jfoo Eines der Probleme mit den Befehlen des OP war, dass die --filterOption nach dem Dateinamen stand. Die beiden anderen Antworten hatten die richtige Antwort, wiesen jedoch nicht darauf hin, warum der Filter angewendet wurde.
Schleis
1

Ich bin allerdings zu spät zur Party. Aber als persönliches hasse ich es, die ganze Zeile zu schreiben.

Stattdessen verwende ich die folgenden Verknüpfungen in der Datei .bash_profile. Stellen Sie sicher, dass Sie die Datei .bash_profile als Quelle verwenden , nachdem Sie einen neuen Alias ​​hinzugefügt haben. Andernfalls funktioniert dies nicht.

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

Verwendungszweck:

puf function_name

puf filename

Wenn Sie Visual Studio Code verwenden , können Sie das folgende Paket verwenden, um Ihre Tests zum Kinderspiel zu machen.

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

Sie können dann die Tastenkombination in den Einstellungen festlegen. Ich verwende Command + T- Bindung in meinem MAC.

Sobald Sie den Cursor auf eine Funktion setzen und dann die Tastenkombination verwenden, wird dieser einzelne Test automatisch ausgeführt.

Wenn Sie die gesamte Klasse ausführen müssen platzieren Sie den Cursor über der Klasse und verwenden Sie dann die Schlüsselbindung.

Wenn Sie andere Dinge haben, tweek immer mit dem Terminal

Viel Spaß beim Codieren!

Channaveer Hakari
quelle
0

Sie müssen --filter verwenden, um eine einzelne Testmethode auszuführen php phpunit --filter "/::testMethod( .*)?$/" ClassTest ClassTest.php

Der obige Filter führt testMethod alleine aus.

Umair Anwar
quelle