1. Pruebas
  2. Pruebas: Introducción

Introducción

Laravel está construido teniendo en cuenta las pruebas. De hecho, el soporte para las pruebas con PHPUnit está incluido de serie y ya se ha configurado un archivo phpunit.xml para tu aplicación. El framework también incluye métodos de ayuda convenientes que te permiten realizar pruebas de forma expresiva en tus aplicaciones.

De forma predeterminada, el directorio tests de tu aplicación contiene dos directorios: Feature y Unit. Las pruebas unitarias son pruebas que se centran en una porción muy pequeña y 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 arrancan tu aplicación Laravel y, por lo tanto, no pueden acceder a la base de datos u otros servicios del framework.

Las pruebas de características pueden probar una porción más grande de tu código, incluido cómo interactúan varios objetos entre sí o incluso una solicitud HTTP completa a un punto final JSON. Generalmente, la mayoría de tus pruebas deberían ser pruebas de características. Estos tipos de pruebas proporcionan la mayor confianza en que tu sistema en su conjunto funciona como se pretende.

Se proporciona un archivo ExampleTest.php en los directorios Feature y Unit. Después de instalar una nueva aplicación Laravel, ejecuta los comandos 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 configurará automáticamente la sesión y la caché con el controlador array mientras se realizan las pruebas.

Eres libre de definir otros valores de configuración del entorno de pruebas según sea necesario. Las variables de entorno testing se pueden configurar en el archivo phpunit.xml de tu aplicación, pero asegúrate de limpiar la caché de configuración con 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 PHPUnit o al ejecutar comandos Artisan con la opción --env=testing.

El rasgo CreatesApplication

Laravel incluye un rasgo CreatesApplication que se aplica a la clase base TestCase de tu aplicación. Este rasgo contiene un método createApplication que inicia la aplicación Laravel antes de ejecutar tus pruebas. Es importante dejar este rasgo en su ubicación original, ya que algunas características, como la función de pruebas paralelas de Laravel, dependen de él.

Creación de pruebas

Para crear un nuevo caso de prueba, utiliza el comando Artisan make:test. De forma predeterminada, 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

Si deseas crear una prueba Pest PHP, puedes proporcionar la opción --pest al comando make:test:

php artisan make:test UserTest --pest
php artisan make:test UserTest --unit --pest

Nota Las plantillas de prueba pueden personalizarse utilizando la publicación de plantillas.

Una vez que se haya generado la prueba, puedes definir los métodos de prueba como lo harías normalmente utilizando PHPUnit. Para ejecutar tus pruebas, ejecuta el comando vendor/bin/phpunit o php artisan test desde tu 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);
}
}

Advertencia Si defines tus propios métodos setUp / tearDown dentro de una clase de prueba, asegúrate de llamar a los métodos parent::setUp() / parent::tearDown() respectivos en la clase padre.

Ejecución de pruebas

Como se mencionó anteriormente, una vez que hayas escrito pruebas, puedes ejecutarlas con phpunit:

./vendor/bin/phpunit

Además del comando phpunit, puedes utilizar el comando Artisan test para ejecutar tus pruebas. El ejecutor de pruebas Artisan proporciona informes detallados de pruebas para facilitar el desarrollo y la depuración:

php artisan test

Cualquier argumento que se pueda pasar al comando phpunit también se puede pasar al comando Artisan test:

php artisan test --testsuite=Feature --stop-on-failure

Ejecución de pruebas en paralelo

De forma predeterminada, Laravel y PHPUnit ejecutan las pruebas secuencialmente dentro de un solo proceso. Sin embargo, puedes reducir significativamente el tiempo que tardan tus pruebas al ejecutarlas simultáneamente en varios procesos. Para empezar, debes instalar el paquete Composer brianium/paratest 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

De forma predeterminada, 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

Advertencia Al ejecutar pruebas en paralelo, algunas opciones de 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 principal, Laravel manejará automáticamente la creación y migración de una base de datos de prueba para cada proceso paralelo que ejecute tus pruebas. Las bases de datos de prueba llevarán un sufijo con un token de proceso único. Por ejemplo, si tienes dos procesos de prueba paralelos, Laravel creará y usará las bases de datos de prueba tu_db_test_1 y tu_db_test_2.

De forma predeterminada, las bases de datos de prueba persisten entre las llamadas al comando Artisan test para que puedan ser utilizadas nuevamente por invocaciones posteriores de test. Sin embargo, puedes recrearlas utilizando la opción --recreate-databases:

php artisan test --parallel --recreate-databases

Ganchos para pruebas paralelas

En ocasiones, es posible que necesites preparar ciertos recursos utilizados por las pruebas de tu aplicación para que puedan ser utilizados de forma segura por varios procesos de prueba.

Usando la fachada ParallelTesting, puedes especificar el código que se ejecutará en el setUp y tearDown de un proceso o caso de prueba. Los cierres dados reciben las variables $token y $testCase que contienen el token de 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
{
/**
* Inicia cualquier servicio de la aplicación.
*/
public function boot(): void
{
ParallelTesting::setUpProcess(function (int $token) {
// ...
});
 
ParallelTesting::setUpTestCase(function (int $token, TestCase $testCase) {
// ...
});
 
// Se ejecuta 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) {
// ...
});
}
}

Acceso al token de pruebas paralelas

Si deseas acceder al "token" actual del proceso paralelo 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 único de cadena para un proceso de prueba individual y se puede utilizar para segmentar recursos entre procesos de prueba paralelos. Por ejemplo, Laravel añade automáticamente este token al final de las bases de datos de prueba creadas por cada proceso de prueba paralelo:

$token = ParallelTesting::token();

Informe de cobertura de pruebas

Advertencia Esta función requiere Xdebug o PCOV.

Al ejecutar las pruebas de tu aplicación, es posible que desees determinar si tus casos de prueba realmente están cubriendo el código de la aplicación y cuánto código de la aplicación se utiliza al ejecutar tus pruebas. Para lograr esto, puedes proporcionar la opción --coverage al invocar el comando test:

php artisan test --coverage

Imponer 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 alcanza este umbral:

php artisan test --coverage --min=80.3

Perfil de pruebas

El ejecutor 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 ver una lista de tus diez pruebas más lentas, lo que te permite investigar fácilmente qué pruebas se pueden mejorar para acelerar tu conjunto de pruebas:

php artisan test --profile