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.


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

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()
{
}

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


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

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


21

Also so etwas

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

Ohne =und mit'

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


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);
 }

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


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

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.


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!


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.