• 30 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 21/05/2021

Découvrez l’importance des tests unitaires

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Introduction

Si vous êtes allés à Paris, vous avez probablement dû emprunter la ligne 14. Vous savez, cette fameuse ligne de métro entièrement automatisée, sans aucun conducteur. Lors de sa mise en service, j'étais à la fois curieux et sceptique. Lorsque je montais dans la rame, je me posais toujours la même question : "le système est-il correctement testé ?". Dit autrement, le métro va-t-il bien s'arrêter à chaque station ? Va-t-il bien faire demi-tour en arrivant en bout de ligne ? Les capteurs sont-ils fiables ?

Laissez-moi vous raconter une petite anecdote. Un jour, je décidai de prendre la ligne 14 pour rentrer du boulot, le métro resta anormalement longtemps à quai, station Pyramides. Après de longues minutes, la sonnerie retentit puis les portes se fermèrent. Là, le métro repartit dans l'autre sens. Une goutte de sueur perla sur mon front, et une voix se mit à crier dans ma tête : "c'est un buuuuug, on va percuter le métro qui nous précède !". J'étais à deux doigts de sortir mon pied de biche pour m'évader lorsque le métro fut aiguillé sur l'autre voie. En fait, le système fonctionnait sans anomalie : une annonce nous dit qu'un incident technique pénalisait la station suivante. Et que la ligne avait donc été scindée en deux.

Moralité : le système avait été parfaitement testé (heureusement d'ailleurs). Dans les cas précis du transport ferroviaire ou aérien, les contraintes sont extrêmes. Dans le cadre d'une application mobile, la vie de l'utilisateur n'est pas en danger (sauf s'il répond à un SMS en conduisant, mais c'est un autre sujet). Toujours est-il qu'il est impératif d'avoir une application qui fonctionne correctement, pour garantir la meilleure expérience utilisateur possible.

Vous l'avez compris, les tests unitaires sont très importants. Nous allons découvrir pourquoi, étudier quels sont les différents tests disponibles, et comment les mettre en œuvre.

L'intérêt d'un test unitaire

Comme l'explique très bien Wikipedia, un test unitaire permet de tester le bon fonctionnement d'une partie précise d'un programme. Il permet de s'assurer que le comportement d'une application est correct. Par exemple, imaginez une application mobile qui vous permette de gérer un porte-monnaie virtuel. Vous testeriez si l'euro que vous mettez dedans soit bien comptabilitsé. Vous testeriez également si vous pouvez récupérer l'argent qui s'y trouve.

L'avantage d'un test unitaire est donc multiple :

  • Il vous permet d'avoir un retour rapide sur votre développement. Si le test échoue, vous pouvez rapidement corriger votre code pendant que tout est frais dans votre esprit ;

  • Il vous permet d'avoir un filet de sécurité. Si vous cassez quelque chose, vous vous en apercevez tout de suite ;

  • Il vous permet d'éviter d'accumuler de la dette technique, en ayant une application qui soit facilement maintenable et évolutive.

Les différentes catégories de test

Les tests unitaires peuvent être regroupés sous trois catégories différentes :

  • Les tests unitaires, qui doivent être petits, rapides et très ciblés. Ils permettent de détecter les erreurs au plus tôt. La majorité des composants sont simulés, ce qui implique qu'ils ne représentent pas forcément la réalité. Ils ont l'avantage de pouvoir s'exécuter sur l'ordinateur du développeur, ce qui permet de les passer très rapidement ;

  • Les tests d'intégration, qui permettent de tester plusieurs composants. Certains sont simulés, d'autres sont réels. Ils peuvent s'exécuter sur l'émulateur ou sur un équipement réel. Ils sont plus longs à écrire, mais sont beaucoup plus fidèles que les tests unitaires ;

  • Les tests d'interface, qui permettent de tester une application comme un vrai utilisateur. Ces tests ont l'avantage d'être extrèmement fidèles à la réalité, mais ce sont les plus longs et les plus compliqués à écrire.

L'idéal consiste à écrire des tests de chaque catégorie. La recommandation est la suivante :

  • 70% de tests unitaires ;

  • 20% de tests d'intégration ;

  • 10% de tests d'interface.

Dans ce cours, nous allons principalement écrire des tests unitaires et quelques tests d'intégration. Cela sera suffisant pour démarrer. Car vous le verrez, écrire des tests n'a rien de passionnant. Donc autant avancer doucement.

Les tests sur Android

Sur Android, les tests peuvent être de deux natures différentes :

  1. Les tests unitaires locaux (ou Local Unit Tests). Ce sont des tests unitaires qui sont exécutés sur la JVM de votre ordinateur. Sachant qu'il n'existe pas de dépendance avec Android, il n'est pas nécessaire de démarrer l'émulateur ou d'accéder à un équipement réel. Ces tests sont donc déroulés très rapidement ;

  2. Les tests unitaires instrumentalisés (ou Instrumented Unit Tests). Ce sont des tests unitaires qui ont besoin du système Android pour fonctionner (car ils utilisent ses API). Le lancement de l'émulateur ou le branchement d'un équipement réel est nécessaire pour pouvoir exécuter ces tests. Ils sont donc plus longs à dérouler.

L'approche TDD

Il existe trois approches concernant les tests unitaires :

  1. Les développeurs n'en écrivent jamais (ne riez pas, c'est malheureusement la majorité des cas) ;

  2. Les développeurs écrivent les tests quand ils ont le temps et la motivation (c'est à dire très rarement) ;

  3. Les développeurs commencent par écrire les tests avant toute ligne de code métier.

Cette dernière approche porte un nom : le TDD, pour Test-Driven-Development. La règle est assez simple : vous commencez par écrire les tests qui permettent de valider les différentes exigences de votre application. Ensuite, vous écrivez le code de votre application qui permet de valider ces tests.

Cette méthode permet d'éviter d'écrire trop de code. La base de code est plus saine et moins sujette aux erreurs. D'un autre côté, il n'est pas toujours évident d'avoir cette approche avec des tests d'interface ou lorsqu'une connectivité réseau est présente. Car les paramètres qui rentrent en compte sont multiples.

Pour faire simple, cette approche est intéressante pour tester son modèle, et c'est ce que nous allons voir dans les prochains chapitres.

Conclusion

J'espère ne pas vous avoir effrayés avec les tests unitaires. C'est un sujet qui n'est certes pas passionnant, mais qui est indispensable. Il fera de vous des développeurs admirés et reconnus. Vos pairs se retourneront sur votre passage, vous brillerez dans la nuit, et vous ferez la une des journaux. Alors accrochez-vous !

Exemple de certificat de réussite
Exemple de certificat de réussite