Pruebas: Introducción
Introducción
Laravel está construido pensando en las pruebas. De hecho, se incluye soporte para pruebas con Pest y PHPUnit desde el principio, y ya se ha configurado un archivo phpunit.xml
para tu aplicación. El framework también viene con métodos auxiliares convenientes que te permiten probar tus aplicaciones de manera expresiva.
Por defecto, el directorio tests
de tu aplicación contiene dos directorios: Feature
y Unit
. Las pruebas unitarias son pruebas que se enfocan en una porción muy pequeña e aislada de tu código. De hecho, la mayoría de las pruebas unitarias probablemente se centren en un solo método. Las pruebas dentro de tu directorio de pruebas "Unit" no inician tu aplicación Laravel y, por lo tanto, no pueden acceder a la base de datos de tu aplicación u otros servicios del framework.
Las pruebas de características pueden probar una porción más grande de tu código, incluyendo cómo varios objetos interactúan entre sí o incluso una solicitud HTTP completa a un endpoint JSON. En general, la mayoría de tus pruebas deberían ser pruebas de características. Este tipo de pruebas ofrecen la mayor confianza de que tu sistema en su conjunto está funcionando como se esperaba.
Se proporciona un archivo ExampleTest.php
en los directorios de pruebas Feature
y Unit
. Después de instalar una nueva aplicación Laravel, ejecuta los comandos vendor/bin/pest
, vendor/bin/phpunit
o php artisan test
para ejecutar tus pruebas.
Entorno
Al ejecutar pruebas, Laravel configurará 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é en el driver array
para que no se persista ningún dato de sesión o de caché mientras se realizan las pruebas.
Puedes definir otros valores de configuración del entorno de prueba según sea necesario. Las variables de entorno testing
pueden configurarse en el archivo phpunit.xml
de tu aplicación, ¡pero asegúrate de borrar la caché de configuración utilizando el comando Artisan config:clear
antes de ejecutar tus pruebas!
El archivo de entorno .env.testing
Además, puedes crear un archivo .env.testing
en la raíz de tu proyecto. Este archivo se utilizará en lugar del archivo .env
al ejecutar pruebas con Pest y PHPUnit o al ejecutar comandos Artisan con la opción --env=testing
.
Creando Pruebas
Para crear un nuevo caso de prueba, utiliza el comando Artisan make:test
. Por defecto, las pruebas se colocarán en el directorio tests/Feature
:
php artisan make:test UserTest
Si deseas crear una prueba dentro del directorio tests/Unit
, puedes usar la opción --unit
al ejecutar el comando make:test
:
php artisan make:test UserTest --unit
[!NOTE] Los stubs de prueba se pueden personalizar utilizando la publicación de stubs. Una vez que se ha generado la prueba, puedes definir la prueba como lo harías normalmente utilizando Pest o PHPUnit. Para ejecutar tus pruebas, ejecuta el comando
vendor/bin/pest
,vendor/bin/phpunit
ophp artisan test
desde tu terminal:
<?php test('basic', function () { expect(true)->toBeTrue();});
<?php namespace Tests\Unit; use PHPUnit\Framework\TestCase; class ExampleTest extends TestCase{ /** * A basic test example. */ public function test_basic_test(): void { $this->assertTrue(true); }}
[!WARNING] Si defines tus propios métodos
setUp
/tearDown
dentro de una clase de prueba, asegúrate de llamar a los respectivos métodosparent::setUp()
/parent::tearDown()
en la clase padre. Típicamente, deberías invocarparent::setUp()
al inicio de tu propio métodosetUp
, yparent::tearDown()
al final de tu métodotearDown
.
Ejecución de Pruebas
Como se mencionó anteriormente, una vez que hayas escrito las pruebas, puedes ejecutarlas utilizando pest
o phpunit
:
./vendor/bin/pest
./vendor/bin/phpunit
Además de los comandos pest
o phpunit
, puedes usar el comando Artisan test
para ejecutar tus pruebas. El runner de pruebas Artisan proporciona informes de prueba verbosos para facilitar el desarrollo y la depuración:
php artisan test
Cualquier argumento que se puede pasar a los comandos pest
o phpunit
también se puede pasar al comando Artisan test
:
php artisan test --testsuite=Feature --stop-on-failure
Ejecutando Pruebas en Paralelo
Por defecto, Laravel y Pest / PHPUnit ejecutan tus pruebas de forma secuencial dentro de un solo proceso. Sin embargo, puedes reducir significativamente el tiempo que lleva ejecutar tus pruebas ejecutándolas de forma simultánea a través de múltiples procesos. Para comenzar, debes instalar el paquete brianium/paratest
de Composer como una dependencia "dev". Luego, incluye 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 estén disponibles en tu máquina. Sin embargo, puedes ajustar el número de procesos utilizando la opción --processes
:
php artisan test --parallel --processes=4
[!WARNING] Cuando se ejecutan pruebas en paralelo, algunas opciones de Pest / PHPUnit (como
--do-not-cache-result
) pueden no estar disponibles.
Pruebas Paralelas y Bases de Datos
Siempre que hayas configurado una conexión de base de datos primaria, Laravel maneja automáticamente la creación y migración de una base de datos de pruebas para cada proceso paralelo que esté ejecutando tus pruebas. Las bases de datos de prueba se sufijan con un token de proceso que es único por proceso. Por ejemplo, si tienes dos procesos de prueba paralelos, Laravel creará y utilizará 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 las llamadas al comando Artisan test
para que puedan ser utilizadas nuevamente en invocaciones posteriores de test
. Sin embargo, puedes volver a crearlas utilizando la opción --recreate-databases
:
php artisan test --parallel --recreate-databases
Hooks de Pruebas Paralelas
Occasionalmente, es posible que debas preparar ciertos recursos utilizados por las pruebas de tu aplicación para que puedan ser utilizados de manera segura por múltiples procesos de prueba.
Usando la facade ParallelTesting
, puedes especificar el código que se ejecutará en el setUp
y tearDown
de un proceso o caso de prueba. Las funciones anónimas
dadas 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{ /** * Bootstrap any application services. */ public function boot(): void { ParallelTesting::setUpProcess(function (int $token) { // ... }); ParallelTesting::setUpTestCase(function (int $token, TestCase $testCase) { // ... }); // Executed when a test database is created... 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 deseas acceder al "token" del proceso paralelo actual desde cualquier otra ubicación en el código de prueba de tu aplicación, puedes usar el método token
. Este token es un identificador de cadena único para un proceso de prueba individual y se puede usar para segmentar recursos a través de procesos de prueba paralelos. Por ejemplo, Laravel automáticamente añade este token al final de las bases de datos de prueba creadas por cada proceso de prueba paralelo:
$token = ParallelTesting::token();
Informando la Cobertura de Pruebas
[!WARNING] Esta función requiere Xdebug o PCOV. Al realizar las pruebas de tu aplicación, es posible que desees determinar si tus casos de prueba están cubriendo realmente el código de la aplicación y cuánta código de la aplicación se utiliza al ejecutar tus pruebas. Para lograr esto, puedes proporcionar la opción
--coverage
al invocar el comandotest
:
php artisan test --coverage
Haciendo Cumplir un Umbral Mínimo de Cobertura
Puedes usar la opción --min
para definir un umbral mínimo de cobertura de pruebas para tu aplicación. El conjunto de pruebas fallará si no se cumple este umbral:
php artisan test --coverage --min=80.3
Pruebas de Perfilado
El runner de pruebas Artisan también incluye un mecanismo conveniente para listar las pruebas más lentas de tu aplicación. Invoca el comando test
con la opción --profile
para que se te presente una lista de tus diez pruebas más lentas, lo que te permitirá investigar fácilmente qué pruebas se pueden mejorar para acelerar tu suite de pruebas:
php artisan test --profile