¿Cómo ejecutar un método de prueba único con phpunit?

335

Estoy luchando para ejecutar un único método de prueba nombrado testSaveAndDropen el archivo escalation/EscalationGroupTest.phpcon phpunit. Probé las siguientes combinaciones:

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

En cada caso, se ejecutan todos los métodos de prueba en el archivo escalation/EscalationGroupTest.php. ¿Cómo seleccionar solo UN método en su lugar?

El nombre de la clase es EscalationGroupTesty la versión de phpunites 3.2.8.

Alex
fuente
¿Cuál es el nombre de la clase de tu clase de prueba?
sectus

Respuestas:

459

El siguiente comando ejecuta la prueba en un solo método:

phpunit --filter testSaveAndDrop EscalationGroupTest escalation/EscalationGroupTest.php

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

Para las versiones más nuevas de phpunit, es solo:

phpunit --filter methodName path/to/file.php
Alex
fuente
1
¿Se requiere escribir EscalationGroupTest? ¿Cuál es el uso de ello?
mujaffars
2
Ok, lo tengo es el nombre de la clase
mujaffars
15
También ejecutará el método de prueba con el nombre testSaveAndDrop * (ejemplo: testSaveAndDropSomething). Para ejecutar exactamente testSaveAndDrop use --filter '/ :: testSaveAndDrop $ /'
Farid Movsumov
1
@mujaffars Lo dudo, "Lo tengo" no es un identificador válido en php debido al espacio en blanco.
Jon McClung
2
Esto no funciona ahora. Es solo que phpunit --filter methodName path/to/testing/fileno ClassName .
CJ Dennis
213

Prefiero marcar la prueba en anotaciones como

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

Luego ejecutándolo con

phpunit --group failing

No es necesario especificar la ruta completa en la línea de comando, pero debe recordar haberlo eliminado antes de confirmar, para no saturar el código.

También puede especificar varios grupos para una sola prueba

/**
  * @group failing
  * @group bug2204 
  */
public function testSomethingElse()
{
}
iamtankist
fuente
44
Me gusta este método, ¿es posible asignar múltiples grupos a través de la anotación? @group failing, Integration
Dizzy Bryan High
44
Sí, por supuesto. Pero no separados por comas. Editó la respuesta para ilustrar esto.
iamtankist
Me gusta más este método ... como referencia, el elemento <groups> en phpunit.xml también se puede usar para filtrar las pruebas ... use algo como esto justo debajo de <phpunit>: <groups><include> <group> failing </ group > </include> </groups>
Nicolas Galler
2
Pero la pregunta era: ejecutar una sola prueba. Además, el grupo llamado error es lo peor que puede usar. Porque después de que algunas pruebas fallan, puede ejecutar phpunit --group que no puede ejecutar las pruebas fallidas sin darles el grupo. Es confuso.
Rafał Mnich
La mejor respuesta! NO hay una prueba ÚNICA en caso de que sea @dependsde otra, por lo que debe identificar todas las pruebas interconectadas y, por lo tanto, utilizar la @groupanotación.
centuriano
117

Aquí está la respuesta más genérica:

Si está seguro de que el nombre del método es único, solo puede filtrar por nombre del método (esto funciona para mí)

phpunit --filter {TestMethodName}

Sin embargo, también es más seguro especificar la ruta / referencia del archivo

phpunit --filter {TestMethodName} {FilePath}

Ejemplo:

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

Nota rápida: He notado que si tengo una función llamada testSavey otra función llamada testSaveAndDropusando el comando phpunit --filter testSavetambién se ejecutará testSaveAndDropy cualquier otra función que comience testSave*, ¡es extraño!

Mahmoud Zalt
fuente
44
No es extraño en absoluto, es básicamente una coincidencia de subcadena. Si desea ese comportamiento, use el token de fin de cadena:/testSave$/
Christian
¿Qué sucede si solo desea especificar la ruta del archivo para que se ejecuten todas las pruebas en ese archivo?
still_dreaming_1
48

El siguiente comando ejecutará exactamente la testSaveAndDrop prueba.

phpunit --filter '/::testSaveAndDrop$/' escalation/EscalationGroupTest.php
Farid Movsumov
fuente
44
No funciono para mi. Utilizando \ben lugar de $por fin hizo el truco: --filter '/::testSaveAndDrop\b/'.
Joe
1
Tanto de las terminaciones de nombre de método '/::testSaveAndDrop\b/'y '/::testSaveAndDrop$/'trabajó para mí como esta phpunit --filter ClassName::methodName$y phpunit --filter ClassName::methodName\b(en Linux)
Valentine Shi
22

para ejecutar la prueba phpunit en laravel de muchas maneras ..

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

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

para prueba de clase individual:

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

Para el método único de prueba:

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

para ejecutar pruebas de toda clase dentro del espacio de nombres:

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

para más pruebas de ejecución ver más

Jignesh Joisar
fuente
21

Entonces, algo como esto

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

Sin =y con'

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

sectus
fuente
No, esto no funciona. Todas las pruebas en la clase EscalationGroupTestestán siendo procesadas.
Alex
Aún se están ejecutando las 9 pruebas. phpunit versión 3.2.8
Alex
2
Mueva el --filtera antes del nombre del archivo y las cosas deberían funcionar bien.
Schleis
Trabajó para mí en PHPUnit 4.8.10
Asaph
Esto me da No tests executed!en PHPUnit 4.8.35 @Schleis ¿Cómo exactamente cambiaste el comando?
Andru
14
  • Ejecute esto dentro del directorio raíz del proyecto que estoy usando en el directorio raíz laravel.

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

Ejemplo con nombre de método personalizado.

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

Ejemplo con palabra clave de prueba

/**
* A basic test example.
*
* @return void
*/
 public function testBasicTest()
 {
  $this->assertTrue(true);
 }
Connectify_user
fuente
1
Estoy seguro de que ahora soy un principiante y probaré un código más específico en las próximas respuestas
Connectify_user
7

Si está en netbeans, puede hacer clic derecho en el método de prueba y hacer clic en "Ejecutar método de prueba enfocado".

Menú Ejecutar método de prueba enfocado

Tony
fuente
7

Puedes probar esto, puedo ejecutar casos de prueba individuales

phpunit tests/{testfilename}

P.ej:

phpunit tests/StackoverflowTest.php

Si desea ejecutar casos de prueba individuales en Laravel 5.5, intente

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

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

P.ej:

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

vendor/bin/phpunit tests/Unit/ContactpageTest.php
Amit Kumar
fuente
La pregunta era cómo ejecutar MÉTODO de prueba individual (no clase)
Aleksei Akireikin
4

La razón por la que todas sus pruebas se están ejecutando es porque tiene el --filterindicador después del nombre del archivo. PHPUnit no lee las opciones en absoluto y, por lo tanto, ejecuta todos los casos de prueba.

Desde la pantalla de ayuda:

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

Entonces mueva el --filterargumento antes del archivo de prueba que desee como se menciona en las respuestas de @Alex y @Ferid Mövsümov. Y solo debe tener la prueba que desea ejecutar.

Schleis
fuente
No creo que esto responda a la pregunta original ... Tuve el mismo problema de necesitar ejecutar solo una de las pruebas en un archivo que contiene muchas pruebas unitarias, y las otras dos respuestas usando filtros funcionaron para mí
jfoo
@jfoo Uno de los problemas con los comandos del OP fue que la --filteropción estaba después del nombre del archivo. Las otras dos respuestas tenían la respuesta correcta, pero no señalaban por qué se estaba aplicando el filtro.
Schleis
1

Sin embargo, llego tarde a la fiesta. Pero como personal odio escribir toda la línea.

En su lugar, utilizo los siguientes accesos directos en el archivo .bash_profile , asegúrese de obtener el archivo .bash_profile después de agregar cualquier alias nuevo, de lo contrario no funcionará.

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

Uso:

puf function_name

puf filename

Si usa Visual Studio Code , puede usar el siguiente paquete para simplificar sus pruebas.

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

Luego puede establecer la combinación de teclas en la configuración. Uso Command + T vinculante en mi MAC.

Ahora, una vez que coloque el cursor en cualquier función y luego use la combinación de teclas, se ejecutará automáticamente esa única prueba.

Si necesita ejecutar toda la clase , coloque el cursor encima de la clase y luego use la combinación de teclas.

Si tiene alguna otra cosa, siempre modifique con la Terminal

¡Feliz codificación!

Channaveer Hakari
fuente
0

Debe usar --filter para ejecutar un único método de prueba php phpunit --filter "/::testMethod( .*)?$/" ClassTest ClassTest.php

El filtro anterior ejecutará testMethod solo.

Umair Anwar
fuente