Come eseguire il metodo di test singolo con phpunit?


335

Sto lottando per eseguire un singolo metodo di prova denominato testSaveAndDropnel file escalation/EscalationGroupTest.phpcon phpunit. Ho provato le seguenti combinazioni:

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 ogni caso vengono eseguiti tutti i metodi di prova nel file escalation/EscalationGroupTest.php. Come selezionare solo UN metodo?

Il nome della classe è EscalationGroupTeste la versione phpunitè 3.2.8.


Qual è il nome della classe della tua classe di test?
sectus,

Risposte:


459

Il seguente comando esegue il test su un singolo metodo:

phpunit --filter testSaveAndDrop EscalationGroupTest escalation/EscalationGroupTest.php

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

Per le versioni più recenti di phpunit, è solo:

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

1
È richiesta la scrittura di EscalationGroupTest? A cosa serve?
Mujaffars,

2
Ok ho capito che è il nome della classe
mujaffars,

15
Verrà eseguito anche il metodo di test con il nome testSaveAndDrop * (esempio: testSaveAndDropSomething). Per eseguire esattamente testSaveAndDrop utilizzare --filter '/ :: testSaveAndDrop $ /'
Farid Movsumov

1
@mujaffars Ne dubito, "I got it" non è un identificatore valido in php a causa degli spazi bianchi.
Jon McClung,

2
Questo non funziona ora. È solo phpunit --filter methodName path/to/testing/fileno ClassName .
CJ Dennis,

213

Preferisco contrassegnare il test in annotazione come

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

Quindi eseguirlo con

phpunit --group failing

Non è necessario specificare il percorso completo nella riga di comando, ma è necessario ricordare di averlo rimosso prima di eseguire il commit, non di ingombrare il codice.

È inoltre possibile specificare più gruppi per un singolo test

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

4
Mi piace questo metodo, è possibile assegnare più gruppi tramite l'annotazione? @group failing, Integration
Dizzy Bryan High

4
Sì, naturalmente. Ma non separati da virgola. Modificata la risposta per illustrare questo.
Giambellista,

Mi piace meglio questo metodo ... per riferimento l'elemento <groups> in phpunit.xml può anche essere usato per filtrare i test ... usa qualcosa del genere proprio sotto <phpunit>: <groups><include> <group> fallito </ group > </include> </groups>
Nicolas Galler,

2
Ma la domanda era: eseguire SINGOLO test. Inoltre, il gruppo chiamato in errore è il peggiore che puoi usare. Perché dopo alcuni test falliti è possibile eseguire phpunit --group che non riesce a eseguire i test falliti senza dare loro il gruppo. È confusionario.
Rafał Mnich,

La migliore risposta! non esiste un SINGOLO test nel caso in cui venga @dependsda un altro, quindi è necessario individuare tutti i test interconnessi e quindi utilizzare l' @groupannotazione.
centurian

117

Ecco la risposta più generica:

Se sei sicuro che il nome del metodo sia univoco, puoi filtrare solo in base al nome del metodo (funziona per me)

phpunit --filter {TestMethodName}

Tuttavia, è più sicuro specificare anche il percorso / riferimento del file

phpunit --filter {TestMethodName} {FilePath}

Esempio:

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

Nota veloce: ho notato che se ho una funzione denominata testSavee verrà eseguita anche un'altra funzione denominata testSaveAndDropusando il comando e qualsiasi altra funzione che inizia con , è strano !!phpunit --filter testSavetestSaveAndDroptestSave*


4
Non è affatto strano, è fondamentalmente una partita di sottostringa. Se si desidera quel comportamento, utilizzare end of string token:/testSave$/
Christian,

Cosa succede se si desidera specificare solo il percorso del file in modo che vengano eseguiti tutti i test in quel file?
still_dreaming_1,

48

Il comando seguente eseguirà esattamente il testSaveAndDrop test.

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

4
Non ha funzionato per me. Utilizzando \binvece $finalmente ha fatto il trucco: --filter '/::testSaveAndDrop\b/'.
Joe,

1
Entrambe le terminazioni nome del metodo '/::testSaveAndDrop\b/'e '/::testSaveAndDrop$/'ha lavorato per me in questo modo phpunit --filter ClassName::methodName$e phpunit --filter ClassName::methodName\b(su Linux)
San Valentino Shi

22

per eseguire test phpunit in laravel in molti modi.

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

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

per test classe singola:

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

per test metodo singolo:

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

per eseguire test da tutte le classi nello spazio dei nomi:

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

per più test di esecuzione vedi più


21

Quindi qualcosa del genere

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

Senza =e con'

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


No, questo non funziona. Tutti i test nella classe EscalationGroupTestsono in fase di elaborazione.
Alex,

Sono ancora in corso tutti e 9 i test. phpunit versione 3.2.8
Alex

2
Sposta --filterin prima del nome file e le cose dovrebbero funzionare correttamente.
Schleis,

Ha lavorato per me su PHPUnit 4.8.10
Asaph,

Questo mi dà No tests executed!su PHPUnit 4.8.35 @Schleis Come hai cambiato esattamente il comando?
Andru,

14
  • Esegui questo nella directory principale del progetto che sto usando nella directory radice laravel.

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

Esempio con nome del metodo personalizzato.

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

Esempio con parola chiave di prova

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

1
Certo che sono un principiante ora proverò un codice più specifico sulle risposte imminenti
Connectify_user

7

Se utilizzi netbeans, fai clic con il pulsante destro del mouse sul metodo di test e fai clic su "Esegui metodo di test focalizzato".

Esegui il menu Metodo di prova focalizzato


7

Puoi provare questo sono in grado di eseguire singoli casi di test

phpunit tests/{testfilename}

Per esempio:

phpunit tests/StackoverflowTest.php

Se si desidera eseguire casi di test singoli in Laravel 5.5 Provare

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

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

Per esempio:

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

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

La domanda era: come eseguire il test singolo METODO (non di classe)
Aleksei Akireikin,

4

Il motivo per cui tutti i test vengono eseguiti è che hai il --filterflag dopo il nome del file. PHPUnit non legge affatto le opzioni e quindi esegue tutti i casi di test.

Dalla schermata di aiuto:

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

Quindi sposta l' --filterargomento prima del file di test che desideri come indicato nelle risposte @Alex e @Ferid Mövsümov. E dovresti avere solo il test che desideri eseguire.


Non penso che questo affronti la domanda originale ... Ho avuto lo stesso problema di dover eseguire solo uno dei test in un file contenente molti test unitari, e le altre due risposte usando i filtri hanno funzionato per me
jfoo

@jfoo Uno dei problemi con i comandi dell'OP era che l' --filteropzione era dopo il nome del file. Le altre due risposte avevano la risposta corretta ma non indicavano il motivo per cui il filtro veniva applicato.
Schleis,


1

Sono in ritardo alla festa però. Ma come personale odio scrivere l'intera riga.

Invece, utilizzo le seguenti scorciatoie nel file .bash_profile assicurandomi di sorgente .bash_profile il file dopo aver aggiunto un nuovo alias altrimenti non funzionerà.

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

Uso:

puf function_name

puf filename

Se si utilizza il codice di Visual Studio, è possibile utilizzare il seguente pacchetto per semplificare i test.

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

È quindi possibile impostare la combinazione di tasti nelle impostazioni. Uso il comando Command + T nel mio MAC.

Ora una volta posizionato il cursore su qualsiasi funzione e quindi utilizzando l'associazione dei tasti, verrà eseguito automaticamente quel singolo test.

Se è necessario eseguire l'intera classe, posizionare il cursore sopra la classe e quindi utilizzare l'associazione dei tasti.

Se hai altre cose, cerca sempre con il Terminale

Buona programmazione!


0

È necessario utilizzare --filter per eseguire un singolo metodo di prova php phpunit --filter "/::testMethod( .*)?$/" ClassTest ClassTest.php

Il filtro sopra eseguirà testMethod da solo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.