|VS 2008] Jeux de données XML et CSV pour tests unitaires
Dans Visual Studio Team Test, il est possible de générer des jeux de données pour un test. Les "Data-driven Tests" permettent de rendre dynamique les paramètres d'entrée et de validation d'une méthode de test.
Exemple, si je veux tester une méthode qui fait de l'addition avec plusieurs cas valides, au lieu d'écrire un test unitaire pour chaque paire de valeurs, je vais parametrer mon test pour aller chercher ses valeurs dans une source de données externes.
Pour tester le code suivant:
public class Calcul
{
public int addition(int a, int b)
{
return a + b;
}
}
Le générateur de code de test de Visual Studio propose le test unitaire ci-dessous:
/// <summary>
///A test for addition
///</summary>
[TestMethod()]
public void additionTest()
{
Calcul target = new Calcul(); // TODO: Initialize to an appropriate value
int a = 0; // TODO: Initialize to an appropriate value
int b = 0; // TODO: Initialize to an appropriate value
int expected = 0; // TODO: Initialize to an appropriate value
int actual;
actual = target.addition(a, b);
Assert.AreEqual(expected, actual);
Assert.Inconclusive("Verify the correctness of this test method.");
}
On remarque ici qu'il est nécessaire d'entrer en dur les paramètres "a", "b" et le résultat attendu "expected".
Pour que ce test soit joué pour un ensemble de valeurs il est possible d'ajouter une source de données, pour ceci, il suffit d'aller dans les propriétées du test unitaire généré, accessible via la fenêtre "Test View", et de parametrer la propriétée "Data Connection String":
Un assistant apparait, permettant de selectionner la source de données souhaitée, et c'est la que Visual Studio 2008 apporte des nouveautés en proposant, en plus de la source de données SQL Server, des sources CSV et XML: beaucoup plus pratique à deployer, mettre à jour et beaucoup moins contraignant.
Prenons XML, et selectionnons un fichier créé précedemment:
<values>
<value>
<a>10</a>
<b>4</b>
<resultat>14</resultat>
</value>
<value>
<a>6</a>
<b>2</b>
<resultat>8</resultat>
</value>
<value>
<a>2</a>
<b>3</b>
<resultat>3</resultat>
</value>
</values>
(une erreur est volontairement présente dans ces jeux de données)
Ce qui donne au niveau de l'assistant:
Une fois cet assistant terminé, l'attribut [DataSource] suivant va être ajouté à la méthode de test unitaire (on peut donc bien entendu se passer de l'assistant pour reproduire la même opération):
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML", "|DataDirectory|\\datas.xml", "value", DataAccessMethod.Sequential), DeploymentItem("TestProject1\\datas.xml"), TestMethod()]
Cet attribut indique que le test va utiliser une source de données XML, au travers du fichier datas.xml, dans l'ensemble de données "value", que les lignes de la source de données vont être exécutée les unes a la suite des autres de manières séquentielle (possibilité de mettre "random" ici), et que le fichier datas.xml sera déployé avec le test unitaire.
Il ne reste plus qu'a compléter le code du test pour aller piocher les valeurs "a", "b" et "expected" dans le fichier XML en utilisant l'object "TestContext" permettant d'obtenir les propriétées de la ligne active utilisée dans la source de données:
/// <summary>
///A test for addition
///</summary>
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML", "|DataDirectory|\\datas.xml", "value",
DataAccessMethod.Sequential),
DeploymentItem("TestProject1\\datas.xml"),
TestMethod()]
public void additionTest()
{
Calcul target = new Calcul();
int a = Convert.ToInt32(TestContext.DataRow["a"]);
int b = Convert.ToInt32(TestContext.DataRow["b"]);
int expected = Convert.ToInt32(TestContext.DataRow["resultat"]);
int actual;
actual = target.addition(a, b);
Assert.AreEqual(expected, actual);
}
Une fois le test exécuté, on remarque que celui ci est joué non pas une seule fois, mais autant de fois qu'il y'a de lignes dans la source de données (3 ici). Le test échoue dans notre cas au niveau du troisième jeu de valeurs (2 + 3 ne donnent effectivement pas 3).

Voila, bon tests!