C# : Les Tests unitaires – Part 4 (et fin) – Les Tests Unitaire et la base de données

Cette 4ème partie de cet article va expliquer comment faire des tests unitaires qui vont mettre à jour des enregistrements d’une base de données.

En effet, une des problématiques que j’ai rencontré, c’est comment exécuter des tests unitaires sans que mes tests ne soit persistants dans ma base de donnés SQL Serveur pour ne pas la faire grossir en volumétrie.

Pour ceci il faut utiliser  Une base de données dédiée pour les tests qui ne contient pas une grande volumétrie de données.

Le principe est d’utiliser Dans notre projet de Test Unitaire :

  • Un fichier Xsd qui contient le schéma de ma base : « Database/myTest.xsd »
  • Un fichier Xml qui va contenir les données de la bases, il est vide à l’origine : « XmlFiles/Contacts.xml »
  • Un fichier Xml qui contient les données à mettre à jour « Testdata/ContactData.xml »

Grace au fichier Xsd, les données de la base déjà présentes seront copiés dans le fichier Xml Contacts.Xml, puis nous allons mettre jour la base avec les données de notre fichiers Xml ContactData.xml pour faire nos tests unitaires avec.

Enfin, une fois le test terminé la base revient à son état d’origine grace au fichier Xml Contacts.xml.

Le framework qui va nous permettre de faire ceci est NDbUnit il se télécharge en package Nuget :

  • NDbUnit.Core
  • NDbUnit.SqlClient

Un exemple complet

Notre exemple test l’insertion d’une liste de contacts.

Notre Test unitaire va se composé en 3 parties : Initialisation, le test unitaire, et le clean.

1-      L’initialisation

Dans la classe qui comporte notre test unitaire on rajoute une méthode qui possède un attribut :

[AssemblyInitialize]

Cet attribut indique à notre test unitaire qu’à son exécution il doit exécuter d’abord la méthode qui possède l’attribut.

Voici cette méthode :

[AssemblyInitialize]
public static void Classinit(TestContext context)
{
InitDbSetup();
dbSetup.InitilizeDB();
}

Les 2 méthodes appelées sont :

–          Initialisation de la bdd, du fichier xml et du xsd

private static void InitDbSetup()
{
string connectionString = ConfigurationManager.ConnectionStrings["BddTest"].ConnectionString;

string xsdPath = ConfigurationManager.AppSettings["xsdPath"];
string xmlPath = ConfigurationManager.AppSettings["xmlPath"];

dbSetup = new InitDBUnitTests(connectionString, xsdPath, xmlPath);
}

Et voici le constructeur d’InitDBUnitTests qui est une autre classe que l’on crée


public InitDBUnitTests(string connectionString, string xsdPath, string xmlPath)
{
_mySqlDatabase = new NDbUnit.Core.SqlClient.SqlDbUnitTest(connectionString);
this.xsdPath = xsdPath;
this.xmlPath = xmlPath;
}

–          Liaison Xsd et Xml è copie des enregistrements déjà présent dans la bdd dans le fichier xml

public void InitilizeDB()
{
_mySqlDatabase.ReadXmlSchema(xsdPath);
_mySqlDatabase.ReadXml(xmlPath);
}

2-      La méthode de notre test unitaire


[DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML",
"|DataDirectory|\\ContactDatas.xml", "Contact", DataAccessMethod.Sequential)
, DeploymentItem("MyTest.TestUnits\\TestData\\ContactDatas.xml"), TestMethod]
public void InsertListContact()
{
string email = TestContext.DataRow["Email"].ToString();
string message = TestContext.DataRow["Message"].ToString();
string category = TestContext.DataRow["Category"].ToString();
int status = int.Parse(TestContext.DataRow["Status"].ToString());

Business.Contacts _contact = new Business.Contacts();
_contact.pEmail = email;
_contact.pMessage = message;
_contact.pCategory = category;
_contact.pStatus = status;
_contact.pCreatedDate = DateTime.Now;
_contact.Save();

int? id = _contact.pId;
_contact.Load((int)id);

Assert.IsNotNull(_contact);

}

Comme vu ans les parties précédentes, d’après les attributs de cette méthode de test, pour chaque nœud qui se trouve dans le fichier Xml ContactDatas.xml cette méthode va s’exécuter et va insérer un contact dans la bdd, puis elle le load avec son id et fait un Assert sur sa non nullité.

3-      Le clean

Une fois mon test effectué le but est de revenir à l’état d’origine de la base de données.

On va donc créer une autre méthode qui va avoir l’attribut :

[AssemblyCleanup]

Voici la méthode :

[AssemblyCleanup]
public static void CleanUp()
{
dbSetup.CleanUpAndInsertDB();
}

public void CleanUpAndInsertDB()
{
_mySqlDatabase.PerformDbOperation(NDbUnit.Core.DbOperationFlag.DeleteAll);

_mySqlDatabase.ReadXmlSchema(xsdPath);
_mySqlDatabase.ReadXml(xmlPath);
_mySqlDatabase.PerformDbOperation(NDbUnit.Core.DbOperationFlag.CleanInsertIdentity);

}

Le clean se compose donc d’une suppression total de tous les enregistrements, puis d’une réinsertion en se basant sur le fichier Xml qui avait était rempli lors de l’initialisation.

Remarque :

Les méthodes d’initialisation et de clean s’exécuteront pour tous les tests unitaires de la même classe.

Le code source des différentes classes de cette partie se trouve ici.

Voila pour cette partie et aussi pour l’intégralité de l’article sur les Tests Unitaires.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s