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.

É 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!


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!


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.


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 {...}

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

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


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 /



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


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


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


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


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.


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)


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


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". :)


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.


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


0

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


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


-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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.