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/phpunitExemplo 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/pestCompare 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 LoginCestExemplo 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 Também na biblioteca
Biblioteca Padrão TypeScript: guia completo para desenvolvedores
Parsing de HTML em TypeScript: bibliotecas, ferramentas e exemplos de código
Cliente HTTP para Kotlin: Principais bibliotecas para trabalhar com rede
Aprendizado de Máquina em JavaScript: bibliotecas para Node.js — visão geral e exemplos
mapstructure para Go: guia completo com exemplos práticos