Cum să executați o singură metodă de testare cu phpunit? (Programare, Php, Phpunit)

Alex a intrebat.
a intrebat.

Mă chinui să execut o singură metodă de testare numită testSaveAndDrop în fișierul escalation/EscalationGroupTest.php cu phpunit. Am încercat următoarele combinații:

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

În fiecare caz toate metoda de testare din fișierul escalation/EscalationGroupTest.php sunt executate. Cum să selectez în schimb doar O metodă?

Numele clasei este EscalationGroupTest iar versiunea de phpunit este 3.2.8.

Comentarii

  • Care este numele clasei de test? –  > Por sectus.
13 răspunsuri
Alex

Următoarea comandă execută testul pe o singură metodă:

phpunit --filter testSaveAndDrop EscalationGroupTest escalation/EscalationGroupTest.php

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

Pentru versiunile mai noi de phpunit, este doar:

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

Comentarii

  • A fost necesară scrierea EscalationGroupTest este necesară? Care este utilizarea acestuia? –  > Por mujaffars.
  • Ok, am înțeles că este numele clasei –  > Por mujaffars.
  • 20

  • Se va rula și metoda de test cu numele testSaveAndDrop* ( exemplu: testSaveAndDropSomething). Pentru a rula exact testSaveAndDrop folosiți –filter ‘/::testSaveAndDrop$/’ –  > Por Farid Movsumov.
  • @mujaffars Mă îndoiesc, „I got it” nu este un identificator valid în php din cauza spațiilor albe. –  > Por Jon McClung.
  • Acest lucru nu funcționează acum. Este doar phpunit --filter methodName path/to/testing/file, nu ClassName . –  > Por CJ Dennis.
iamtankist

Eu prefer să marchez testul în adnotare ca

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

Apoi să îl rulați cu

phpunit --group failing

Nu este nevoie să specificați calea completă în linia de comandă, dar trebuie să vă amintiți să eliminați acest lucru înainte de comitere, pentru a nu aglomera codul.

De asemenea, puteți specifica mai multe grupuri pentru un singur test

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

Comentarii

  • Îmi place această metodă, este posibil să atribuiți mai multe grupuri prin intermediul adnotării? @group failing, Integration –  > Por Dizzy Bryan High.
  • Da, bineînțeles. Dar nu separate prin virgulă. Am editat răspunsul pentru a ilustra acest lucru. –  > Por iamtankist.
  • Îmi place mai mult această metodă… pentru referință, elementul <groups> din phpunit.xml poate fi de asemenea folosit pentru a filtra testele… folosiți ceva de genul acesta chiar sub <phpunit>: <groups><include><group>failing</group><</include></groups> –  > Por Nicolas Galler.
  • Dar întrebarea a fost – pentru a rula un test SINGUR. De asemenea – grupul numit failing este cel mai rău pe care îl puteți folosi. Pentru că după ce unele teste eșuează puteți rula phpunit –group failing pentru a rula testele eșuate fără a le da grupul. Este confuz. –  > Por Rafał Mnich.
  • Cel mai bun răspuns! nu există NICI UN SINGUR test în cazul în care acesta @depends de altul, așa că trebuie să precizați toate testele interconectate și astfel să folosiți @group adnotare. –  > Por centurian.
Mahmoud Zalt

Iată un răspuns mai generic:

Dacă sunteți sigur că numele metodei este unic, puteți filtra doar după numele metodei. (pentru mine funcționează)

phpunit --filter {TestMethodName}

Cu toate acestea, este mai sigur să specificați și calea/referința fișierului

phpunit --filter {TestMethodName} {FilePath}

Exemplu:

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

Notă rapidă: Am observat că dacă am o funcție numită testSave și o altă funcție numită testSaveAndDrop folosind comanda phpunit --filter testSave se va executa și testSaveAndDrop și orice altă funcție care începe cu testSave*, este ciudat!!!

Comentarii

  • Nu este deloc ciudat, este practic o potrivire de subșiruri. Dacă doriți acest comportament, utilizați simbolul de sfârșit de șir: /testSave$/ –  > Por Christian.
  • Dar dacă doriți să specificați doar calea fișierului, astfel încât toate testele din acel fișier să fie rulate? –  > Por still_dreaming_1.
Farid Movsumov

Următoarea comandă se va executa exact testSaveAndDrop test.

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

Comentarii

  • Nu a funcționat pentru mine. Folosind b în loc de $ a funcționat în cele din urmă: --filter '/::testSaveAndDropb/'. –  > Por Joe.
  • Ambele terminații ale numelui metodei '/::testSaveAndDropb/' și '/::testSaveAndDrop$/' au funcționat pentru mine în felul următor phpunit --filter ClassName::methodName$ și phpunit --filter ClassName::methodNameb (pe Linux) –  > Por Valentine Shi.
Jignesh Joisar

pentru a rula testul phpunit în laravel de mai multe moduri …

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

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

pentru testarea unei singure clase :

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

pentru testarea unei singure metode :

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

pentru a rula teste din toate clasele din cadrul spațiului de nume :

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

pentru mai multe moduri de a rula testul vezi mai multe

Vinay Kaithwas
  • Rulați acest lucru în interiorul directorului rădăcină al proiectului dvs. eu folosesc în directorul rădăcină al lui Laravel.

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

Exemplu cu nume de metodă personalizat.

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

Exemplu cu cuvântul cheie test

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

sectus

Deci, ceva de genul acesta

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

Fără = și cu '

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

Comentarii

  • Nu, acest lucru nu funcționează. Toate testele din clasa EscalationGroupTest sunt procesate. –  > Por Alex.
  • În continuare se execută toate cele 9 teste. phpunit versiunea 3.2.8 –  > Por Alex.
  • Mutarea --filter înaintea numelui de fișier și lucrurile ar trebui să funcționeze corect. –  > Por Schleis.
  • A funcționat pentru mine pe PHPUnit 4.8.10 –  > Por Asaph.
  • Acest lucru îmi dă No tests executed! pe PHPUnit 4.8.35 @Schleis Cum anume ai schimbat comanda? –  > Por Andru.
Tony

Dacă ești în netbeans, poți să dai click dreapta în metoda de testare și să dai click pe „Run Focused Test Method”.

Amit Kumar

Puteți încerca acest lucru Sunt capabil să ruleze cazuri de testare unice

phpunit tests/{testfilename}

De ex:

phpunit tests/StackoverflowTest.php

Dacă doriți să rulați cazuri de testare unice în Laravel 5.5 Încercați

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

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

Eg:

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

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

Comentarii

  • Întrebarea a fost cum să rulați o singură metodă de testare METODA (nu clasa) –  > Por Aleksei Akireikin.
Schleis

Motivul pentru care toate testele dvs. sunt rulate este că aveți --filter după numele fișierului. PHPUnit nu citește deloc opțiunile și, prin urmare, rulează toate cazurile de testare.

Din ecranul de ajutor:

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

Deci, mutați --filter înaintea fișierului de test pe care îl doriți, așa cum se menționează în răspunsurile lui @Alex și @Ferid Mövsümov. Și ar trebui să aveți doar testul pe care doriți să îl executați.

Comentarii

  • Nu cred că acest lucru răspunde la întrebarea inițială… Am avut aceeași problemă de a avea nevoie să execut doar unul dintre testele dintr-un fișier care conține multe teste unitare, iar celelalte două răspunsuri care utilizează filtre au funcționat pentru mine –  > Por jfoo.
  • @jfoo Una dintre problemele cu comenzile lui OP a fost aceea că --filter se afla după numele fișierului. Celelalte două răspunsuri aveau răspunsul corect, dar nu indicau de ce se aplica filtrul. –  > Por Schleis.
user276648

Dacă folosiți un fișier de configurare XML, puteți adăuga următoarele în interiorul fișierului phpunit tag:

<groups>
  <include>
    <group>nameToInclude</group>
  </include>
  <exclude>
    <group>nameToExclude</group>
  </exclude>
</groups>

A se vedea https://phpunit.de/manual/current/en/appendixes.configuration.html

Channaveer Hakari

Totuși, am ajuns târziu la petrecere. Dar ca personal nu-mi place să scriu toată linia.

În schimb, folosesc următoarele scurtături în .bash_profile file asigurați-vă că sursa .bash_profile fișierul după adăugarea oricărui alias nou, altfel nu va funcționa.

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

Utilizare:

puf function_name

puf filename

Dacă utilizați Visual Studio Code puteți utiliza următorul pachet pentru a vă face testele mai ușoare.

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

Puteți seta apoi legătura de taste în setări. Eu folosesc Command + T în cazul MAC-ului meu.

Acum, odată ce plasați cursorul pe orice funcție și apoi folosiți legătura de taste, atunci va rula automat acel test unic.

Dacă aveți nevoie să executați întregul clasa atunci plasați cursorul în partea de sus a clasei și apoi folosiți legătura prin taste.

Dacă aveți alte lucruri, atunci modificați întotdeauna cu ajutorul funcției Terminal

Codare fericită!

Umair Anwar

Trebuie să utilizați –filter pentru a rula o singură metodă de testarephp phpunit --filter "/::testMethod( .*)?$/" ClassTest ClassTest.php

Filtrul de mai sus va rula doar TestMethod.

Tags:,