Hoy vamos a crear unos tests con Laravel y veremos como funcionan y que son.
Un test es código que comprueba que un trozo de nuestro código funcione correctamente y haga lo que debe hacer. En Laravel hay dos tipos, los test Unitarios que están dirigidos a comprobar la funcionalidad de una parte pequeña de nuestro código (métodos) y también están los test Feature que serán los que utilizaremos en esta entrada y que comprueban una parte más grande de nuestro código (cosas con base de datos, peticiones HTTP, etc.).
Para crear el fichero para nuestro test, como siempre, artisan nos provee un comando para hacerlo:
1 |
php artisan make:test PostTest |
Ok, ahora ya tenemos el fichero creado, pero antes de añadir el código vamos a hacer unas cuantas configuraciones necesarias.
Primero de todo, vamos al archivo phpunit.xml (está en la raíz del proyecto) y añadimos al final del fichero estas líneas:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?xml version="1.0" encoding="UTF-8"?> <phpunit backupGlobals="false" backupStaticAttributes="false" bootstrap="bootstrap/autoload.php" colors="true" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false"> ... <php> ... <env name="DB_CONNECTION" value="sqlite"/> <env name="DB_DATABASE" value=":memory:"/> </php> </phpunit> |
Con estas líneas indicamos que utilizaremos una base de datos SQLite para realizar los tests.
Ahora tendremos que instalar un paquete para poder utilizar este tipo de base de datos, si no nos dará un error:
1 2 3 4 5 6 |
... "require-dev": { ... "doctrine/dbal": "~2.3" }, ... |
Y actualizamos los paquetes:
1 |
composer update |
Ahora ya vamos a añadir el código al archivo del test creado anteriormente ( PostTest.php ):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<?php namespace Tests\Feature; use App\Post; use Tests\TestCase; use Illuminate\Foundation\Testing\DatabaseMigrations; class PostTest extends TestCase { use DatabaseMigrations; /** @test */ public function test_posts_can_be_created() { $user = factory(\App\User::class)->create(); $post = $user->posts()->create([ 'title' => 'Test title', 'body' => 'Body test' ]); // $found_post = Post::find(1); // $this->assertEquals($found_post->test, 'Test title'); $this->assertDatabaseHas('posts', ['id' => 1, 'title' => 'Test title']); } /** @test */ public function post_cant_be_created_by_unlogged_user() { $response = $this->call('POST', '/posts'); $this->assertEquals(403, $response->status()); } } |
Hay dos funciones:
- La primera (test_posts_can_be_created) comprueba que los posts pueden ser creados por un usuario. Una vez creado un post de prueba, comprueba si existe en la base de datos.
- La segunda (post_cant_be_created_by_unlogged_user) comprueba que un usuario no logueado no puede entrar a la ruta de creación de posts. Para que funcione bien, tendremos que comentar el middleware auth del método store en el PostsController.php , ya que si no retorna otro error HTTP y queremos que retorne el error 403.
Para ejecutar estos tests, simplemente vamos a la raíz del proyecto y ejecutamos:
1 2 3 4 5 |
vendor\bin\phpunit // o phpunit |
Y si queremos ejecutar un fichero en concreto, en mi caso sería:
1 2 3 4 5 |
vendor\bin\phpunit tests\Feature\PostTest.php // o phpunit tests\Feature\PostTest.php |
Y veremos por la consola que los test son positivos:
Esto es simplemente un ejemplo, los test que se pueden hacer pueden ser infinitos. Puedes encontrar más información sobre los tests en la documentación de Laravel.
-
– https://laravel.com/docs/5.4/testing