Mostrando entradas con la etiqueta test. Mostrar todas las entradas
Mostrando entradas con la etiqueta test. Mostrar todas las entradas

domingo, 7 de septiembre de 2025

Unit tests y feature tests en Laravel

 ¿Qué son en Laravel los unit tests y los feature tests?

Ambos son tipos de pruebas automatizadas en Laravel, pero se enfocan en diferentes niveles de tu aplicación. Piensa en ellas como dos formas de evaluar la calidad de tu código: los unit tests examinan los componentes más pequeños, mientras que los feature tests comprueban el comportamiento de la aplicación en su conjunto.


Unit Tests (Pruebas Unitarias)

Un unit test prueba una "unidad" de código de forma aislada. Una unidad es la parte más pequeña que puedes probar de forma lógica, como una única función, un método de una clase o un modelo. El objetivo es verificar que cada pieza individual de tu código funcione correctamente por sí misma, sin depender de otras partes.

  • ¿Qué prueban? Lógica de negocio, cálculos, métodos de modelos o clases de ayuda.

  • ¿Qué NO prueban? Interacción con la base de datos, solicitudes HTTP, vistas, o cualquier cosa que dependa del sistema en su conjunto.

  • Velocidad: Son muy rápidos, ya que no necesitan recursos externos.

  • Ejemplo: Probar que un método en tu clase Calculator devuelva el resultado correcto de una suma, sin importar si está conectado a una interfaz de usuario o a una base de datos.

  • Ejemplo de Unit Test
    <?php

    namespace Tests\Unit;

    use PHPUnit\Framework\TestCase;

    class CalculatorTest extends TestCase
    {
    /** @test */
    public function it_can_add_two_numbers()
    {
    $calculator = new \App\Services\Calculator();
    $result = $calculator->add(5, 3);

    $this->assertEquals(8, $result);
    }
    }

Feature Tests (Pruebas de Funcionalidad)

Un feature test (también llamado prueba de integración) comprueba una "funcionalidad" completa de tu aplicación, como el flujo de un usuario al interactuar con ella. Estas pruebas simulan una petición HTTP real a tu aplicación y verifican el resultado. Su objetivo es asegurar que todos los componentes (rutas, controladores, bases de datos, vistas) trabajen juntos correctamente. .

  • ¿Qué prueban? Flujos de usuario completos, como un registro, un inicio de sesión, el envío de un formulario, o la visualización de una página.

  • ¿Qué NO prueban? La lógica interna de un solo método o función.

  • Velocidad: Son más lentos que las pruebas unitarias porque necesitan cargar la aplicación, interactuar con la base de datos (generalmente una de prueba) y procesar las peticiones.

  • Ejemplo: Simular que un usuario visita la página de un formulario, lo envía con datos válidos y es redirigido a la página de éxito.

  • Ejemplo de Feature Test
    <?php

    namespace Tests\Feature;

    use Illuminate\Foundation\Testing\RefreshDatabase;
    use Illuminate\Foundation\Testing\WithFaker;
    use Tests\TestCase;

    class PostTest extends TestCase
    {
    use RefreshDatabase;

    /** @test */
    public function a_user_can_create_a_post()
    {
    $response = $this->post('/posts', [
    'title' => 'Mi primer post',
    'body' => 'Contenido del post de prueba.',
    ]);

    $response->assertStatus(200);
    $this->assertDatabaseHas('posts', [
    'title' => 'Mi primer post',
    ]);
    }
    }

En Resumen

CaracterísticaUnit TestsFeature Tests
EnfoqueAisladoIntegrado
AlcanceMétodos/FuncionesFlujos completos
VelocidadRápidoLento
PropósitoAsegurar la lógica internaAsegurar el comportamiento de la aplicación

Ambos tipos de pruebas son esenciales para una base de código robusta. Las pruebas unitarias te dan confianza en que tus componentes individuales funcionan, mientras que las pruebas de funcionalidad te aseguran que la aplicación, como un todo, se comporta como se espera.