Procédure pas à pas : création et exécution de tests unitaires

Mise à jour : novembre 2007

Cette procédure pas à pas décrit la création, l'exécution et la personnalisation d'une série de tests à l'aide des Outils de test Team System. Vous commencez avec un projet C# qui est en développement, vous créez des tests qui exercent son code, vous exécutez les tests et vous examinez les résultats. Ensuite, vous pouvez modifier votre code de projet et réexécuter les tests.

Remarque :

Pour plus d'informations sur la façon d'exécuter des tests à partir d'une ligne de commande, consultez Procédure pas à pas : utilisation de l'utilitaire de test de ligne de commande.

Dans cette procédure pas à pas, vous effectuerez les tâches suivantes :

  • Préparation d'un projet « Bank Account » à utiliser dans une procédure pas à pas.

  • Ouverture d'un projet existant.

  • Création de tests unitaires pour des méthodes publiques et privées.

  • Exécution de ces tests sur le code.

  • Recherche et correction d'erreurs dans les tests.

  • Recherche et correction d'erreurs dans le code.

Composants requis

Préparation de la procédure pas à pas

Pour préparer la procédure pas à pas

  1. Ouvrez Visual Studio Team System Test Edition.

  2. Dans le menu Fichier, pointez sur Nouveau, puis cliquez sur Projet.

    La boîte de dialogue Nouveau projet s'affiche.

  3. Sous Types de projets, cliquez sur Visual C#.

  4. Sous Modèles, cliquez sur Bibliothèque de classes.

  5. Sur la ligne Nom, tapez Bank, puis cliquez sur OK.

    Remarque :

    Si le nom « Bank » est déjà utilisé, choisissez un autre nom pour le projet.

    Le nouveau projet Bank est créé et affiché dans l'Explorateur de solutions.

  6. Double-cliquez sur le fichier Class1.cs dans l'Explorateur de solutions pour l'ouvrir dans l'éditeur de code Visual Studio.

  7. Copiez le code source de l'Test unitaire, exemple.

  8. Remplacez le contenu d'origine de Class1.cs par le code de l'Test unitaire, exemple.

  9. Dans le menu Générer, cliquez sur Générer la solution.

Vous avez maintenant un projet nommé Bank. Il contient le code source à tester et des outils avec lesquels le tester. L'espace de noms pour Bank, BankAccountNS, contient la classe publique BankAccount, dont vous testerez les méthodes dans les procédures suivantes.

Création d'un test unitaire

Condition préalable : suivez les étapes de la procédure intitulée Préparation de la procédure pas à pas.

Pour créer un test unitaire

  1. Dans l'Explorateur de solutions, double-cliquez sur le fichier Class1.cs dans le projet Bank.

    Le fichier source est alors ouvert et peut être affiché et modifié.

  2. Dans la classe BankAccount dans le fichier Class1.cs, faites défiler jusqu'à la méthode Debit().

  3. Cliquez avec le bouton droit sur la méthode Debit() et sélectionnez Créer des tests unitaires.

    Cela affiche la boîte de dialogue Créer des tests unitaires.

    Sous Sélection actuelle, une arborescence affiche la hiérarchie de classes et de membres de l'assembly qui héberge la classe BankAccount. Vous pouvez utiliser cette page pour générer des tests unitaires pour toute sélection de ces membres et pour choisir un projet de test dans lequel vous souhaitez placer les tests unitaires générés.

    Dans l'arborescence, seule la méthode Debit() est sélectionnée. Laissez-la sélectionnée et sélectionnez également la méthode Credit().

  4. Pour Projet de sortie, sélectionnez Créer un nouveau projet de test Visual C#.

  5. Cliquez sur Paramètres.

    La boîte de dialogue Paramètres de génération des tests s'affiche. Sous Paramètres d'affectation de nom, vous pouvez modifier la manière dont les fichiers de test, les classes de test et les méthodes de test sont nommés à mesure qu'ils sont générés. Sous Général, vous pouvez modifier d'autres aspects de génération de test. Conservez les valeurs par défaut de ces paramètres, puis cliquez sur OK.

  6. Dans la boîte de dialogue Créer des tests unitaires, cliquez sur OK.

    La boîte de dialogue Nouveau projet de test s'affiche.

  7. Acceptez le nom par défaut, puis cliquez sur Créer.

    Cela crée un projet nommé TestProject1, qui est affiché dans l'Explorateur de solutions.

    Un fichier nommé BankAccountTest.cs, qui contient une classe de test, est ajouté à TestProject1. La classe est renseignée avec une propriété TestContext et des méthodes permettant de tester les méthodes Debit() et Credit().

    Remarque :

    L'attribut TestMethod() est assigné automatiquement à chaque méthode de test. Chaque test correspond à une seule méthode du code sous test à tester. Les méthodes de test sont hébergées dans une classe de test à laquelle est assigné l'attribut TestClass().

  8. Dans BankAccountTest.cs, spécifiez les valeurs des variables à tester. Accédez par défilement à la méthode DebitTest, où vous voyez trois lignes // TODO qui indiquent les variables à définir. Quelles valeurs devez-vous utiliser ? Pour répondre à cette question, vous devez connaître les valeurs qui seront utilisées lors de l'exécution de l'application. Nous déterminons ces valeurs dans l'étape suivante.

  9. Ouvrez le fichier Class1.cs et faites défiler son contenu jusqu'à la méthode Main. Remarquez que le nom de client est initialisé à Mr. Bryan Walton, le solde du compte est initialisé à 11.99, la méthode Credit est appelée avec un paramètre de 5.77 et la méthode Debit est appelée avec un paramètre de 11.22. Par conséquent, si ce compte démarre avec une valeur Balance de 11.99, un appel à la méthode Debit en passant 11.22 doit produire une nouvelle valeur Balance de 0.77.

    Remarque :

    Vous utiliserez cette valeur Balance (0.77) attendue dans la procédure Exécution et personnalisation d'un test unitaire.

  10. Dans le fichier BankAccountTest.cs, accédez par défilement à la méthode DebitTest.

  11. Définissez les valeurs suivantes :

    BankAccount target = new BankAccount("Mr. Bryan Walton", 11.99);
    double amount = 11.22;
    
  12. Dans le fichier BankAccountTest.cs, effectuez ces mêmes modifications dans la méthode CreditTest.

  13. Enregistrez le fichier BankAccountTest.cs.

Vous avez créé un fichier de code source qui contient des tests pour le projet Bank. Vous êtes maintenant prêt à exécuter les tests de la classe BankAccountTest sur le code du projet Bank.

Exécution et personnalisation d'un test unitaire

Condition préalable : suivez les étapes de la procédure intitulée Création d'un test unitaire.

Pour exécuter et personnaliser un test unitaire

  1. Ouvrez la fenêtre Affichage de tests.

  2. Cliquez avec le bouton droit sur DebitTest, puis cliquez sur Exécuter la sélection.

    Si la fenêtre Résultats des tests n'est pas déjà ouverte, elle s'ouvre maintenant. Le test DebitTest s'exécute.

    Dans la colonne Résultat de la fenêtre Résultats des tests, l'état de test est affiché comme En cours d'exécution pendant que le test s'exécute. Une fois l'exécution du test terminée, le résultat devient Non concluant.

  3. Dans la fenêtre Résultats des tests, double-cliquez sur la ligne qui représente le test.

    La page Détails de résultats du test s'ouvre ; elle contient des informations relatives aux résultats du test.

  4. Remarquez que la page Détails de résultats du test affiche le message d'erreur « Assert.Inconclusive a échoué. Une méthode qui ne retourne pas une valeur ne peut pas être vérifiée ». Pour créer un test réussi, commencez par rechercher et évaluer cette instruction Assert.

  5. Pour rechercher la méthode de test qui contient l'instruction Assert, ouvrez le fichier BankAccountTest.cs et accédez par défilement à la méthode DebitTest().

  6. L'instruction Assert est la dernière ligne de la méthode DebitTest. Elle se présente comme suit :

    Assert.Inconclusive("A method that does not return a value cannot be verified.");
    

    Transformez cette instruction Assert en commentaire.

  7. Si vous exécutiez maintenant le test, il donnerait un résultat Réussite, mais uniquement car il ne testerait rien. Vous devez ajouter du code qui teste les résultats attendus. Ajoutez l'instruction suivante à la fin de la méthode DebitTest :

    Assert.AreEqual((System.Convert.ToDouble(0.77)), target.Balance, 0.05);
    

    Cette instruction compare le résultat attendu (0.77) avec le résultat réel d'un appel à la méthode Balance de la classe BankAccount. Si les deux valeurs sont inégales, l'instruction Assert retourne False, ce qui fait échouer le test.

    Remarque :

    Cette instruction Assert inclut un troisième paramètre, delta, avec une valeur de 0.05. Le paramètre delta est requis dans cette surcharge de la méthode Assert.AreEqual ; il compense l'erreur d'arrondi intrinsèque dans les types virgule flottante tels que Doubles.

Vous avez exécuté la méthode DebitTest générée de votre classe de test BankAccountTest, remarqué qu'elle nécessitait des modifications et apporté ces modifications. Vous pouvez maintenant tester l'exactitude de la méthode Debit dans votre application.

Exécution d'un test unitaire et correction de votre code

Condition préalable : suivez les étapes de la procédure intitulée Exécution et personnalisation d'un test unitaire.

Pour exécuter un test unitaire et corriger votre code

  1. Exécutez de nouveau le test Debit : dans le fichier BankAccountTest.cs, cliquez avec le bouton droit sur la méthode DebitTest () puis cliquez sur Exécuter les tests.

    Dans la colonne Résultat de la fenêtre Résultats des tests, l'état de test est affiché comme En cours d'exécution pendant que le test s'exécute. Une fois l'exécution du test terminée, le résultat devient Échec.

  2. Dans la fenêtre Résultats des tests, double-cliquez sur la ligne qui représente le test.

    La page Détails de résultats du test s'ouvre. Elle affiche le message d'erreur « Assert.AreEqual a échoué. Différence attendue non supérieure à <0.05> comprise entre la valeur attendue <0.77> et la valeur réelle <23.21 >." Ces valeurs semblent indiquer une opération mathématique incorrecte. La méthode DebitTest de la classe BankAccountTest testant la méthode Debit de la classe BankAccount, commencez par vérifier la méthode Debit.

  3. Ouvrez le fichier Class1.cs et accédez par défilement à la méthode Debit.

  4. Remarquez l'assignation suivante :

    m_balance += amount;
    

    Cette assignation ajoute un montant à un solde alors que, dans une méthode Debit, elle devrait soustraire. Modifiez cette ligne comme suit :

    m_balance -= amount;
    
  5. Réexécutez le test Debit.

    La colonne Résultat de la fenêtre Résultats des tests affiche Réussite pour DebitTest.

    Remarque :

    Vous n'avez pas eu à régénérer le projet après avoir modifié le code source car l'exécution silencieuse d'un test génère le projet.

Vous avez créé un test unitaire qui fonctionne et, grâce à lui, vous avez trouvé et corrigé une erreur dans votre code.

Création et exécution d'un test unitaire pour une méthode privée

Condition préalable : suivez les étapes de la procédure intitulée Exécution d'un test unitaire et correction de votre code.

Pour créer et exécuter un test unitaire pour une méthode privée

  1. Ouvrez le fichier Class1.cs dans le projet Bank.

  2. Cliquez avec le bouton droit sur la méthode FreezeAccount() et sélectionnez Créer des tests unitaires.

    La boîte de dialogue Créer des tests unitaires s'affiche.

    Dans l'arborescence affichée, seule la méthode FreezeAccount() est sélectionnée.

  3. (Facultatif) Cliquez sur Filtre, puis effacez Afficher les éléments non publics. Notez que la méthode FreezeAccount () est supprimée dans la liste de méthodes enfants de la classe BankAccount. Cliquez à nouveau sur Filtre, puis sélectionnez Afficher les éléments non publics pour réafficher la méthode FreezeAccount().

  4. Vérifiez que la méthode FreezeAccount() est sélectionnée, puis cliquez sur OK.

    Cela permet de créer un fichier d'accesseur private dénommé Bank.accessor qui contient des méthodes d'accesseur spéciales utilisées par le test pour appeler indirectement des méthodes privées dans la classe BankAccount. Le nouveau fichier est affiché dans l'Explorateur de solutions, dans le dossier Références de test.

  5. Ouvrez le fichier BankAccountTest.cs et accédez par défilement à la méthode FreezeAccountTest().

  6. Modifiez le code de la méthode FreezeAccountTest () de sorte qu'il se présente comme suit. Les nouvelles zones ou les zones modifiées sont indiquées :

    public void FreezeAccountTest()
    {
        BankAccount_Accessor target = new BankAccount_Accessor("Mr. Bryan Walton", 11.99); // TODO: Initialize to an appropriate value
    target.FreezeAccount(); 
        // Assert.Inconclusive("A method that does not return a value cannot be verified.");
            bool creditAccount = false; // False means account could be credited: Fail test.     // Try to credit account    try    {        target.Credit(1.00);     }    catch (System.Exception)    {        // Threw exception. FreezeAccount worked correctly: Pass test.         creditAccount = true;    }        // Assert fails if 'creditAccount' condition is false. Fail test.    Assert.IsTrue(creditAccount, "Was able to credit account.");
    }
    
  7. Exécutez le test FreezeAccountTest.

    Dans la colonne Résultat de la fenêtre Résultats des tests, l'état final du test affiché est Réussite. C'est le résultat attendu parce que le test a appelé la méthode Credit () après avoir figé le compte en appelant la méthode FreezeAccount ().

Vous avez ajouté une méthode privée, créé un test unitaire et exécuté le test. Vous pouvez l'exécuter d'autres fois, en utilisant d'autres valeurs limites, telles que 15.00 par exemple, pour la variable balance .

Étapes suivantes

Lorsque vous exécutez des tests sur le code d'un assembly, vous pouvez voir dans quelle proportion le code de votre projet est testé en collectant les données de couverture du code. Pour plus d'informations, consultez Procédure pas à pas : exécution des tests et affichage de la couverture du code.

Vous pouvez exécuter des tests sur une ligne de commande au lieu de le faire dans Visual Studio. Pour plus d'informations, consultez Procédure pas à pas : utilisation de l'utilitaire de test de ligne de commande.

Voir aussi

Tâches

Test unitaire, exemple

Concepts

Infrastructure de test unitaire

Résultats de tests rapportés