Couverture de code par les tests en JavaScript : outils et métriques
\n\nImaginez que vous êtes le capitaine d'un immense paquebot. Votre équipe vérifie consciencieusement les moteurs, la navigation et les systèmes de sécurité. Mais un jour, vous décidez de ne pas vérifier le système de refroidissement parce qu'« il a fonctionné hier ». Le résultat est prévisible : surchauffe, panne, et vous dérivez en pleine mer. Dans le monde JavaScript, cette insouciance s'appelle « absence de couverture de code par les tests ».
\n\nVous écrivez des tests — c'est bien. Mais comment savoir si vous avez vraiment tout vérifié, et non simplement créé une illusion de sécurité ? La réponse réside dans les métriques de couverture de code. Elles montrent quelle partie de votre application a été exécutée pendant les tests. Sans ces métriques, vous risquez de passer à côté d'un bug critique caché dans une branche de condition non testée.
\n\nDans cet article, nous verrons comment mesurer correctement la couverture de code par les tests en JavaScript, quels outils existent pour cela et comment interpréter les métriques pour ne pas se nuire. Plongeons dans l'univers du code coverage sans ennui !
\n\nQu'est-ce que la couverture de code et pourquoi est-ce important ?
\n\nLa couverture de code (code coverage) est une métrique qui indique combien de lignes, de fonctions ou de branches de votre code ont été exécutées lors de l'exécution des tests. En termes simples, c'est le pourcentage de code « vérifié ».
\n\nDe nombreux développeurs considèrent qu'une couverture à 100 % est le Graal. Mais ce n'est pas tout à fait vrai. La couverture est un outil, pas un objectif. Elle permet de :
\n\n- \n
- Trouver du code « mort » qui n'est jamais exécuté (et peut-être inutile). \n
- Comprendre quelles parties du code restent sans tests et évaluer le risque. \n
- Renforcer la confiance lors du refactoring : si la couverture n'a pas baissé, vous n'avez rien cassé. \n
Mais il y a aussi des pièges. Une couverture à 100 % ne garantit pas l'absence de bugs. Vous pouvez vérifier toutes les lignes, mais passer à côté d'une erreur logique dans les règles métier. C'est pourquoi la couverture de tests JavaScript doit être considérée en conjonction avec la qualité des tests eux-mêmes.
\n\nLes principales métriques de couverture de code
\n\nAvant de choisir un outil, examinons les métriques existantes. Les métriques de couverture de code se divisent en plusieurs types, chacun répondant à une question spécifique.
\n\nCouverture de lignes (Line Coverage)
\nLa métrique la plus simple. Elle indique combien de lignes du code source ont été exécutées au moins une fois. Si vous avez 100 lignes et que les tests en ont exécuté 80, la couverture de lignes est de 80 %.
\n\nCouverture de branches (Branch Coverage)
\nUne métrique plus approfondie. Elle analyse tous les chemins d'exécution possibles du code (branches if/else, opérateurs ternaires, switch). Par exemple, si vous avez une condition if (a > 5), il y a deux branches : true et false. Si votre test ne vérifie que le cas où a > 5, la couverture de branches sera de 50 %.
Couverture de fonctions (Function Coverage)
\nIndique combien de fonctions (ou méthodes) ont été appelées pendant les tests. Si une fonction est déclarée mais jamais appelée, elle n'est pas couverte.
\n\nCouverture d'instructions (Statement Coverage)
\nSimilaire à la couverture de lignes, mais elle opère non pas sur les lignes, mais sur les instructions individuelles (expressions). En JavaScript, ces notions se recoupent souvent, mais formellement ce sont des choses différentes.
\n\nPour les projets réels, l'analyse de couverture JS inclut généralement les quatre métriques. Mais l'accent principal doit être mis sur la couverture de branches, car c'est elle qui révèle les scénarios manquants.
\n\nOutils pour mesurer la couverture en JavaScript
\n\nHeureusement, l'écosystème JavaScript est riche en outils. Nous allons examiner les plus populaires : des plus simples aux plus avancés.
\n\nIstanbul (nyc) — l'étalon-or
\nIstanbul est l'outil le plus populaire pour mesurer la couverture de code par les tests JavaScript. Il fonctionne avec pratiquement n'importe quel test-runner : Jest, Mocha, Ava, Cypress. Après installation, vous lancez simplement les tests avec l'encapsulation nyc.
Exemple d'installation et d'exécution :