novembre
2009
Comme dit dans Wikipédia, La couverture de code (en anglais code coverage) est une mesure utilisée en génie logiciel pour décrire le taux de code source testé d’un programme. Ceci permet de mesurer la qualité des tests effectués.
Visual Studio (notamment dans sa version Visual Studio Team System Test Edition) permet de mesurer la couverture du code de nos tests unitaires.
Prenons par exemple cette classe :
1: public class Class1
2: {
3: public int DoStuff()
4: {
5: return 10;
6: }
7:
8: public void DoStuffJamaisAppelee()
9: {
10: throw new NotImplementedException();
11: }
12: }
et la classe de test associée :
1: [TestClass]
2: public class UnitTest1
3: {
4: [TestMethod]
5: public void TestMethod1()
6: {
7: Class1 class1 = new Class1();
8: int result = class1.DoStuff();
9: Assert.AreEqual(10, result);
10: }
11: }
On a beau avoir tous nos tests qui passent :
On voit bien, en observant le code de notre classe de test, que seule la méthode DoStuff est couverte alors que la méthode DoStuffJamaisAppelee n’est jamais testée.
Dans ce cas simple, il est facile de se rendre compte qu’il faut rajouter un test appelant la méthode DoStuffJamaisAppelee pour être bien sur que l’ensemble de notre code est couvert par des tests unitaires. Mais si le code se rallonge, comment être bien sur que l’on oublie rien ?
C’est la qu’intervient l’outil de couverture de code (disponible uniquement dans certaines éditions de visual studio). Je peux obtenir un rapport sur mes tests unitaires :
A la lecture du tableau, on se rend bien compte que DoStuff est couverte à 100% et que DoStuffJamaisAppelee aurait bien besoin d’un petit test unitaire…
De plus, en double-cliquant sur les méthodes dans le rapport, Visual Studio nous amène dans notre code source et nous signale en couleur les éléments dans lesquels les tests ne sont pas passés.
Prenons par exemple cette classe :
1: public class Class1
2: {
3: public bool DoStuff(int val)
4: {
5: if (val == 10)
6: return false;
7: return true; ;
8: }
9: }
Avec la méthode de test suivante :
1: [TestClass]
2: public class UnitTest1
3: {
4: [TestMethod]
5: public void TestMethod1()
6: {
7: Class1 class1 = new Class1();
8: bool result = class1.DoStuff(5);
9: Assert.AreEqual(true, result);
10: }
11: }
Ici, en double cliquant sur la méthode DoStuff, on arrive dans le fichier source concerné avec :
Et on voit tout de suite ce qui ne va pas, il manque un test de la méthode DoStuff avec en paramètre la valeur 10. Il ne reste plus qu’à rajouter le test adéquat et la couverture sera complète.
Voilà pour un aperçu de la couverture de code, outil indispensable pour qui veut être bien sur de la pertinence de ses tests unitaires
2 Commentaires + Ajouter un commentaire
Commentaires récents
- [Tests] Arrange Act Assert, une traduction ? dans
- [UnitTest][C#] Tester une méthode privée dans
- Récupérer une valeur d’un contrôle depuis une autre Form / inclusions croisées et déclaration anticipée dans
- Tutoriel : Utiliser la ListBox et l’Isolated Storage dans vos applications Windows Phone 7 avec Silverlight dans
- Tutoriel : Utiliser la ListBox et l’Isolated Storage dans vos applications Windows Phone 7 avec Silverlight dans
Archives
- janvier 2013
- avril 2012
- janvier 2012
- juin 2011
- janvier 2011
- décembre 2010
- novembre 2010
- septembre 2010
- juin 2010
- mars 2010
- février 2010
- janvier 2010
- décembre 2009
- novembre 2009
- octobre 2009
- septembre 2009
- août 2009
- juillet 2009
- mai 2009
- avril 2009
- mars 2009
- janvier 2009
- décembre 2008
- novembre 2008
- octobre 2008
- septembre 2008
- août 2008
- juillet 2008
- juin 2008
- mai 2008
- avril 2008
- mars 2008
- février 2008
- janvier 2008
- décembre 2007
- novembre 2007
- octobre 2007
- septembre 2007
- août 2007
- juillet 2007
- juin 2007
- mai 2007
tout à fait, ou NCover.
Le souci de PartCover, dans mon cas, est qu’il ne fonctionne pas avec TypeMock.
Notons aussi l’intégration de l’outil testdriven (http://www.testdriven.net/download.aspx) avec la couverture de code de VS et NCover
Plan B, si la version de Visual Studio ne supporte pas la couverture en natif, on peut utiliser PartCover, qui marche pas mal