Como executar o método de teste único com phpunit?

335

Estou lutando para executar um único método de teste nomeado testSaveAndDropno arquivo escalation/EscalationGroupTest.phpcom phpunit. Eu tentei as seguintes combinações:

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

Em cada caso, todos os métodos de teste no arquivo escalation/EscalationGroupTest.phpsão executados. Como selecionar apenas UM método?

O nome da classe é EscalationGroupTeste a versão phpunité 3.2.8.

Alex
fonte
Qual é o nome da classe da sua classe de teste?
sectus 29/09

Respostas:

459

O comando a seguir executa o teste em um único método:

phpunit --filter testSaveAndDrop EscalationGroupTest escalation/EscalationGroupTest.php

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

Para versões mais recentes do phpunit, é apenas:

phpunit --filter methodName path/to/file.php
Alex
fonte
1
É necessário escrever EscalationGroupTest? Qual é a utilidade disso?
mujaffars
2
Ok, eu entendi o nome da classe
Mujaffars
15
Também executará o método de teste com o nome testSaveAndDrop * (exemplo: testSaveAndDropSomething). Para executar exatamente o testSaveAndDrop, use --filter '/ :: testSaveAndDrop $ /'
Farid Movsumov
1
@ mujaffars Duvido, "eu entendi" não é um identificador válido em php devido ao espaço em branco.
precisa
2
Isso não funciona agora. É só que phpunit --filter methodName path/to/testing/filenão ClassName .
CJ Dennis
213

Prefiro marcar o teste na anotação como

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

Em seguida, executando-o com

phpunit --group failing

Não há necessidade de especificar o caminho completo na linha de comando, mas você deve se lembrar de removê-lo antes de confirmar, para não confundir o código.

Você também pode especificar vários grupos para um único teste

/**
  * @group failing
  * @group bug2204 
  */
public function testSomethingElse()
{
}
iamtankist
fonte
4
Eu gosto deste método, é possível atribuir vários grupos através da anotação? @group failing, Integration
Dizzy Bryan High
4
Sim, claro. Mas não separado por vírgula. Editou a resposta para ilustrar isso.
Iamtankist
Eu gosto mais desse método ... para referência, o elemento <groups> no phpunit.xml também pode ser usado para filtrar os testes ... use algo assim logo abaixo <phpunit>: <groups><include> <group> falhando </ group > </include> </groups>
Nicolas Galler
2
Mas a questão era - executar o teste ÚNICO. Além disso - o grupo com falha é o pior que você pode usar. Como após alguns testes falharem, você pode executar o phpunit --group falhando em executar os testes com falha sem fornecer a eles o grupo. É confuso.
Rafał Mnich
A melhor resposta! não existe UM ÚNICO teste no caso @dependsde outro, então você precisa identificar todos os testes interconectados e, assim, usar a @groupanotação.
centurian
117

Aqui está a resposta mais genérica:

Se você tiver certeza de que o nome do método é exclusivo, você pode filtrar apenas pelo nome do método (isso funciona para mim)

phpunit --filter {TestMethodName}

No entanto, é mais seguro especificar também o caminho / referência do arquivo

phpunit --filter {TestMethodName} {FilePath}

Exemplo:

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

Nota rápida: notei que, se eu tiver uma função chamada testSavee outra função chamada testSaveAndDropusing command phpunit --filter testSave, também será executada testSaveAndDrope qualquer outra função que comece com testSave*, será estranho!

Mahmoud Zalt
fonte
4
Não é nada estranho, é basicamente uma correspondência de substring. Se você deseja esse comportamento, use o fim do token de string:/testSave$/
Christian
E se você quiser especificar apenas o caminho do arquivo para que todos os testes nesse arquivo sejam executados?
still_dreaming_1
48

O comando a seguir executará exatamente o testSaveAndDrop teste.

phpunit --filter '/::testSaveAndDrop$/' escalation/EscalationGroupTest.php
Farid Movsumov
fonte
4
não funcionou para mim. Usando \bvez de $finalmente fez o truque: --filter '/::testSaveAndDrop\b/'.
Joe
1
Ambas as terminações de nomes de método '/::testSaveAndDrop\b/'e '/::testSaveAndDrop$/'funcionou para mim como este phpunit --filter ClassName::methodName$e phpunit --filter ClassName::methodName\b(em Linux)
Valentine Shi
22

para executar o teste phpunit no laravel de várias maneiras ..

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

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

para teste de classe única:

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

para o método único de teste:

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

para executar testes de todas as classes no namespace:

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

para mais testes de execução, veja mais

Jignesh Joisar
fonte
21

Então, algo assim

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

Sem =e com'

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

sectus
fonte
Não, isso não funciona. Todos os testes na classe EscalationGroupTestestão sendo processados.
Alex
Ainda todos os 9 testes estão sendo executados. phpunit versão 3.2.8
Alex
2
Mova --filterpara antes do nome do arquivo e tudo deve funcionar corretamente.
21715 Schleis
Trabalhou para mim no PHPUnit 4.8.10
Asaph
Isso me dá No tests executed!no PHPUnit 4.8.35 @Schleis Como exatamente você mudou o comando?
Andru 31/07
14
  • Execute isso dentro do diretório raiz do projeto que estou usando no diretório raiz do laravel.

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

Exemplo com nome do 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');
  }

Exemplo com palavra-chave de teste

/**
* A basic test example.
*
* @return void
*/
 public function testBasicTest()
 {
  $this->assertTrue(true);
 }
Connectify_user
fonte
1
Claro que sou iniciante agora tentarei um código mais específico nas próximas respostas
Connectify_user
7

Se você está no netbeans, pode clicar com o botão direito do mouse no método de teste e clicar em "Executar Método de Teste Focado".

Menu Executar Método de Teste Focado

Tony
fonte
7

Você pode tentar isso, eu sou capaz de executar casos de teste únicos

phpunit tests/{testfilename}

Por exemplo:

phpunit tests/StackoverflowTest.php

Se você deseja executar casos de teste únicos no Laravel 5.5, tente

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

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

Por exemplo:

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

vendor/bin/phpunit tests/Unit/ContactpageTest.php
Amit Kumar
fonte
A questão era como executar um único método de teste (não de classe)
Aleksei Akireikin
4

A razão pela qual todos os seus testes estão sendo executados é que você tem o --filter sinalizador após o nome do arquivo. O PHPUnit não está lendo as opções e está executando todos os casos de teste.

Na tela de ajuda:

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

Portanto, mova o --filterargumento antes do arquivo de teste que você deseja, conforme mencionado nas respostas @Alex e @Ferid Mövsümov. E você só deve ter o teste que deseja executar.

Schleis
fonte
Eu não acho que isso atenda à pergunta original ... Eu tive o mesmo problema de precisar executar apenas um dos testes em um arquivo contendo muitos testes de unidade, e as duas outras respostas usando filtros funcionaram para mim
jfoo
@jfoo Um dos problemas com os comandos do OP era que a --filteropção estava atrás do nome do arquivo. As outras duas respostas tinham a resposta correta, mas não apontaram por que o filtro estava sendo aplicado.
21315 Schleis
1

Estou atrasado para a festa. Mas como pessoal eu odeio escrever a linha inteira.

Em vez disso, eu uso os seguintes atalhos no arquivo .bash_profile para garantir a origem do arquivo .bash_profile após adicionar qualquer novo alias, caso contrário ele não funcionará.

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

Uso:

puf function_name

puf filename

Se você usa o Visual Studio Code, pode usar o seguinte pacote para facilitar seus testes.

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

Você pode definir a combinação de teclas nas configurações. Eu uso a ligação Command + T no meu MAC.

Agora, depois de colocar o cursor em qualquer função e usar a ligação de teclas, ele executará automaticamente esse único teste.

Se você precisar executar a classe inteira , coloque o cursor em cima da classe e use a associação de teclas.

Se você tiver outras coisas, sempre use o Terminal.

Feliz codificação!

Channaveer Hakari
fonte
0

Você deve usar --filter para executar um único método de teste php phpunit --filter "/::testMethod( .*)?$/" ClassTest ClassTest.php

O filtro acima executará o testMethod sozinho.

Umair Anwar
fonte