Pruebas en PHP: frameworks y herramientas
La calidad del código es la base de un proyecto web exitoso. Para los desarrolladores de PHP, las pruebas han dejado de ser una opción y se han convertido en una etapa obligatoria del desarrollo. En este artículo analizaremos tres herramientas clave: PHPUnit (estándar de la industria), Pest (minimalismo moderno) y Codeception (pruebas de integración). Aprenderá a escribir pruebas unitarias, trabajar con objetos mock e implementar TDD en proyectos PHP.
1. PHPUnit — fundamento de las pruebas en PHP
PHPUnit es el estándar de facto para las pruebas unitarias en PHP. Forma parte de Symfony, Laravel y otros frameworks populares.
Instalación y prueba básica
composer require --dev phpunit/phpunitEjemplo de una prueba simple para una clase 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)); }}Trabajo con objetos mock
PHPUnit proporciona un mecanismo integrado para crear simulaciones (mock):
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 — sintaxis elegante para pruebas
Pest es un envoltorio sobre PHPUnit que ofrece una sintaxis más concisa y legible. Ideal para proyectos donde la velocidad de escritura de pruebas es importante.
Instalación y ejemplo
composer require --dev pestphp/pestCompárelo con PHPUnit: la misma prueba en Pest se ve así:
// tests/CalculatorTest.phpit('calculates addition', function () { $calc = new Calculator(); expect($calc->add(2, 2))->toBe(4);});Funcionalidades avanzadas
- Higher Order Tests — cadenas de llamadas sin anidamiento
- Architecture Testing — verificación de la estructura de clases
- Snapshot Testing — comparación con datos de referencia
3. Codeception — para pruebas de integración y funcionales
Codeception combina pruebas unitarias, funcionales y de aceptación en un solo framework. Es compatible con Selenium, Symfony, Laravel, Yii e incluso WordPress.
Estructura de las pruebas
codecept generate:cest acceptance LoginCestEjemplo de una prueba 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. Herramientas adicionales
- Mockery — biblioteca flexible para objetos mock (alternativa a los mocks integrados de PHPUnit)
- PHPStan / Psalm — análisis estático que detecta errores antes de ejecutar las pruebas
- Infection — pruebas de mutación: verifica la calidad de las propias pruebas
- PHP CodeSniffer — control de cumplimiento de PSR-12
5. Ejemplo práctico: TDD para un servicio de API
Implementamos un ciclo simple de TDD (Test-Driven Development) para un servicio de pedidos:
Paso 1. Escribimos la prueba
// tests/OrderServiceTest.phppublic function testCrea También en la biblioteca
Generación de informes PDF en PHP: revisión de bibliotecas y ejemplos
Biblioteca WebSocket Gorilla para Go (Golang) — guía completa
Prost para Rust: guía completa con ejemplos
Hibernate ORM: Potente herramienta para trabajar con bases de datos en Java