Retour aux articles

Cet article a été publié à l'origine sur Laravel Cameroun

Lire l'article original

Pest Laravel

Différence entre Unit et Feature Tests

Shalom tout le monde, j'espère que vous allez bien, aujourd'hui, nous allons parler de Tests Unitaires (👻 wooooh).

Alors pas précisément (soyez rassurés) mais on va plutôt parler de la différence qu'il y a entre un test unitaire (Unit Test) et un test fonctionnel (Feature Test).

Alors, vous l'avez surement remarqué quand vous créez un nouveau projet Laravel, il y a ce fameux dossier tests qu'aucun développeur n'a envie de toucher ou d'ouvrir. Oui, je parle bien de ce dossier :

Screenshot from 2023-07-07 15-47-08.png

Sachant que les tests unitaires sont une partie importante de notre projet, nous remarquons que Laravel dans le dossier tests a 2 autres dossiers qui sont Unit et Feature, et du coup on peut se demander pourquoi 2 dossiers ?

Types de Tests

il existe de nombreux types de tests que vous pouvez écrire, bien que d'après mon expérience, tout le monde appelle le concept d'écriture de tests "tests unitaires", mais il existe d'autres types de tests, et ce sont les suivants :

  • Tests unitaires
  • Tests de fonctionnalités
  • Tests d'intégration

Et sûrement d'autres types de tests dont je n'ai pas encore entendu parler. Mais dans cet article, nous allons nous concentrer sur les 2 premiers et voir la particularité de chacun.

Unit Test (test unitaire)

Un test unitaire est chargé de tester une partie précise de votre application de manière isolée, c'est-à-dire qu'elle n'interagit pas avec tout le reste (pas d'appel API, de connexion à une BD, etc), mais comment elle traite les données et comment elle gère différents scénarios, vous pouvez le voir comme la manière dont une classe par exemple est censée fonctionner du point de vue d'un développeur. De facon simpliste un test unitaire, c'est pour tester une partie invisible de notre code donc qui ne peut pas être considérée comme une fonctionnalité par exemple :

Je teste que mon nom Arthur Monney comment bien par une lettre majuscule A et qu'il y a un espace entre les 2. Et si par exemple, j'effectue un test et je passe un nom à ma fonction et que le nom est Arthur ce test unitaire ne devrait pas être bon parce qu'il manque l'espace.

Je ne sais pas si jusque-là, on se comprend ! Un exemple de code

public function name_property_returns_the_authors_last_name_and_first_name()
{
$author = factory(Author::class)->create([
'first_name' => 'Arthur',
'last_name' => 'Monney'
]);
 
$this->assertEquals('Arthur, Monney', $author->name);
}

Pour créer un test unitaire sur Laravel, vous pouvez exécuter la commande suivante :

php artisan make:test UserTest --unit

Vous allez retrouver le fichier créé dans le dossier tests/Unit

Feature Test (test fonctionnel)

Les tests de fonctionnalités sont des tests de boîte noire, et ils testent une partie d'une application de bout en bout, par exemple une authentification API, ou un groupe d'actions, etc. Dans le cadre des tests fonctionnels on test des gros blocs de notre projet. Et de facon indirect ce sont les types de test qu'on va écrire le plus souvent.

Les tests de fonctionnalités sont plus du point de vue de l'utilisateur que du développeur. Donc si un utilisateur doit se connecter et commander un livre par exemple, vous allez écrire un test fonctionnel qui va prendre la connexion de l'utilisateur, le navigation vers la page des livres et l'action de commander un livre. Voila une suite d'actions qui passe pour un test fonctionnel.

Un exemple de code

/**
* @test
*/
public function when_users_update_a_book_they_are_redirected_to_the_book_index_and_are_shown_a_success_message()
{
$this->createForeignKeys();
$this->signIn();
$book = factory(Book::class)->create();
$book->title = 'Kalle';
 
$response = $this->patch('/books/' . $book->id, $book->toArray());
 
$response->assertStatus(302);
$response->assertLocation('/books');
 
$response = $this->get('/books');
$response->assertSee(e($book->title) . ' successfully updated.');
}

Pour créer un test fonctionnel sur Laravel, vous pouvez exécuter la même commande que précédemment, mais sans le flag --unit, parce que par défaut tous les tests créés par Laravel sont des Feature Test et se trouve dans le dossier tests/Feature

php artisan make:test UserTest

Conclusion

Comme vous pouvez le voir, la différence entre les tests unitaires et les tests de fonctionnalités est que dans les tests unitaires, nous testons chaque composant de manière isolée, donc le sèche-linge et la poubelle fonctionnent bien, mais cela n'a pas été testé dans les fonctionnalités, car dans les tests de fonctionnalités, nous testons une action entière et chaque service qu'elle consomme et la réponse, donc comment cette API interagit avec tout et renvoie le résultat souhaité.

Bonus 🎇

Si vous voulez savoir comment mettre en place des tests unitaires sur Laravel je vous propose ce tutoriel pour commencer.

Alors n'hésitez pas à écrire des tests unitaires et fonctionnels pour rendre votre code propre et plus stable tout en évitant les bugs inattendus.