arrow_back Volver
Inicio keyboard_arrow_right Artículos keyboard_arrow_right Artículo

Crear pruebas automatizadas en Laravel con phpunit

Jonathan Zarate

Developer bankend

av_timer 2 Min. de lectura

remove_red_eye 41966 visitas

calendar_today 09 Julio 2020

Hola developers.

En esta ocasión quiero compartir como empezar a utilizar TDD (Test Driver Development) en nuestros proyectos, especialmente en Laravel.

¿Qué es TDD?

Test-driven development (TDD) es una práctica de ingeniería de software que involucra otras dos prácticas: Escribir las pruebas primero (Test First Development) y posteriormente Refactorización (Refactoring). El propósito del desarrollo guiado por pruebas es lograr un código limpio que funcione. - Desarrollo guiado por pruebas.

Laravel.

Laravel es un framework para el desarrollo de aplicaciones web con PHP que nos permite construir aplicaciones modernas. CodigoFacilito cuenta una especialidad de desarrollo PHP en donde aprendaras desde Programación Orientada Objectos a Laravel avanzado.

Empecemos con crear un nuevo proyecto de laravel utilizando el siguiente comando:

composer create-project --prefer-dist laravel/laravel testing-laravel

En el directorio principal de tu proyecto podras encontrar un directorio llamado /tests. Este directorio está separado en dos subdirectorios:

  • El directorio Feature: donde escribimos pruebas que emulan peticiones HTTP.
  • El directorio Unit: donde escribimos pequeñas partes individuales de la aplicación.

Configurar base de datos.

Ahora abrimos el archivo .env en este archivo es donde colocaremos la configuracion de nuesro proyecto.

    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=testing-laravel
    DB_USERNAME=*****
    DB_PASSWORD=*****

Modulo de login.

Laravel proporciona una forma rapida de generar todas las rutas y vistas que necesita para la autentificación ejecutando el siguiente comando:

php artisan make:auth

Configurar entorno de pruebas

Antes de escribir nuestra primera prueba es necesario configurar nuestro proyecto para ejecutar pruebas unitarias.

  • Configuración del archivo phpunit.xml
<env name="APP_ENV" value="testing"/>
<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
  • Configuración del archivo database.php, el cual lo encontramos en el directorio config/database.php. Debemos dejar la siguiente configuración para el array de 'sqlite'.
'sqlite' => [
    'driver' => 'sqlite',
    'database' => database_path('database.sqlite'),
    'prefix' => '',
],

Creando test.

El comando para generar nuevas pruebas es:

php artisan make:test LoginTest

Llego la hora de crear nuestro primer test, así que abrimos el archivo LoginTest.

En la siguiente prueba simularemos una petición HTTP GET a la URL de login. Con asserStatus comprobamos que la URL carga de forma correcta verificando que el status HTTP sea 200. Con el método assertSee comprobamos que podemos ver el texto “Login”:

/** test */
public function it_visit_page_of_login()
{
    $this->get('/login')
        ->assertStatus(200)
        ->assertSee('Login');
}

Ahora vamos a nuestro terminal y nos posicionamos en nuestro proyecto. Escribimos el siguiente comando para ejecutar nuestro test.

vendor/bin/phpunit --filter it_visit_page_of_login

Agregamos las siguientes pruebas para el módulo de LoginTest.

<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\DatabaseMigrations;
use Tests\TestCase;

class LoginTest extends TestCase
{
    use DatabaseMigrations;

    /** @test */
    public function it_visit_page_of_login()
    {
        $this->get('/login')
            ->assertStatus(200)
            ->assertSee('Login');
    }

    /** @test */
    public function authenticated_to_a_user()
    {
        $user = create('App\User', [
            "email" => "user@mail.com"
        ]);

        $this->get('/login')->assertSee('Login');
        $credentials = [
            "email" => "user@mail.com",
            "password" => "secret"
        ];

        $response = $this->post('/login', $credentials);
        $response->assertRedirect('/home');
        $this->assertCredentials($credentials);
    }

    /** @test */
    public function not_authenticate_to_a_user_with_credentials_invalid()
    {
        $user = create('App\User', [
            "email" => "user@mail.com"
        ]);
        $credentials = [
            "email" => "users@mail.com",
            "password" => "secret"
        ];

        $this->assertInvalidCredentials($credentials);
    }

    /** @test */
    public function the_email_is_required_for_authenticate()
    {
        $user = create('App\User');
        $credentials = [
            "email" => null,
            "password" => "secret"
        ];

        $response = $this->from('/login')->post('/login', $credentials);
        $response->assertRedirect('/login')->assertSessionHasErrors([
            'email' => 'The email field is required.',
        ]);
    }

    /** @test */
    public function the_password_is_required_for_authenticate()
    {
        $user = create('App\User', ['email' => 'zaratedev@gmail.com']);
        $credentials = [
            "email" => "zaratedev@gmail.com",
            "password" => null
        ];

        $response = $this->from('/login')->post('/login', $credentials);
        $response->assertRedirect('/login')
            ->assertSessionHasErrors([
                'password' => 'The password field is required.',
            ]);
    }
}

Conclusión

Cuando empiezas a escribir pruebas automatizadas te daras cuenta la importancia que tiene realizar primero un test antes de empezar a escribir código. Esto te ayudara a desarrollar tu habilidad de lógica al resolver problemas. Espero que te halla agradado este artículo. Es mi primer artículo aquí en la comunidad de codigofacilito, espero que sea el primero de muchos :D

Puedes seguirme en twitter como zaratedev donde comparto cosas de desarrollo y algunos memes. :D

Tambien aquí el repositorio testing-laravel

Saludos!