Différence entre Unit et Feature Tests
Arthur Monney
@mckenziearts
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:
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 on va se 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 la 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 éxecuter 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 éxecuter 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ésiter pas à écrire des tests unitaires et fonctionnels pour rendre votre code propre et plus stable tout en évitant les bugs inattendus.
Arthur Monney
@mckenziearts
Fullstack Designer - Laravel & React Developer. Laravel Cameroon Organizer @laravelcm | @shopperlabs