Testes com PHP Unit 9
- Os usuários podem dar lances em um leilão
- Um leiloeiro avalia o leilão informando qual o maior valor de lance, qual o menor valor e os 3 maiores lances
- Um usuário não pode dar dois lances consecutivos
- Um usuário só pode dar no máximo 5 lances
- Testes devem ser criados para verificar essas especificações
Para gerar o autoload do composer
composer dump
composer require --dev phpunit/phpunit ^9
vendor\bin\phpunit --version
- Criar uma pasta "tests" na raiz
- Dentro da pasta "tests" criar uma pasta "Service" porque a classe a ser testada está na pasta "Service" dentro de src
- Nomear o arquivo com NomeDaClasse + sufixo "Test". Ex: AvaliadorTest.php
- Nomes de métodos devem começar com "test" ou ter a anotação @test
Toda classe de teste precisa estender TestCase.
É importante dar nomes descritivos ao métodos dessa classe.
<?php
namespace Alura\Leilao\Tests\Service;
use PHPUnit\Framework\TestCase;
class AvaliadorTest extends TestCase
{
}
$this->assertEquals(2500, $maiorValor);
static::assertCount(3, $maiores);
vendor\bin\phpunit tests
vendor\bin\phpunit --colors tests
Uma forma de fornecer dados pros testes. A anotação faz com que o teste seja executado utilizando os parâmetros passados pelo método entregaLeiloes() 3x (uma utilizando dados em ordem crescente, outra descrescente e uma aleatória).
/**
* @dataProvider entregaLeiloes
*/
public function testAvaliadorDeveEncontrarOMaiorValorDeLances($leilao)
{
...
}
public function entregaLeiloes()
{
return [
[$this->leilaoEmOrdemCrescente()],
[$this->leilaoEmOrdemDecrescente()],
[$this->leilaoEmOrdemAleatoria()],
];
}
Outra forma
/**
* @dataProvider leilaoEmOrdemCrescente
* @dataProvider leilaoEmOrdemDecrescente
* @dataProvider leilaoEmOrdemAleatoria
*/
public function testAvaliadorDeveEncontrarOMaiorValorDeLances(Leilao $leilao)
{
...
}
public function leilaoEmOrdemAleatoria()
{
...
return [
[$leilao]
];
}
public function leilaoEmOrdemCrescente()
{
...
return [
[$leilao]
];
}
public function leilaoEmOrdemDecrescente()
{
...
return [
[$leilao]
];
}
Método executado antes de cada teste.
protected function setUp() : void
{
$this->leiloeiro = new Avaliador();
}
Método executado após cada teste.
Método executado antes de todos os testes.
Método executado depois de todos os testes.
É possivel configurar algumas coisas, como, por exemplo, habilitar as cores e qual diretório de testes.
<phpunit colors="true">
<testsuites>
<testsuite name="unit">
<directory>tests</directory>
</testsuite>
</testsuites>
</phpunit>
vendor\bin\phpunit
<logging>
<log type="testdox-text" target="testes-executados.txt"/>
</logging>
Ciclo de desenvolvimento guiado a testes. Primeiro criar um teste, depois implementar a funcionalidade e depois refatorar.
Verifica se foi lançada uma exceção do tipo DomainException com a seguinte mensagem:
$this->expectException(\DomainException::class);
$this->expectExceptionMessage('Não é possivel avaliar leilão vazio.');