¿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.


¿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

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

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!


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

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


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


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

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


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

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.


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!


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.