novembre
2009
Le billet que je voulais écrire semble trop long, je vais donc le décomposer en 2 billets…
Comme vu dans ce billet : La couverture de code avec Visual Studio, visual studio peut nous générer un rapport de couverture de code une fois les tests unitaires joués.
Dans un processus d’intégration continue il est envisageable de programmer l’exécution des tests unitaires à date précise via une tache msbuild. Il est également possible de générer un rapport de couverture de code automatiquement. Cependant, pour le consulter, on sera obligé d’ouvrir un visual studio et de charger les tests correspondant.
Nous allons voir ici une solution pour extraire par code le résultat de la couverture de code afin de l’envoyer par exemple par mail au développeur.
Premier constat, les résultats des tests sont générés dans un répertoire de ce genre :
C:\TestResults\[Nom Utilisateur]_[Nom machine] [date] [heure]
avec comme sous répertoire
- C:\TestResults\[Nom Utilisateur]_[Nom machine] [date] [heure]\In\[Nom Machine]
- C:\TestResults\[Nom Utilisateur]_[Nom machine] [date] [heure]\Out\
Dans le premier on va trouver un fichier data.coverage qui contient le résultat de la couverture de code, mais pour l’instant inexploitable.
Et dans le deuxième nos dll mises en jeu par le test.
On va pouvoir se servir des dll fournies par visual studio pour la couverture de code pour extraire un fichier xml contenant le résultat de la couverture de code.
On pourra ensuite effectuer une transformation de ce xml avec un xslt et générer un rapport html que nous pourrons envoyer par mail.
Voyons grosso modo le code mis en jeu, pour ce faire on utilisera l’assembly Microsoft.VisualStudio.Coverage.Analysis :
1: using Microsoft.VisualStudio.CodeCoverage;
2:
3: // extraction d'un fichier xml à partir du fichier data.coverage
4: CoverageInfoManager.SymPath = @"C:\TestResults\[Nom Utilisateur]_[Nom machine] [date] [heure]\Out\";
5: CoverageInfoManager.ExePath = @"C:\TestResults\[Nom Utilisateur]_[Nom machine] [date] [heure]\Out\";
6:
7: CoverageInfo ci = CoverageInfoManager.CreateInfoFromFile(@"C:\TestResults\[Nom Utilisateur]_[Nom machine] [date] [heure]\In\[Nom Machine]\data.coverage");
8: CoverageDS data = ci.BuildDataSet(null);
9:
10: data.WriteXml(@"c:\result.xml");
11:
12: // effectuer la transformation du xml
13: // envoyer le mail
Si on utilise des taches msbuild, on pourra avoir accès à tout un tas de variable d’environnement, dont une particulière $(TestResultsRoot) qui permet d’obtenir le repertoire de destination des tests, dans mon exemple il s’agit de C:\TestResults\
Ainsi, en passant la valeur de cette variable à notre programme (disons un programme console pour l’instant), on pourra être capable par code de :
- récupérer le dernier répertoire créé
- d’obtenir le répertoire de sortie
- d’obtenir le chemin du fichier data.coverage
- et de générer le fichier xml dans un fichier temporaire
1: public static string GetCoverageTemporaryFileName(string baseDirectory) // baseDirectory est le nom du répertoire passé en paramètre
2: {
3: var elts = Directory.GetDirectories(baseDirectory).Select(directory => new KeyValuePair<string, DateTime>(directory, Directory.GetCreationTime(directory))).OrderByDescending(value => value.Value).Select(v => v.Key);
4: if (elts.Any())
5: {
6: string directory = elts.First();
7: if (!directory.EndsWith(@"\"))
8: directory += @"\";
9: string outputPath = string.Format("{0}Out", directory);
10:
11: if (!Directory.Exists(outputPath))
12: throw new Exception("Impossible de trouver le répertoire de sortie, le répertoire " + outputPath + " n'existe pas");
13:
14: CoverageInfoManager.SymPath = outputPath;
15: CoverageInfoManager.ExePath = outputPath;
16:
17: string inputPath = string.Format("{0}\\In\\{1}\\data.coverage", directory, Environment.MachineName);
18: if (!File.Exists(inputPath))
19: throw new Exception("Impossible de trouver le fichier de couverture de code, le fichier " + inputPath + " n'existe pas");
20:
21: CoverageInfo ci = CoverageInfoManager.CreateInfoFromFile(inputPath);
22: CoverageDS data = ci.BuildDataSet(null);
23:
24: string tempFileName = Path.GetTempFileName();
25:
26: data.WriteXml(tempFileName);
27: return tempFileName;
28: }
29: return null;
30: }
La suite dans le billet suivant : http://blog.developpez.com/nico-pyright/p8382/test/test-c-comment-extraire-la-couverture-de-3
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