Testing en Laravel: Tests HTTP

Testing en Laravel
Solucionex
03
Nov 25

Hoy en día, cuando desarrollamos una aplicación, no basta con desarrollarla y darla por terminada. Sabemos que cualquier cambio, por pequeño que sea, puede llegar a romper la aplicación sin llegar a darnos cuenta. Para evitar este tipo de "problemas" y estar horas y horas buscando errores, es clave contar con pruebas automatizadas. 

Laravel trae herramientas de testing que nos permiten comprobar que todo siga funcionando. Desde el punto de revisar una funcionalidad específica o el simular cómo un usuario real usa la aplicación.

En este artículo vamos a hacer una breve introducción al testing en Laravel con PHPUnit, explicando los diferentes tipos de tests que tenemos disponibles y cómo pueden hacer nuestro código más confiable.

 

Creando nuestros tests

Cuando ejecutemos nuestros tests, Laravel detecta que está en modo testing y ajustará lo necesario para que no se interfiera con los datos reales. También podemos crear un archivo .env.testing para separar las variables específicas del entorno de pruebas.

 

Para crear nuestro primer test es tan simple como:

php artisan make:test ArticleTest

Cuando el comando termine su ejecución, podemos abrir su respectivo archivo y editarlo. Por ahora, vamos a hacer algo muy simple que siempre esté OK:

<?php

namespace Tests\Unit;

use PHPUnit\Framework\TestCase;

class ArticleTest extends TestCase
{
	public function test(): void
	{
		$this->assertTrue(true);
	}
}

Para lanzar nuestro test, bastaría con el siguiente comando:

php artisan test

Y tendríamos que ver en la consola algo similar a esto:

   PASS  Tests\Unit\ArticleTest
  ✓ test

Tests:  1 passed

Con esto habríamos realizado nuestro primer test con éxito (con un poco de trampa 😜​). En los siguientes apartados hablaremos sobre los tipos de test HTTP que podemos realizar en Laravel.

 

HTTP Tests

Este tipo de tests nos permiten simular en cierto modo las peticiones que un usuario podría hacer en la aplicación y luego inspeccionar la respuesta. Gracias a esto podemos comprobar que rutas, controladores, vistas, etc. funcionan correctamente.

Peticiones

Para hacer una petición a nuestra aplicación, debemos invocar el método necesario para ejecutar nuestro test. Esta petición es simulada, por lo que no es una petición real a nuestra aplicación.

Por ejemplo, podemos comprobar si una ruta funciona de la siguiente manera:

<?php

namespace Tests\Feature;

use Test\TestCase;

class ArticleTest extends TestCase
{
	public function get_article_page_test(): void
	{
		$response = $this->get('/articles');
		$response->assertStatus(200);
	}
}

Si el test es correcto, nos lo indicará en la terminal. En el caso del entorno de tests, Laravel no nos devolverá como respuesta una instancia de Illuminate\Http\Response, sino una instancia de Illuminate\Testing\TestResponse, la cual nos ofrece una gran variedad de assertions para inspeccionar las respuestas de nuestra aplicación.

Si es necesario, también podemos usar diferentes métodos por ejemplo para editar los headers, usar cookies, etc. Todo esto está disponible en la documentación oficial de Laravel, en la sección de HTTP Tests.

APIs JSON

Laravel también nos ofrece un gran abanico de helpers para poder realizar testing sobre nuestras APIs JSON. En el siguiente ejemplo, veremos como podemos hacer una petición GET a nuestra API y manejar la respuesta:

<?php

namespace Tests\Feature;

use Tests\TestCase;

class ArticleTest extends TestCase
{
	public function test_api_request(): void
	{
		$response = $this->getJson('/api/article/1');
		
		// Comprobamos que la respuesta es correcta
		$response->assertStatus(200)
		// Comprobamos que la estructura de la respuesta es la siguiente
		$response->assertJsonStructure([
			'id',
			'title',
			'created_at'
		]);
	}
}

Testing en las vistas

Laravel nos permite verificar que nuestras plantillas o componentes renderizan correctamente mediante una petición HTTP totalmente simulada a la aplicación. Para lograr esto, llamaremos al método view, el cual acepta el nombre de la vista y un array de datos totalmente opcional. Este método devuelve una instancia de Illuminate\Testing\TestView:

<?php

namespace Test\Feature;

use Tests\TestCase;

class ArticleTest extends TestCase
{
	public function test_article_view(): void
	{
		$view = $this->view('articles');
		
		// Comprobamos si en la vista que nos devuelve, podemos ver escrito Lista de Artículos
		$view->assertSee('Lista de Artículos');
	}
}

Al igual que renderizamos vistas, también podemos renderizar componentes Blade, en este caso llamando al método blade.

Asserts disponibles

La clase de Laravel Illuminate\Testing\TestResponse nos ofrece una variedad de asserts personalizados que podemos utilizar en el testing de nuestra aplicación. Puedes encontrar todos los asserts disponibles en el siguiente enlace.

 

Conclusión

Realizar tests HTTP en Laravel no solo garantiza que nuestras rutas y controladores funcionen correctamente, sino que mejora la mantenibilidad del código. Gracias al entorno de pruebas que nos ofrece Laravel, podemos verificar el comportamiento de nuestra aplicación sin necesidad de levantar un servidor real y hacer las pruebas por nuestra cuenta.

 

 

Fuentes

Documentación oficial de Laravel.

 

La imagen del artículo ha sido generada mediante ChatGPT5.

laravel