Jak uruchomić pojedynczą metodę testową za pomocą phpunit?

335

Usiłuję uruchomić jedną metodę testową o nazwie testSaveAndDropw pliku escalation/EscalationGroupTest.phpz phpunit. Próbowałem następujących kombinacji:

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

W każdym przypadku wszystkie metody testowe w pliku escalation/EscalationGroupTest.phpsą wykonywane. Jak zamiast tego wybrać tylko JEDNĄ metodę?

Nazwa klasy to, EscalationGroupTesta wersja phpunitto 3.2.8.

Alex
źródło
Jaka jest nazwa twojej klasy testowej?
sekcja

Odpowiedzi:

459

Następujące polecenie uruchamia test na jednej metodzie:

phpunit --filter testSaveAndDrop EscalationGroupTest escalation/EscalationGroupTest.php

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

W przypadku nowszych wersji phpunit jest to po prostu:

phpunit --filter methodName path/to/file.php
Alex
źródło
1
Czy wymagane jest napisanie EscalationGroupTest? Jaki jest z tego pożytek?
mujaffars
2
Ok, rozumiem, to nazwa klasy
mujaffars,
15
Zostanie również uruchomiona metoda testowa o nazwie testSaveAndDrop * (przykład: testSaveAndDropSomething). Aby dokładnie przetestować, użyj SaveSndAndDrop --filter '/ :: testSaveAndDrop $ /'
Farid Movsumov
1
@mujaffars Wątpię, „Mam to” nie jest prawidłowym identyfikatorem w php z powodu białych znaków.
Jon McClung
2
To nie działa teraz. Po prostu phpunit --filter methodName path/to/testing/filenie ClassName .
CJ Dennis
213

Wolę oznaczyć test w adnotacji jako

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

Następnie uruchom go z

phpunit --group failing

Nie trzeba podawać pełnej ścieżki w wierszu poleceń, ale trzeba pamiętać o usunięciu jej przed zatwierdzeniem, aby nie zaśmiecać kodu.

Możesz także określić kilka grup dla jednego testu

/**
  * @group failing
  * @group bug2204 
  */
public function testSomethingElse()
{
}
iamtankist
źródło
4
Podoba mi się ta metoda, czy można przypisać wiele grup za pomocą adnotacji? @group failing, Integration
Dizzy Bryan High
4
Tak oczywiście. Ale nie oddzielone przecinkami. Edytowałem odpowiedź, aby to zilustrować.
iamtankist
Bardziej podoba mi się ta metoda ... w celach informacyjnych element <groups> w phpunit.xml może być również użyty do filtrowania testów ... użyj czegoś takiego bezpośrednio pod <phpunit>: <groups><include> <group> failing </ group > </include> </groups>
Nicolas Galler
2
Ale pytanie brzmiało - uruchomić POJEDYNCZY test. Również - grupa o nazwie niepowodzenie jest najgorszym z możliwych. Ponieważ po niektórych testach nie powiedzie się, możesz uruchomić phpunit -group, który nie uruchomił testów zakończonych niepowodzeniem bez podania im grupy. To jest mylące.
Rafał Mnich,
Najlepsza odpowiedź! nie ma POJEDYNCZEGO testu na wypadek, gdyby był @dependsinny, więc musisz wskazać wszystkie połączone testy, a zatem użyć @groupadnotacji.
centurian
117

Oto bardziej ogólna odpowiedź:

Jeśli masz pewność, że nazwa metody jest unikalna, możesz filtrować tylko według nazwy metody (to działa dla mnie)

phpunit --filter {TestMethodName}

Jednak bezpieczniej jest również podać ścieżkę / odniesienie do pliku

phpunit --filter {TestMethodName} {FilePath}

Przykład:

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

Szybka notatka: Zauważyłem, że jeśli mam funkcję o nazwie, testSavea inna funkcja o nazwie testSaveAndDropprzy użyciu polecenia phpunit --filter testSaverównież się uruchomi, testSaveAndDropa każda inna funkcja, która zaczyna się od testSave*, to dziwne !!

Mahmoud Zalt
źródło
4
To wcale nie jest dziwne, to po prostu dopasowanie substringowe. Jeśli chcesz tego zachowania, użyj tokena końca łańcucha:/testSave$/
Christian
Co jeśli chcesz określić tylko ścieżkę do pliku, aby wszystkie testy w tym pliku zostały uruchomione?
still_dreaming_1
48

Następujące polecenie wykona dokładnie testSaveAndDrop test.

phpunit --filter '/::testSaveAndDrop$/' escalation/EscalationGroupTest.php
Farid Movsumov
źródło
4
Nie działało dla mnie. Korzystanie \bzamiast $ostatecznie załatwiło sprawę: --filter '/::testSaveAndDrop\b/'.
Joe,
1
Oba zakończeń nazwa metody '/::testSaveAndDrop\b/'i '/::testSaveAndDrop$/'pracował dla mnie tak phpunit --filter ClassName::methodName$i phpunit --filter ClassName::methodName\b(w systemie Linux)
Valentine Shi
22

na wiele sposobów uruchom test phpunit w laravel ..

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

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

dla testu pojedynczej klasy:

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

dla pojedynczej metody testowej:

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

do uruchamiania testów ze wszystkich klas w przestrzeni nazw:

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

Aby uzyskać więcej informacji na temat przebiegu testu, zobacz więcej

Jignesh Joisar
źródło
21

Coś takiego

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

Bez =i z'

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

Sekcja
źródło
Nie, to nie działa. Wszystkie testy w klasie EscalationGroupTestsą przetwarzane.
Alex
Nadal wszystkie 9 testów jest w toku. wersja phpunit 3.2.8
Alex
2
Przenieś --filterdo przed nazwą pliku i wszystko powinno działać poprawnie.
Schleis
Pracowałem dla mnie nad PHPUnit 4.8.10
Asaph
To daje mi No tests executed!PHPUnit 4.8.35 @ Schleis Jak dokładnie zmieniłeś polecenie?
Andru
14
  • Uruchom to w katalogu głównym projektu, którego używam w katalogu głównym laravel.

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

Przykład z niestandardową nazwą metody.

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

Przykład z testowym słowem kluczowym

/**
* A basic test example.
*
* @return void
*/
 public function testBasicTest()
 {
  $this->assertTrue(true);
 }
Connectify_user
źródło
1
Pewnie, że jestem początkującym, teraz wypróbuję bardziej szczegółowy kod na nadchodzące odpowiedzi
Connectify_user
7

Jeśli korzystasz z netbeans, możesz kliknąć metodę testową prawym przyciskiem myszy i kliknąć „Run Focused Test Method”.

Uruchom menu Metoda testowania skoncentrowanego

Tony
źródło
7

Możesz spróbować tego, jestem w stanie uruchomić pojedyncze przypadki testowe

phpunit tests/{testfilename}

Na przykład:

phpunit tests/StackoverflowTest.php

Jeśli chcesz uruchomić pojedyncze przypadki testowe w Laravel 5.5 Try

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

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

Na przykład:

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

vendor/bin/phpunit tests/Unit/ContactpageTest.php
Amit Kumar
źródło
Pytanie brzmiało, jak uruchomić
METODĘ
4

Powodem wszystkich testów jest to, że masz --filterflagę po nazwie pliku. PHPUnit w ogóle nie czyta opcji, a więc uruchamia wszystkie przypadki testowe.

Z ekranu pomocy:

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

Przenieś więc --filterargument przed żądany plik testowy, jak wspomniano w odpowiedziach na @Alex i @Ferid Mövsümov. I powinieneś mieć tylko test, który chcesz uruchomić.

Schleis
źródło
Nie sądzę, żeby to dotyczyło pierwotnego pytania ... Miałem ten sam problem z koniecznością uruchomienia tylko jednego z testów w pliku zawierającym wiele testów jednostkowych, a dwie pozostałe odpowiedzi przy użyciu filtrów działały dla mnie
jfoo,
@jfoo Jednym z problemów z poleceniami OP było to, że --filteropcja występowała po nazwie pliku. Pozostałe dwie odpowiedzi miały poprawną odpowiedź, ale nie wskazywały, dlaczego zastosowano filtr.
Schleis
1

Ale spóźniłem się na przyjęcie. Ale osobiście nie lubię pisać całej linii.

Zamiast tego korzystam z następujących skrótów w pliku .bash_profile. Upewnij się, że plik .bash_profile znajduje się w pliku po dodaniu nowego aliasu.

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

Stosowanie:

puf function_name

puf filename

Jeśli korzystasz z programu Visual Studio Code , możesz użyć następującego pakietu, aby Twoje testy zakończyły się powodzeniem.

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

Następnie możesz ustawić przypisanie klawiszy w ustawieniach. Używam wiązania Command + T w moim MAC.

Teraz, gdy umieścisz kursor na dowolnej funkcji, a następnie użyjesz powiązania klawiszy, automatycznie uruchomi ten pojedynczy test.

Jeśli chcesz uruchomić całą klasę, umieść kursor nad klasą, a następnie użyj powiązania klawiszy.

Jeśli masz jakieś inne rzeczy, zawsze tweekuj z Terminalem

Happy Coding!

Channaveer Hakari
źródło
0

Musisz użyć opcji --filter, aby uruchomić jedną metodę testową php phpunit --filter "/::testMethod( .*)?$/" ClassTest ClassTest.php

Powyższy filtr uruchomi testMethod sam.

Umair Anwar
źródło