Skip to content

2. Utilizando PHPUnit

Isaac Lourenço edited this page Mar 14, 2021 · 1 revision

Requisitos

  • PHP ^8.0
  • Composer
  • PHPUnit

Não esqueçam de conferir se está tudo instalado executando no terminal:

  • php -v
  • composer
  • phpunit

Passo a passo

  • No projeto, crie o diretório test
  • Crie CalculadoraTest.php
class CalculadoraTest extends PHPUnit\Framework\TestCase {}

A classe utilizada no extends está no namespace ("caminho") PHPUnit\Framework\. Mas fica feião, né? Vamos utilizar o use-as para melhorar isso:

use PHPUnit\Framework\TestCase as PHPUnit;

class CalculadoraTest extends PHPUnit {}
  • Crie o método testSoma()
public function testSoma() {
    $resultado = Calculadora::soma(1, 2);
    
    $this->assertEquals(3, $resultado);
}
  • Crie a classe Calculadora com o método estático soma em src/models/
  • Execute o teste com o comando phpunit test/

Deu erro, certo? Isso porque a classe de teste não conhece a classe Calculadora. Importe. Mas perai, não tem como deixar o import "automático"? Sim. Vamos utilizar o composer para gerar o nosso autoload, ou seja, auto imports.

Crie composer.json na raiz do seu projeto:

{
    "autoload": {
        "classmap": [
            "src/models"
        ]
    }
}

Ou seja, você quer que qualquer classe que estiver no models seja compactada e inclusa automaticamente para utilizar isso nos testes. Agora execute o comando composer install para gerar o seu autoload.php. Em vendor/composer/autoload_classmap.php, veja que a classe Calculadora está inclusa. Vamos testar na classe de teste?

  • Comente a importação da classe Calculadora
  • Execute phpunit test novamente

Não reconheceu a classe Calculadora. Ué?! Calma... na verdade precisamos incluir o autoload para funcionar.

Mas então porque criar esse autoload se eu vou ter que importar da mesma forma? Com ele só é preciso importar um arquivo e todas as outras classes podem ser inclusas.

E quando adicionamos novas classes em models, elas são reconhecidas automaticamente? Não. Temos que rodar composer dump-autoload para ficar atualizando ;(

  • Inclua o autoload na sua classe de teste
<?php
require_once dirname(__FILE__) . "/../vendor/autoload.php";
// classe...

Não tem como deixar esses imports padrão para todos os testes? Tem sim.

  • Crie o arquivo de configuração phpunit.xml na raíz do projeto
<phpunit
    bootstrap="vendor/autoload.php"
    colors="true"
    convertNoticesToExceptions="true"
    convertWarningsToExceptions="true"
    processIsolation="false"
    stopOnFailure="false"
    cacheResult="false"
>
    <testsuites>
        <testsuite name="Testes">
            <directory>test</directory>
        </testsuite>
    </testsuites>
</phpunit>
  • Execute o teste até passar. Pronto!

Quer ver algo legal que dá para fazer? Clique aqui

Veja a documentação do PHPUnit para se aprofundar mais: Documentação PHPUnit

Clone this wiki locally