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

Cette procédure pas à pas décrit la création, l'exécution et la personnalisation d'une série de tests à l'aide de Microsoft Visual Studio 2010. 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.

Notes

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 2010 Premium.

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

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

  3. Sous Modèles installés, cliquez sur Visual C#.

  4. Dans la liste de types d'applications, cliquez sur Bibliothèque de classes.

  5. Dans la zone Nom, tapez Banque, puis cliquez sur OK.

    Notes

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

    Le nouveau projet Banque est créé et affiché dans l'Explorateur de solutions, avec le fichier Class1.cs ouvert dans l'éditeur de code.

    Notes

    Si le fichier Class1.cs n'est pas ouvert dans l'éditeur de code, double-cliquez sur ce fichier dans l'Explorateur de solutions pour l'ouvrir.

  6. Copiez le code source de l'Exemple de projet pour la création de tests unitaires.

  7. Remplacez le contenu d'origine de Class1.cs par le code de l'Exemple de projet pour la création de tests unitaires.

  8. 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. Si le fichier Class1.cs n'est pas ouvert dans l'éditeur de code, dans l'Explorateur de solutions, double-cliquez sur ce fichier dans le projet Banque.

  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.

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

    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().

    Notes

    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.

  9. Pour connaître les valeurs à utiliser pour la méthode DebitTest, ouvrez le fichier Class1.cs et faites défiler jusqu'à la méthode Main. Notez que le nom de client est initialisé avec Mr. Bryan Walton, le solde de compte est initialisé avec 11.99, la méthode Credit est appelée avec le paramètre 5.77 et la méthode Debit est appelée avec le paramètre 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.

    Notes

    Vous utiliserez cette valeur Solde attendue (0.77) plus loin dans cette procédure pas à pas.

  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 la méthode CreditTest, ajoutez « M. Bryan Walton », 11.99) au nouveau compte bancaire.

  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. Dans le menu Test, cliquez sur Fenêtres et sélectionnez Affichage des tests.

    La fenêtre Affichage des tests s'affiche.

  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 du test s'affiche comme étant En cours d'exécution lorsque 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, cliquez avec le bouton droit de la souris sur la ligne qui représente le test, puis cliquez sur Afficher les détails des résultats des tests.

  4. La page Détails des résultats des tests contient le message d'erreur « Échec d'Assert.Inconclusive ». 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.

    Notes

    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, cliquez avec le bouton droit de la souris sur la ligne qui représente le test, puis cliquez sur Afficher les détails des résultats des tests.

    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.

    Notes

    Vous n'avez pas eu à régénérer le projet de test après avoir modifié le code source, car l'exécution d'un test en mode silencieux 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 à plusieurs autres reprises, en utilisant d'autres valeurs limites, telles que 15.00, 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.

Si vous utilisez Visual Studio 2010 Ultimate, vous pouvez créer des tests de chargement pour isoler les problèmes de contrainte et de performances à l'aide de tests unitaires.

Procédure pas à pas : création et exécution d'un test de charge contenant des tests unitaires

Voir aussi

Tâches

Exemple de projet pour la création de tests unitaires