Structure de tests unitaires

Mise à jour : novembre 2007

Un test unitaire est une méthode qui est membre d'une classe écrite en C#, Visual Basic ou Visual C++.

Remarque :

Pour plus d'informations sur l'utilisation des tests unitaires avec le code de production C++ et sur l'utilisation des tests unitaires écrits en C++, consultez Tests unitaires et C++.

Pour que le test unitaire soit reconnu par les Outils de test Team System, ce fichier de code source doit résider dans un projet de test, qui lui-même fait partie d'une solution Visual Studio. Lorsque vous générez ce projet, ou la solution entière, le projet de test est généré dans un assembly qui contient le test unitaire exécutable.

Toutes les méthodes de test unitaire sont marquées avec l'attribut [TestMethod()], <TestMethod()> en Visual Basic, et sont membres de la classe [TestClass()]. Ensuite, cette classe est définie dans l'espace de noms Microsoft.VisualStudio.TestTools.UnitTesting. Lorsque vous générez un test unitaire, vous observez que cet espace de noms est inclus au début du fichier généré, dans une instruction using ou Imports.

Attributs et propriétés de tests unitaires

En plus de l'attribut [TestMethod()] de la méthode de test unitaire et de l'attribut [TestClass()] de sa classe conteneur, d'autres attributs sont utilisés pour activer la fonctionnalité spécifique aux tests unitaires. Il s'agit principalement des attributs [TestInitialize()] et [TestCleanup()]. Utilisez une méthode marquée avec [TestInitialize()] pour préparer des aspects de l'environnement dans lequel votre test unitaire s'exécutera ; le but est d'établir un état connu pour exécuter votre test unitaire. Par exemple, vous pouvez utiliser une méthode [TestInitialize()] pour copier, modifier ou créer certains fichiers de données que votre test utilisera.

Utilisez une méthode marquée avec [TestCleanup()] pour rétablir l'environnement à un état connu après l'exécution d'un test ; cela peut signifier supprimer des fichiers dans des dossiers ou rétablir une base de données à un état connu. En guise d'exemple, on peut citer la réinitialisation d'une base de données d'inventaire à un état initial après avoir testé une méthode utilisée dans une application d'enregistrement de commandes. En outre, il est recommandé d'utiliser du code de nettoyage dans une méthode [TestCleanup()] ou ClassCleanup et non dans une méthode de finaliseur. Les exceptions levées à partir d'une méthode de finaliseur ne sont pas interceptées et peuvent provoquer des résultats inattendus.

L'une des propriétés importantes sur les classes de test est la propriété TestContext. Cette propriété contient des informations telles que le nom du test unitaire en cours d'exécution, le répertoire de déploiement, les noms des fichiers journaux et, pour les tests pilotés par des données, la base de données à laquelle vous êtes connecté. La propriété TestContext retourne une instance TestContext. Pour plus d'informations, consultez Utilisation de la classe TestContext.

Exemple de test unitaire

L'extrait de code suivant montre un test unitaire simple écrit en C#.

[TestMethod()]
public void DebitTest()
{
    string customerName = "Mr. Bryan Walton"; 
    double balance = 11.99; 
    BankAccount target = new BankAccount(customerName, balance);
    double amount = 11.22; 
    target.Debit(amount);
    Assert.AreEqual((System.Convert.ToDouble(0.77)), target.Balance, 0.05); // 0.05 is tolerance for floating-point comparison
    //Assert.Inconclusive("A method that does not return a value cannot be verified.");
}

Pour obtenir un autre exemple, consultez Codage d'un test unitaire piloté par des données.

Résultats des tests unitaires

Il existe trois façons de vérifier qu'un test unitaire a réussi :

  • Utilisez une ou plusieurs instructions Assert pour valider des résultats spécifiques. Pour plus d'informations, consultez Utilisation d'instructions Assert.

  • Vérifiez qu'aucune exception n'a été levée. Il est encore recommandé d'utiliser une ou plusieurs instructions Assert.

  • Vérifiez qu'une exception particulière est levée. Pour cela, vous pouvez utiliser l'attribut ExpectedExceptionAttribute.

Utilisation d'instructions Assert

Si le résultat Réussite ou Échec produit par un test est plus informatif ou important pour vous que les actions que le test peut effectuer, vous devez utiliser une ou plusieurs instructions Assert dans le code du test.

Le moteur de test suppose que chaque test unitaire démarre dans un état de réussite. Le test reste dans cet état jusqu'à ce qu'une instruction Assert produise un résultat qui contredit l'état de réussite et fasse passer le test à l'état Échec ou Non concluant, ou jusqu'à ce qu'une exception non spécifiée dans un attribut ExpectedExceptionAttribute soit levée. Autrement dit, un test unitaire sans instruction Assert produira un résultat Réussite chaque fois qu'il est exécuté. Ce n'est pas nécessairement un test inutile ; il se peut que vous souhaitiez juste exercer le code pour vous assurer qu'il s'exécute sans lever d'exception. Le code exercé dans un test unitaire sera signalé comme couvert dans les statistiques de couverture du code même si le test a produit un résultat concluant ou s'il contenait une instruction Assert.

Toutefois, pour vérifier qu'une mesure spécifique est prise ou un état spécifique est atteint, vous devez utiliser des instructions Assert. Plusieurs instructions Assert sont disponibles dans l'espace de noms Microsoft.VisualStudio.TestTools.UnitTesting. Les différentes instructions Assert vous procurent une certaine flexibilité ; vous pouvez par exemple forcer l'échec d'un test en utilisant l'instruction Assert.Fail(). En plus de ces instructions Assert, vous pouvez bien sûr construire vos propres fonctionnalités personnalisées, par exemple en utilisant des instructions Assert dans des blocs if.

Quels que soient les résultats retournés par un test, sa réussite ou son échec dépend de ses instructions Assert. Si un test contient plusieurs instructions Assert, l'état du test reste Réussite jusqu'à ce qu'une autre instruction Assert modifie l'état à Échec ou Non concluant.

Pour plus d'informations, consultez Utilisation des classes Assert.

Voir aussi

Référence

Microsoft.VisualStudio.TestTools.UnitTesting

Autres ressources

Création de tests unitaires