Live unit testing avec Visual studio 2017

Dans cet article nous allons tester la super fonctionnalité annoncée dans Visual Studio Enterprise 2017 RC : le live unit testing.
Qu’est-ce que le Live Unit Testing ?
Bon nombre de développeurs se demandent qu’apportera la nouvelle mouture de Visual Studio.
Ceux qui auront la chance d’utiliser la version Enterprise au quotidien apprécieront très certainement le live unit testing.
Microsoft fait fort en intégrant cette fonctionnalité et ceux qui connaissent NCrunch ne diront pas le contraire.
Pour ceux qui ne connaissent pas, le live unit testing permet d’avoir des indicateurs en temps réel sur la couverture de code ainsi que son statut.
Ces indicateurs sont représentés par des petits sigles sur le côté gauche de notre code.
Voyons donc à quoi cela ressemble avec un exemple de code simple trouvé sur GitHub : une version C# de GildedRose (Un kata de refactoring assez connu des développeurs).
Le Test
Avec le framework de test de Microsoft
Ci-dessous, une méthode de test fait avec MS Test :
Tout ce qu’il y a de plus classique.
Activons maintenant le live unit testing :
Après 10 petites secondes, nous voyons apparaître les fameux indicateurs :
Nous avons donc là un test qui échoue.
La suite logique est donc de faire fonctionner le test (rappelons ici que le sujet de cet article est de montrer le live unit testing et non un cours sur la mise en œuvre de tests unitaires) :
Ci-dessus, nous remarquons que sans avoir à sauvegarder le fichier, les indicateurs ont changés et montrent qu’il y a une analyse en cours.
A la fin de l’analyse, nous voyons que le test n’échoue plus :
Avec les autres frameworks de test
Nous avons donc vu qu’avec le framework de test de Microsoft, MSTest, le live unit testing fonctionne correctement.
Mais qu’en est-il pour NUnit et xUnit qui sont deux autres framework de test utilisés, tout autant si ce n’est plus, par la communauté ?
Voici donc un aperçu en utilisant NUnit :
Oups, les indicateurs ne sont pas les mêmes.
Ici nous pouvons voir que l’indicateur de test est en succès, mais que d’après les indicateurs du live unit testing, les lignes ne sont pas couvertes par un test (pour une méthode de test c’est un peu le comble).
Test effectué avec Nunit 3.5.0, et l’extension Nunit 3 Test Adapter 3.6.1.0.
Voici donc un aperçu en utilisant xUnit :
Là non plus, les lignes ne semblent pas couvertes.
Test effectué avec Xunit 2.1.0 (core et runner : version stable)
Pourtant Microsoft n’avait-il pas annoncé que NUnit et xUnit étaient bien supportés par le live unit testing ?
Si et dans l’annonce les prérequis ci-dessous sont mentionnés :
[table id=6 /]
Pour rappel, c’est cette extension qui était utilisée pour notre test :
Étrange, c’est une version supérieure à celle indiquée et ça ne fonctionne pas !
Essayons alors la version spécifiée par Microsoft via un package NuGet : Install-Package NUnit3TestAdapter -Version 3.5.1
Nous retrouvons là, le même comportement qu’avec MSTest.
Essayons également la version spécifique pour xUnit : xunit.runner.visualstudio version 2.2.0-beta3-build1187
Hourra 2 ! \(=^-^=)/
Là encore, le live unit testing fonctionne de la manière attendue.
Les indicateurs dans l’implémentation
Dans les exemples ci-dessus, nous avons vu les indicateurs sur des méthodes de test. Ce n’est pas tout à fait dénué de sens, mais il serait quand même bien plus intéressant de voir ces indicateurs sur nos classes métiers.
Afin d’illustrer ceci, voyons un morceau de classe couverte par notre test :
Ici, nous voyons que les lignes 21 et 23 ne sont pas couvertes.
Il faudrait donc ajouter un autre test pour que cette partie soit couverte, comme le montrent les deux images ci-dessous.
Test ajouté, lignes couvertes = Hourra 3 !
Vous noterez qu’il est maintenant plus facile d’écrire les tests suffisants afin de couvrir le code métier qui nous intéresse le plus.
Utilisation dans un projet de la vraie vie
“Une démonstration c’est bien, mais combien cela va-t-il me coûter dans un projet de la vie de tous les jours pour que cette fonctionnalité fonctionne ?”
C’est peut-être là une question que vous vous poserez.
En terme d’argent
Il faudra que vous possédiez la version Enterprise.
En terme de ressource machine
A titre de comparaison : les tests ont été effectués sur une machine ayant la configuration suivante:
Processeur : Intel Core I7-6700HQ @2.6Ghz
Mémoire RAM : 16Go
Disque dur : SSD
Voici une image des ressources utilisées par ma machine en ayant lancé et compilé ma solution:
Voici une image des ressources utilisées par ma machine en ayant activé la fonctionnalité live unit testing:
J’ai effectué des tests sur des solutions petites (< 1Mo), moyennes (< 100Mo), grosses (~ 400Mo).
Les consommations en CPU et RAM sont sensiblement identiques, ce qui va varier c’est le temps d’attente avant de voir les indicateurs.
Consommation CPU : +25% CPU en moyenne à l’initialisation (démarrage du live unit testing), avec des pics a +45%; puis en édition : +17% en moyenne.
Temps d’attente au démarrage : j’ai constaté des temps variant de 10 secondes à 3 minutes pour les différentes taille de solutions testées.
Cependant j’ai tout de même un petit bémol à ajouter : sur la grosse solution j’ai eu une erreur dans la sortie du live unit testing : Test discovery aborted/timed-out.
Ce qui fait que les indicateurs ne remontent pas dessus :(.
En terme de temps d’implémentation
Il faut bien penser au prérequis sur les “runners” et les versions de framework et une fois que ces prérequis sont respectés il suffit d’activer la fonctionnalité.
Je peux quand même vous montrer les petits “soucis” que j’ai rencontré afin de vous faire éventuellement gagner du temps.
1°) Pour MSTests, si vous essayez d’utiliser live unit testing à partir d’une solution VS 2015 ou antérieure, n’oubliez pas de mettre à jour les librairies de tests.
Un petit coup d’œil rapide sur les références devrait vous permettre de voir rapidement si vous utilisez une ancienne version.
2°) Si vous testez des méthodes asynchrones, assurez vous que le type de retour de votre test est Task et non void, au risque de ne pas voir les bons indicateurs.
Conclusion
En ce qui me concerne, le live unit testing apporte une nouvelle et meilleure expérience de travail pour un développeur en termes de visualisation globale. Il devient facile de voir précisément quel morceau de code est couvert par des tests.
Lorsqu’on lance l’ensemble des tests, si ceux-ci sont bien nommés, il est possible de se faire une idée de quelles fonctionnalités sont couvertes, mais pas dans le détail ni à la ligne près.
Nous sommes très heureux de voir que cette version de Visual Studio Enterprise 2017 RC apporte cette magnifique fonctionnalité.
Nous regrettons cependant que l’extension NUnit Test Adapter présente sur la galerie et le package stable pour xUnit soit insuffisante pour faire fonctionner correctement le live unit testing.
Peut-être que d’ici à ce que la version officielle de Visual Studio ne sorte, ce sera résolu.
Pensez-vous que vous pourrez vous passer de NCrunch désormais ?
Serez-vous de fervents adeptes du live unit testing ?