PHPUnit - 'Nenhum teste executado' ao usar o arquivo de configuração

91

O problema

Para melhorar minha qualidade de código, decidi tentar aprender como testar meu código usando Teste de Unidade em vez de minhas soluções de teste medíocres na melhor das hipóteses.

Decidi instalar o PHPUnit usando o composer para uma biblioteca pessoal que me permite obter funções de banco de dados comuns. No começo eu não tinha um arquivo de configuração para PHPUnit e quando executei comandos como:

$ phpunit tests/GeneralStringFunctions/GeneralStringFunctionsTest

Observe que este é um comando de terminal, portanto, não incluí a .phpextensão. O GeneralStringFunctionsTest mencionado acima é na verdade um GeneralStringFunctionsTest.phparquivo.

O resultado é o que eu esperava:

Tempo: 31 ms, Memória: 2,75 MB

OK (1 teste, 1 afirmação)

Em seguida, tentei usar um arquivo de configuração para carregar automaticamente o conjunto de testes em vez de ter que digitar o arquivo manualmente todas as vezes. Criei um arquivo chamado phpunit.xmlem meu diretório raiz e inseri o seguinte no arquivo: http://pastebin.com/0j0L4WBD :

<?xml version = "1.0" encoding="UTF-8" ?>
<phpunit>
    <testsuites>
        <testsuite name="Tests">
            <directory>tests</directory>
        </testsuite>
    </testsuites>
</phpunit>

Agora, quando executo o comando:

phpunit

Eu obtenho a seguinte saída:

PHPUnit 4.5.0 por Sebastian Bergmann e colaboradores.

Configuração lida em /Users/muyiwa/Projects/DatabaseHelper/phpunit.xml

Tempo: 16 ms, Memória: 1,50 Mb

Nenhum teste executado!

Caso seja útil, minha estrutura de diretório é a seguinte:
src - Diretório de nível superior (com todo o meu código-fonte)
testes - Diretório de nível superior (com todos os meus testes, estruturado da mesma forma que minha pasta src )
fornecedor - Arquivos de terceiros do Composer

Eu também tenho o composer json e o arquivo de bloqueio, bem como o arquivo xml phpunit no nível superior como arquivos.

Coisas que eu tentei

  • Mudando o diretório phpunit.xmlparatests/GeneralStringFunctions
  • Mudando o diretório phpunit.xmlpara./tests
  • Movendo o phpunit.xmlarquivo para o testsdiretório e alterando o diretório em ./vez de tests.
  • Adicionando um atributo de sufixo à tag de diretório em phpunit.xmlpara especificar "Testes" como o sufixo explícito.
Muyiwa Olu
fonte
É tests/GeneralStringFunctions/GeneralStringFunctionsTestuma pasta ou um nome de arquivo?
hek2mgl
@ hek2mgl É um nome de arquivo, na verdade é chamado GeneralStringFunctionsTest.php. Na interface da linha de comando, não digitei a .phpextensão porque funcionava sem ela.
Muyiwa Olu
1
OK, então sua configuração deve funcionar. A propósito, se você especificar um sufixo, ele deve ser em Test.phpvez de Testno seu caso, mas, no entanto, você é livre para omiti-lo, pois Test.phpé o valor padrão.
hek2mgl
@ hek2mgl Obrigado pelo aviso! Você tem alguma ideia de por que meu teste não está sendo executado com o arquivo de configuração phpunit.xml?
Muyiwa Olu
Por que você não nos mostra o arquivo de configuração?
ThW

Respostas:

196

Pelo que vale a pena (estar atrasado), encontrei isso recentemente enquanto estava fazendo um novo projeto Laravel 5.1 para um site simples. Tentei depurar e fiquei confuso quando tentei:

php artisan make:test homeTest

(que tem um teste padrão que apenas afirma que verdadeiro é verdadeiro)

e vi a saída

No tests executed!

O problema acabou sendo para mim relacionado à minha instalação do PHP - "phpunit" foi registrado globalmente e configurado de forma diferente, enquanto o phpunit que veio com a instalação do Laravel foi configurado corretamente e funcionou perfeitamente.

Portanto, a correção é executar o phpunit configurado do fornecedor (do mesmo diretório raiz que app / e tests /):

./vendor/bin/phpunit

Espero que ajude mais alguém!

RoboBear
fonte
4
Acho que essa é provavelmente a resposta correta. Desde então, removi o projeto, então não tenho como verificar novamente, mas para projetos futuros com o composer, sempre usei em vendor/bin/phpunitvez do phpunitbinário global . Cheguei até a remover o phpunitbinário global para não cometer o mesmo erro acidentalmente - e ele não apareceu desde então. Vou marcar esta como a resposta aceita, pois muito provavelmente é o motivo.
Muyiwa Olu
3
ligar ./vendor/bin/phpunitfuncionou para mim em uma nova instalação do laravel 5.4
ira
Da mesma forma, isso me ajudou enquanto trabalhava em um projeto Wordpress. O mesmo problema: "phpunit" pode ser registrado globalmente e configurado de forma diferente. Obrigado por compartilhar!
sqsinger
Isso corrigiu para mim, mas existe uma maneira de corrigir globalmente o phpunit? Seria bom se eu pudesse digitarphpunit
Noitidart de
2
@Noitidart, você pode criar um aliasfor ./vendor/bin/phpunit
Ganesh K
101

Seu arquivo XML está bem como está. No entanto, você deve certificar-se de que os arquivos PHP em sua tests/pasta tenham os seguintes nomes:

tests / Test.php <--- Observe o "T" maiúsculo
tests / user Test.php
tests / fooBar Test.php
etc.

Os nomes dos arquivos devem terminar com "Test.php" . Isso é o que o PHPUnit está procurando nos diretórios.

Além disso, cada método de teste deve ter um nome que começa com "teste":

public function testFooBar()
{
    // Your test code
}

Espero que ajude!

Lionel
fonte
4
ou você pode usar --test-suffix=anything.phppara substituir
checksum de
para mim, foi útil substituir o caminho relativo para a pasta de teste pelo caminho absoluto.
Timur Samkharadze 05 de
Como faço para substituir isso no arquivo de configuração?
Jonathan
21

No Windows, use o seguinte comando no terminal

.\vendor\bin\phpunit

isso é se o comando

phpunit

retorna "Nenhum teste executado!"

enquanto no Mac

./vendor/bin/phpunit

Espero que ajude.

Ndong Akwo
fonte
Muito obrigado pela sua resposta, isso realmente ajuda.
Goke Obasa
Certifique-se de que não haja nenhum phpunitem seu caminho global (você pode verificar executando algo como phpunit --versione ver se ele corresponde ao que você esperava. O Xampp geralmente instala um phpunit no mesmo diretório bin de php. Esse foi o problema para mim.
giovannipds
Eu sou uma das pessoas mais ignorantes do mundo quando se trata de teste de unidade, então seria bom o motivo para isso, mas realmente ajudou. Obrigado mesmo assim!
Mycodingproject
12

Tive o mesmo problema depois que o PHPUnit em nossas máquinas virtuais atualizou para a versão 6. Mesmo --debug e --verbose não disseram nada útil, apenas "Nenhum teste executado". No final, descobriu-se que classes e namespaces foram alterados na nova versão e ele simplesmente não queria executar os arquivos que continham referências a classes antigas. A solução para mim foi substituir em todos os casos de teste:

class MyTestCase extends \PHPUnit_Framework_TestCase {...}

com:

use PHPUnit\Framework\TestCase;

class MyTestCase extends TestCase {...}
igors
fonte
Ah, sim, embora não pareça que esta fosse a resposta à pergunta original, ele resolveu meu problema após fazer upgrade para 6.x!
Tama
Este foi o problema para mim ao atualizar do PHPUnit 5.7 para 8.5 também - obrigado pela dica!
confirmador
8

Sei que isso é muito antigo, mas também aconteceu comigo. Espero que isso ajude alguém.

Meu problema é que esqueci o símbolo '@' em / ** @test * /

ERRADO:

/** test */
function a_thread_can_be_deleted()
{
    ...
}

DIREITO:

/** @test */
function a_thread_can_be_deleted()
{
    ...
}
Brad Ahrens
fonte
1
mais de 2 anos depois, e foi isso para mim. realmente tem que ser exatamente esse formato para o comentário. eu tinha um espaço ausente lá. não o detectou. o que é um pouco chato, no laravel 6.1 usei o comando artisan make e não inclui esse comentário
aibarra
1
Esta resposta é útil
Sundar
Tive o problema quando estava desenvolvendo um pacote. Quando eu executo 'php artisan make: test SomeTest' e o movo para o diretório de testes do pacote, o comentário do método testExample básico contém apenas uma descrição básica @return voide não contém '@test', que é o motivo pelo qual o phpunit não conseguiu identificar como um teste.
DAMIEN JIANG
6

Eu puxei meu cabelo por 10 minutos antes de decidir usar --debug (bom caminho a seguir) para descobrir o simples fato de que o nome do arquivo não respeitava a convenção de nomenclatura , eu tinha um "s" extra no final .

errado

CreateAdminTests

direito

CreateAdminTest

espero que esta nota possa ajudar alguém

chebaby
fonte
1
Ótimo, consegui executar o teste depois disso
WindSaber
5

Você só precisa ligar para o arquivo do fornecedor

vendor\bin\phpunit Aviso \ Não /

Hamza Zymawy
fonte
3

Em vez de executar o phpunit

usar

vendor \ bin \ phpunit

Arun Ganesan
fonte
3

Cheguei atrasado à festa, mas esta informação pode ajudar outras pessoas.

As soluções acima não funcionaram para mim. A partir do Laravel 7.x, por padrão, o PHPUnit executa apenas arquivos PHP com o sufixo "Test.php". Por exemplo, se você criar um teste, nomeá-lo CreateUsernão funcionará, mas nomeá-loCreateUserTest funcionará.

Para superar a limitação, vá até phpunit.xmle modifique o suffixatributo dos directoryelementos:

...
<testsuite name="Unit">

    <!-- modify suffix -->
    <directory suffix=".php">./tests/Unit</directory>

</testsuite>
<testsuite name="Feature">

    <!-- modify suffix -->
    <directory suffix=".php">./tests/Feature</directory>

</testsuite>
...

Isso instruirá o PHPUnit a executar todos os arquivos com .phpextensão dos diretórios. Nota para limpar o cache do aplicativo após a atualização phpunit.xml:

php artisan config:cache

Informações adicionais sobre a configuração XML do PHPUnit podem ser encontradas aqui: https://phpunit.de/manual/6.5/en/appendixes.configuration.html

user8555937
fonte
2

se você estiver usando PHPSTORM vá para Configurações e vá para

  • Test Frameworks

    e clique em + e escolha

  • PHPUnit Local então

  • Use Composer Auto Loader em seguida, cole como no caminho para o campo de script

  • C:\{YOUR PROJECT NAME}\vendor\autoload.php

  • Clique OK

  • HAPPY TESTING

Tahseen Alaa
fonte
2

Verifique o arquivo phpunit.xml , olhe dentro dos conjuntos de testes.

Minha versão do phpunit (2019) está procurando por arquivos terminados em (sufixo) * Test.php. Portanto, certifique-se de que todos os arquivos de teste estão nomeados corretamente (ex .: BookTest.php está correto, BookTests.php não, BookTestCase.php não).

Jan Polzer
fonte
1

Você adicionou um conjunto de testes ao arquivo phpunit.xml?

<phpunit>
    <testsuite name="app1" >
        <directory>./</directory>
    </testsuite>
</phpunit>

Você pode adicionar vários diretórios lá.

Aine
fonte
Oi, desculpe se eu não deixei claro na pergunta, mas eu adicionei um conjunto de testes e o nome correspondente ao arquivo XML. Uma cópia pode ser encontrada aqui: pastebin.com/0j0L4WBD .
Muyiwa Olu
Tente <directory> ./tests </directory>
Aine
Obrigado pela atualização, infelizmente ainda tenho o mesmo problema com ./tests que meu diretório. Time: 28 ms, Memory: 1.50Mb No tests executed!
Muyiwa Olu
Infelizmente, o mesmo problema :( Configuration read from /Users/muyiwa/Projects/Web Development/DatabaseHelper/phpunit.xml Time: 66 ms, Memory: 1.50Mb No tests executed!. Definitivamente, funciona quando eu faço referência manualmente, ele simplesmente não gosta de carregar do arquivo de configuração por algum motivo :(
Muyiwa Olu
Última estimativa. Tente mover o arquivo phpunit.xml para o diretório tests /. No arquivo, mude o diretório para <directory> ./ </directory>.
Aine,
1

Os nomes das funções no arquivo de teste devem ser prefixados com testou deve haver um comentário adicionado antes da função

/** @test */

Certifique-se de que não é

/* @test */

porque isso não funciona. deve haver dois asteriscos após a barra, não um.

Mubashar Abbas
fonte
0

Para mim, usar phpunit --debug me mostrou qual teste não estava executando, dentro,

$this->visit('/')
         ->see('Laravel');

e acho que, como o diretório estava protegido com autenticação .htaccess, não conseguiu acessar a página

A solução para mim foi fazer este teste (ou provavelmente tirar a autenticação .htaccess)

relipse
fonte
0

É muito tarde, mas espero que ajude alguém.

Eu tenho meus testes para executar usando uma referência absoluta. estrutura da pasta [projeto / testes / test.php]

minha linha de diretório se parecia com isto ./tests/test.php

Codebender
fonte
0

Um pouco na lateral talvez, mas se você está (como eu) usando o Laravel no Vagrant, certifique-se de que está executando o phpunit dentro da caixa do vagrant e não no "lado do windows". :)

martinetil
fonte
0

Eu tive o problema de nenhum teste sendo executado, mesmo quando as coisas estavam configuradas corretamente.

A causa era que o namespace não era o primeiro comando do arquivo, era depois de alguns comentários do bloco de documentos.

reverter fez com que o phpunit visse os testes e rodasse corretamente.

pgee70
fonte
0

O meu foi um pouco engraçado.

Quando eu usei php artisan make:testacidentalmente coloquei .php like ProductRewardPointController.phpwhich created ProductRewardPointController.php.phpe phpunit simplesmente ignorei.

Acabei de deletar o .php extra e as coisas voltam ao normal

Apit John Ismail
fonte
0

Eu tive o mesmo problema de Nenhum teste executado! , resolvido mantendo o mesmo nome de arquivo e nome de classe .

Até parece
fonte
0

Se você estiver usando IDEs como JetBrains PHPStorm , observe também que: na Run/Debug Configurationsjanela, o Test scopeprecisa ser definido directorye apontar esse diretório para onde seutests pasta está localizada.

Levei apenas meia hora para descobrir que esqueci de definir o diretório. Você pode usar global phpunit.phar, desde que defina o escopo do teste e o diretório corretamente, o IDE cuidará de outras coisas para você.

Zhwt
fonte
-2

usar o console de cmd resolveu esse problema passando no teste de caminho interno

Eu não encontrei outra maneira de fazer isso não funciona dessa forma

Espero que tenha sido útil para alguém

mcrsftDev
fonte
Eu estava tentando fazê-lo funcionar com phpunit definido global e finalmente funcionar dessa forma, estou usando MacOS e a linha de comando éphpunit --debug ./
JRod