• 10 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 25/04/2022

Mesurez votre couverture de test

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

Une couverture de test, de son doux nom code coverage en anglais, nous permet de connaître le pourcentage de notre code qui est testé. C'est une métrique très utile qui peut vous aider à évaluer la qualité de votre suite de tests.

Cela nous donne une idée des parts d'ombre qui peuvent subsister dans notre projet !

Une bonne couverture de test, supérieure à 80 %, est signe d'un projet bien testé et auquel il est plus facile d'ajouter de nouvelles fonctionnalités.

Vérifiez votre couverture de code 

Les outils de couverture de code utilisent un ou plusieurs critères pour déterminer quelle ligne de code a été vérifiée lors de l'exécution de votre suite de tests.

Il existe 5 façons de mesurer la couverture de code, nous pouvons compter :

  • La couverture de ligne : C’est sans doute la méthode la plus utilisée dans les outils de couverture de code. Elle permet de compter le nombre de lignes qui ont été testées.

  • La couverture des instructions : Cette méthode peut être confondue avec la couverture de ligne, mais c’est un peu différent. En effet, elle permet de différencier les instructions qu’il y a dans une ligne, et de vérifier si elles sont toutes testées.

  • La couverture de branche : Cette méthode compte le nombre de structures de contrôle qui ont été exécutées. Par exemple, la conditionifconstitue une structure de contrôle, ainsiifetelsecomptent pour deux branches. Cette métrique permet de vérifier qu’on a pris en compte toutes les possibilités du code.

  • La couverture des conditions : Contrairement à la couverture de branche, cette métrique prend en compte l’ensemble des sous-expressions booléennes.

  • La couverture des fonctions : Ici, on va compter le nombre de fonctions ou méthodes qui ont été appelées dans le code. Cependant, cette métrique ne prend pas en compte le nombre de lignes dans la fonction.

Comment connaître le taux de couverture de notre projet ?

Rassurez-vous, nous n'allons pas parcourir notre code ligne après ligne pour répertorier ce qui est testé ! Une librairie Python,Coverage.py, fait justement cela pour vous ! 

Commencez par installer la librairie en écrivant dans votre terminalpip install coveragepuis pip install pytest-cov.

Puis lancez la commande suivante dans le terminal :pytest --cov=répertoire_du_code_source.

Dans cette commande, vous devez spécifier où se trouve le code source dans l’option--covafin que Pytest puisse calculer la couverture du code en fonction des fichiers sources. 

Mesurez la couverture de test sur un projet Django

Pour vous montrer un exemple, nous allons reprendre le projet Django OC-Commerce et mesurer la couverture du code. Pour cela, je vais lancer la commande suivante à la racine du projet :pytest --cov=..

Vous avez sans doute remarqué le point.concernant l’option--cov. C’est pour spécifier à Pytest de prendre en compte tout le code source du répertoire courant pour calculer la couverture de code.

Voici le résultat de la commande. C’est un rapport qui nous donne le pourcentage de couverture de ligne par fichier source : 

Une fois la couverture de tests mesurée, un rapport avec un pourcentage de ligne couvert par fichier est fourni par Pytest sur le terminal.
Le rapport sur le terminal

Dans la dernière ligne du rapport, on a la moyenne de la couverture du code. Ici c’est 95 %. Néanmoins, si on regarde d’un peu plus près les noms de fichiers, nous pouvons voir qu’on calcule aussi la couverture de code des fichiers de tests, ce qui est totalement inutile. 

Excluez des fichiers du rapport

Nous pouvons donc créer un fichier de configuration pour spécifier les fichiers qu’on ne souhaite pas prendre en compte dans nos mesures. Cela évitera de prendre en compte des fichiers qui sont externes au projet ou qui ne concernent pas le code source. Autrement, le taux de couverture sera complètement erroné. 

Dans notre cas, nous voulons oublier les fichiers de tests qui se trouvent dans le répertoiretests/.

Vous devez tout d’abord créer un fichier.coveragercà la racine du projet, puis ajouter le code suivant pour exclure un répertoire :

[run]
omit = chemin_du_répertoire/*

Concernant notre problème avec le répertoire de test, nous allons ajouter ces lignes dans le fichier de configuration.coveragerc:

[run]
omit = tests/*

Lancez une nouvelle fois la commandepytest --cov=.. Vous remarquerez que les fichiers de tests ont disparu du rapport.

Vous pouvez maintenant analyser le rapport et noter les fichiers qui n’ont pas une couverture de code satisfaisante. Cependant, le rapport sur le terminal n’est pas très précis car il ne fournit qu’un pourcentage de couverture. Ce n’est donc pas évident d’identifier les lignes de code qu’il reste à couvrir pour atteindre les 100 %.

Pas d'inquiétude, Pytest fournit une option qui permet d’avoir le détail des lignes à couvrir par un test.

Générez un rapport HTML

Pytest fournit une option qui permet de générer le rapport sous le format HTML. Le rapport contient bien plus de détails que sur le terminal, car ce rapport nous fournira le pourcentage de lignes couvertes par le test, mais aussi les lignes exactes qui ne sont pas couvertes par le test. Nous pourrons donc plus facilement mettre en place un test qui va pouvoir couvrir cette partie du code.

Pour avoir un rapport HTML, nous devons ajouter à la commande précédente l’option--cov-report html. Nous avons ainsi la commande suivante : pytest --cov=. --cov-report html.

Quand le script est terminé, vous découvrez qu'un nouveau dossierhtmlcova été créé à l'endroit où vous avez lancé la commande. Ce dossier contient différents documents dont des fichiers HTML.

Le dossier contenant le rapport HTML se trouve dans notre cas dans le dossier `htmlcov`.
Où se trouve le rapport HTML ?

Ouvrez le fichierindex.htmlqui contient un résumé du rapport de couverture. À partir de cette page, vous pourrez naviguer à travers les différents fichiers afin d’avoir le détail sur la couverture. Effectivement, vous aurez un rapport détaillé pour chaque fichier source sous le format HTML.

Une fois que le fichier `ìndex.html` est ouvert par un navigateur web, un rapport contenant un résumé de la couverture de test s’affiche.
Le rapport HTML

D’une part, nous pouvons directement constater que notre couverture totale du code est de 89 % grâce à la mention en haut à gaucheCoverage report : 89%. D’autre part, nous avons le détail par fichier avec leur taux de couverture. À la différence du terminal, vous pouvez cliquer sur un fichier pour avoir le détail de la couverture ligne par ligne.

Cliquons sur le fichierfavourites/urls.pyqui ne compte que 65 % de couverture de code, et voyons le résultat.

Les lignes surlignées en rouge correspondent aux lignes non couvertes par un test.
Comment trouver les lignes à couvrir ?

L’outil de couverture a surligné en rouge le code qui n'a pas été testé. En effet, nous n'avons pas testé la totalité de la fonctionmarkFavourite. Nous avons encore du travail !

Dans cette vidéo, vous allez voir comment afficher votre rapport de couverture de test, que ce soit sur le terminal ou à l’aide d’un rapport HTML :

Je vous laisse continuer les tests ! Pour ma part, je vais commencer à implémenter les tests d’intégration.

Nous découvrons cela dans le chapitre suivant !

En résumé

  • La couverture de test vérifie le taux de lignes couvertes par des tests.

  • Le framework Pytest allié au pluginpytest-covmesure le taux de couverture d’une application, grâce à  la commande suivante :pytest --cov=repertoire_du_code_source  . Attention, ne pas oublier de préciser le dossier qui contient le code source dans l’option--cov.

  • Un fichier de configuration.coveragercpourra contenir dans la variableomitles fichiers ou dossiers que nous ne souhaitons pas prendre en compte dans la mesure du coverage.

  • L’option--cov-report htmlgénère un rapport HTML beaucoup plus détaillé qui permet d’analyser plus facilement les lignes à couvrir.

J’ai l’impression que vous avez terminé la partie 3 de ce cours. Ne changeons pas les bonnes habitudes, il est temps de faire un quiz afin d’évaluer vos nouvelles connaissances sur les tests !

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