#Introducción
Laravel está diseñado pensando en las pruebas. De hecho, el soporte para pruebas con PHPUnit viene incluido por defecto y un archivo phpunit.xml ya está configurado para su aplicación. El framework también incluye métodos auxiliares convenientes que le permiten probar sus aplicaciones de manera expresiva.
Por defecto, el directorio tests de su aplicación contiene dos carpetas: Feature y Unit. Las pruebas unitarias son pruebas que se enfocan en una porción muy pequeña y aislada de su código. De hecho, la mayoría de las pruebas unitarias probablemente se centren en un solo método. Las pruebas dentro del directorio "Unit" no arrancan su aplicación Laravel y, por lo tanto, no pueden acceder a la base de datos de su aplicación ni a otros servicios del framework.
Las pruebas de características pueden evaluar una porción más grande de su código, incluyendo cómo varios objetos interactúan entre sí o incluso una solicitud HTTP completa a un endpoint JSON. Generalmente, la mayoría de sus pruebas deberían ser pruebas de características. Este tipo de pruebas brinda la mayor confianza de que su sistema en su conjunto funciona como se espera.
Se proporciona un archivo ExampleTest.php tanto en los directorios de pruebas Feature como Unit. Después de instalar una nueva aplicación Laravel, ejecute los comandos vendor/bin/phpunit o php artisan test para correr sus pruebas.
#Entorno
Al ejecutar pruebas, Laravel establecerá automáticamente el entorno de configuración en testing debido a las variables de entorno definidas en el archivo phpunit.xml. Laravel también configura automáticamente la sesión y la caché para usar el controlador array para que ningún dato de sesión o caché se persista durante las pruebas.
Usted es libre de definir otros valores de configuración para el entorno de pruebas según sea necesario. Las variables de entorno testing pueden configurarse en el archivo phpunit.xml de su aplicación, pero asegúrese de limpiar la caché de configuración usando el comando Artisan config:clear antes de ejecutar sus pruebas.
#El archivo de entorno .env.testing
Además, puede crear un archivo .env.testing en la raíz de su proyecto. Este archivo se usará en lugar del archivo .env al ejecutar pruebas con PHPUnit o comandos Artisan con la opción --env=testing.
#El trait CreatesApplication
Laravel incluye un trait CreatesApplication que se aplica a la clase base TestCase de su aplicación. Este trait contiene un método createApplication que arranca la aplicación Laravel antes de ejecutar sus pruebas. Es importante que deje este trait en su ubicación original, ya que algunas características, como la ejecución paralela de pruebas de Laravel, dependen de él.
#Creación de pruebas
Para crear un nuevo caso de prueba, use el comando Artisan make:test. Por defecto, las pruebas se colocarán en el directorio tests/Feature:
php artisan make:test UserTest
Si desea crear una prueba dentro del directorio tests/Unit, puede usar la opción --unit al ejecutar el comando make:test:
php artisan make:test UserTest --unit
Si desea crear una prueba con Pest PHP, puede proporcionar la opción --pest al comando make:test:
php artisan make:test UserTest --pest
php artisan make:test UserTest --unit --pest
Los stubs de prueba pueden personalizarse usando la publicación de stubs.
Una vez que la prueba ha sido generada, puede definir métodos de prueba como normalmente lo haría usando PHPUnit. Para ejecutar sus pruebas, ejecute el comando vendor/bin/phpunit o php artisan test desde su terminal:
<?php
namespace Tests\Unit;
use PHPUnit\Framework\TestCase;
class ExampleTest extends TestCase
{
/**
* Un ejemplo básico de prueba.
*/
public function test_basic_test(): void
{
$this->assertTrue(true);
}
}
Si define sus propios métodos setUp / tearDown dentro de una clase de prueba, asegúrese de llamar a los métodos respectivos parent::setUp() / parent::tearDown() de la clase padre. Normalmente, debe invocar parent::setUp() al inicio de su propio método setUp y parent::tearDown() al final de su método tearDown.
#Ejecución de pruebas
Como se mencionó anteriormente, una vez que haya escrito pruebas, puede ejecutarlas usando phpunit:
./vendor/bin/phpunit
Además del comando phpunit, puede usar el comando Artisan test para ejecutar sus pruebas. El ejecutor de pruebas Artisan proporciona reportes detallados para facilitar el desarrollo y la depuración:
php artisan test
Cualquier argumento que pueda pasarse al comando phpunit también puede pasarse al comando Artisan test:
php artisan test --testsuite=Feature --stop-on-failure
#Ejecución de pruebas en paralelo
Por defecto, Laravel y PHPUnit ejecutan sus pruebas secuencialmente dentro de un solo proceso. Sin embargo, puede reducir considerablemente el tiempo que toma ejecutar sus pruebas ejecutándolas simultáneamente en múltiples procesos. Para comenzar, debe instalar el paquete Composer brianium/paratest como dependencia "dev". Luego, incluya la opción --parallel al ejecutar el comando Artisan test:
composer require brianium/paratest --dev
php artisan test --parallel
Por defecto, Laravel creará tantos procesos como núcleos de CPU disponibles tenga su máquina. Sin embargo, puede ajustar el número de procesos usando la opción --processes:
php artisan test --parallel --processes=4
Al ejecutar pruebas en paralelo, algunas opciones de PHPUnit (como --do-not-cache-result) pueden no estar disponibles.
#Pruebas paralelas y bases de datos
Mientras haya configurado una conexión principal a la base de datos, Laravel maneja automáticamente la creación y migración de una base de datos de prueba para cada proceso paralelo que ejecuta sus pruebas. Las bases de datos de prueba tendrán un sufijo con un token de proceso único por proceso. Por ejemplo, si tiene dos procesos de prueba paralelos, Laravel creará y usará las bases de datos de prueba your_db_test_1 y your_db_test_2.
Por defecto, las bases de datos de prueba persisten entre llamadas al comando Artisan test para que puedan usarse nuevamente en invocaciones posteriores de test. Sin embargo, puede recrearlas usando la opción --recreate-databases:
php artisan test --parallel --recreate-databases
#Hooks para pruebas paralelas
Ocasionalmente, puede necesitar preparar ciertos recursos usados por las pruebas de su aplicación para que puedan usarse de forma segura por múltiples procesos de prueba.
Usando la fachada ParallelTesting, puede especificar código que se ejecute en el setUp y tearDown de un proceso o caso de prueba. Las closures recibidas reciben las variables $token y $testCase que contienen el token del proceso y el caso de prueba actual, respectivamente:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\ParallelTesting;
use Illuminate\Support\ServiceProvider;
use PHPUnit\Framework\TestCase;
class AppServiceProvider extends ServiceProvider
{
/**
* Inicializar cualquier servicio de la aplicación.
*/
public function boot(): void
{
ParallelTesting::setUpProcess(function (int $token) {
// ...
});
ParallelTesting::setUpTestCase(function (int $token, TestCase $testCase) {
// ...
});
// Ejecutado cuando se crea una base de datos de prueba...
ParallelTesting::setUpTestDatabase(function (string $database, int $token) {
Artisan::call('db:seed');
});
ParallelTesting::tearDownTestCase(function (int $token, TestCase $testCase) {
// ...
});
ParallelTesting::tearDownProcess(function (int $token) {
// ...
});
}
}
#Accediendo al token de pruebas paralelas
Si desea acceder al "token" del proceso paralelo actual desde cualquier otro lugar en el código de prueba de su aplicación, puede usar el método token. Este token es un identificador único de tipo string para un proceso de prueba individual y puede usarse para segmentar recursos entre procesos de prueba paralelos. Por ejemplo, Laravel agrega automáticamente este token al final de las bases de datos de prueba creadas por cada proceso de pruebas paralelas:
$token = ParallelTesting::token();
#Reporte de cobertura de pruebas
Al ejecutar las pruebas de su aplicación, puede querer determinar si sus casos de prueba realmente cubren el código de la aplicación y cuánto código se utiliza al ejecutar sus pruebas. Para lograr esto, puede proporcionar la opción --coverage al invocar el comando test:
php artisan test --coverage
#Imponer un umbral mínimo de cobertura
Puede usar la opción --min para definir un umbral mínimo de cobertura de pruebas para su aplicación. El conjunto de pruebas fallará si no se cumple este umbral:
php artisan test --coverage --min=80.3
#Perfilado de pruebas
El ejecutor de pruebas Artisan también incluye un mecanismo conveniente para listar las pruebas más lentas de su aplicación. Ejecute el comando test con la opción --profile para obtener una lista de sus diez pruebas más lentas, lo que le permitirá investigar fácilmente qué pruebas pueden mejorarse para acelerar su suite de pruebas:
php artisan test --profile