Testes em PHP: visão geral de frameworks e ferramentas (PHPUnit, Pest, Codeception)

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Testes em PHP: frameworks e ferramentas



A qualidade do código é a base de um projeto web de sucesso. Para desenvolvedores PHP, os testes deixaram de ser uma opção e se tornaram uma etapa obrigatória do desenvolvimento. Neste artigo, analisaremos três ferramentas principais: PHPUnit (padrão da indústria), Pest (minimalismo moderno) e Codeception (testes de integração). Você aprenderá como escrever testes unitários, trabalhar com objetos mock e implementar TDD em projetos PHP.



1. PHPUnit — a base dos testes PHP



PHPUnit é o padrão de facto para testes unitários em PHP. Ele faz parte do Symfony, Laravel e outros frameworks populares.



Instalação e teste básico

composer require --dev phpunit/phpunit


Exemplo de um teste simples para uma classe de calculadora:

// src/Calculator.phpclass Calculator {    public function add($a, $b) {        return $a + $b;    }}

// tests/CalculatorTest.phpuse PHPUnit\\Framework\\TestCase;

class CalculatorTest extends TestCase { public function testAddition() { $calc = new Calculator(); $this->assertEquals(4, $calc->add(2, 2)); }}


Trabalhando com objetos mock

O PHPUnit fornece um mecanismo embutido para criar stubs (mocks):

public function testUserRepository() {    $mockRepo = $this->createMock(UserRepository::class);    $mockRepo->method('findById')             ->willReturn(new User(1, 'Alice'));

$service = new UserService($mockRepo); $result = $service->getUser(1); $this->assertEquals('Alice', $result->getName());}


2. Pest — sintaxe elegante para testes



Pest é um wrapper sobre o PHPUnit que oferece uma sintaxe mais concisa e legível. Ideal para projetos onde a velocidade de escrita dos testes é importante.



Instalação e exemplo

composer require --dev pestphp/pest


Compare com o PHPUnit: o mesmo teste no Pest fica assim:

// tests/CalculatorTest.phpit('calculates addition', function () {    $calc = new Calculator();    expect($calc->add(2, 2))->toBe(4);});


Recursos avançados

  • Higher Order Tests — encadeamento de chamadas sem aninhamento
  • Architecture Testing — verificação da estrutura das classes
  • Snapshot Testing — comparação com dados de referência


3. Codeception — para testes de integração e funcionais



Codeception combina testes unitários, funcionais e de aceitação em um único framework. Suporta Selenium, Symfony, Laravel, Yii e até WordPress.



Estrutura dos testes

codecept generate:cest acceptance LoginCest


Exemplo de um teste funcional para Laravel:

// tests/functional/UserCest.phpclass UserCest {    public function testLogin(FunctionalTester $I) {        $I->amOnPage('/login');        $I->fillField('email', 'user@example.com');        $I->fillField('password', 'secret');        $I->click('Login');        $I->see('Dashboard');    }}


4. Ferramentas adicionais



  • Mockery — biblioteca flexível para objetos mock (alternativa aos mocks embutidos do PHPUnit)
  • PHPStan / Psalm — análise estática que identifica erros antes da execução dos testes
  • Infection — teste de mutação: verifica a qualidade dos próprios testes
  • PHP CodeSniffer — controle de conformidade com PSR-12


5. Exemplo prático: TDD para um serviço de API



Vamos implementar um ciclo simples de TDD (Test-Driven Development) para um serviço de pedidos:



Passo 1. Escrevemos o teste

// tests/OrderServiceTest.phppublic function testCrea                    

Recommendations