Tests en Laravel

  • Laravel viene preparado para usar phpunit desde el inicio
  • Podemos crear casos de test mediante artisan:

    php artisan make:test StudyTest

  • Los casos de test son clases que heredan de la clase TestCase (tests/TestCase.php).

  • Nomenclatura:

    • Para probar el controlador ExampleController usaremos ExampleTest.
    • Dentro de cada clase de test podemos añadir tantos métodos como necesitemos con la nomenclatura testNombreMetodo. OJO, debe empezar por test...
  • Para ejecutar los test, desde la consola y en el directorio del proyecto ejecutamos: ./vendor/bin/phpunit

Ejemplos de tests

Empezando

  • Aquí vemos la estructura de la clase y la nomenclatura.
  • Ejemplo 1.
    • visit(): visitar una URL.
    • see(): comprobar que se localiza un texto
    • dontSee(): viceversa
<?php

use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\DatabaseTransactions;

class ExampleTest extends TestCase
{
    /**
     * A basic functional test example.
     *
     * @return void
     */
    public function testBasicExample()
    {
        $response = $this->get('/');

        $response->assertSee('Laravel');
        $response->assertStatus(200);

    }
}

Bases de datos

  • ¿Cómo probar el comportamiento de la aplicación para una tabla vacía y la misma tabla con una colección de registros?

  • La solución pasa por:

    • Crear una base de datos para los test.

    • Crear las condiciones deseadas en cada test.

  • Para logralo debemos hace varias cosas:

Base de datos de pruebas

  • Crear bbdd nueva en Mysql. Por ejemplo le llamamos laravel18test
  • En phpunit.xml agregar un parámetro referido a la nueva conexión:

    <php>
    ...
    <env name="DB_DATABASE" value="laravel18test"/> //nuevo
    </php>
    
  • En cada clase de Test debemos importar y usar el trait RefreshDatabase:
use Illuminate\Foundation\Testing\RefreshDatabase;

class UsersModuleTest extends TestCase
{
    use RefreshDatabase;

    // ...
  • OJO. Ahora en cada test partimos de una base de datos limpia. Con las migraciones recien hechas y sin registros sembrados.

Vamos a ver una colección de posibles test para verificar el funcionamiento de un CRUD sobre la tabla usuarios.

  • Lista vacía de usuarios
  public function test_lista_de_usuarios_vacia()
  {
      $response = $this->get('/users');
      $response->assertStatus(200);
      $response->assertSee('Lista de usuarios');
      $response->assertSee('No hay usuarios');
  }
  • Lista de usuarios con datos:

    • Primera aproximación. Fallará porque partimos de una tabla vacía:
  public function test_lista_de_usuarios()
  {
      $response = $this->get('/users');
      $response->assertStatus(200);
      $response->assertSee('Lista de usuarios');
      $response->assertSee('Pepe');
      $response->assertSee('[email protected]');
  }
  • Test correcto. Usar factories para crear registros antes del test.

  public function test_lista_de_usuarios()
  {
      factory(User::class)->create([
          'name' => 'Pepe',
          'email' => '[email protected]'
      ]);

      $response = $this->get('/users');
      $response->assertStatus(200);
      $response->assertDontSee('No hay usuarios');
      $response->assertSee('Lista de usuarios');
      $response->assertSee('Pepe');
      $response->assertSee('[email protected]');
  }
  • Detalle de un registro:
    public function test_metodo_show_user_1()
  {
      factory(User::class)->create([
          'id' => 1,
          'name' => 'Pepe',
          'email' => '[email protected]'
      ]);

      $response = $this->get('/users/1');
      $response->assertStatus(200);
      $response->assertSee('detalle del usuario 1');
      $response->assertSee('Pepe');
      $response->assertSee('[email protected]');
  }
  • Detalle de un registro con error 404:
    public function test_metodo_show_user_inexistente()
    {
        $response = $this->get('/users/100000');
        $response->assertStatus(404);
    }
    

Ver cambios en la base de datos

  • Problema. ¿He actualizado la base de datos realmente?

    • Está esta información??
      ->assertDatabaseHas($table, array $data)
      
    • Ya no está esta otra??

      ->assertDatabaseMissing($table, array $data) // no esta´en la BBDD
      ->assertSoftDeleted($table, array $data) //Comprobación de borrado "blando", no explicado.
      

Test en el navegador: Laravel Dusk

  • Enlaces de interés:

  • Dusk usa directamente un navegador. Por defecto usa el driver de Chrome.

  • Instalación:

    composer require --dev laravel/dusk
    php artisan dusk:install
    
  • Ejecutar tests:

    php artisan dusk
    php artisan dusk:fails
    php artisan dusk --group=somegroup
    
  • Crear tests: php artisan dusk:make LoginTest

  • Preparar base de datos para Dusk:

    • Crearmos base de datos laravel18dusk
    • Creamos fichero de entorno para dusk: .env.dusk

      APP_URL="http://localhost:8001"
      
      DB_CONNECTION="mysql"
      DB_DATABASE='laravel18dusk'
      

      -Servimos con dicho entorno especial: php artisan serve --env=dusk

results matching ""

    No results matching ""