Procédure pas à pas : développement basé d’abord sur les tests avec la fonctionnalité Générer à partir de l’utilisationWalkthrough: Test-first development with the Generate From Usage feature

Cette rubrique montre comment utiliser la fonctionnalité Générer à partir de l’utilisation, qui prend en charge le développement basé d’abord sur les tests.This topic demonstrates how to use the Generate From Usage feature, which supports test-first development.

Ledéveloppement basé d’abord sur les tests est une approche de conception logicielle dans laquelle vous écrivez d’abord des tests unitaires basés sur des spécifications de produits, puis vous écrivez le code source nécessaire pour que les tests réussissent.Test-first development is an approach to software design in which you first write unit tests based on product specifications, and then write the source code that is required to make the tests succeed. Visual Studio prend en charge le développement basé d’abord sur les tests en générant de nouveaux types et membres dans le code source lorsque vous y faites référence pour la première fois dans vos cas de test, avant de les définir.Visual Studio supports test-first development by generating new types and members in the source code when you first reference them in your test cases, before they are defined.

Visual Studio génère les nouveaux types et membres avec une interruption minimale de votre flux de travail.Visual Studio generates the new types and members with minimal interruption to your workflow. Vous pouvez créer des stubs pour des types, méthodes, propriétés, champs ou constructeurs sans quitter votre emplacement actuel dans le code.You can create stubs for types, methods, properties, fields, or constructors without leaving your current location in code. Quand vous ouvrez une boîte de dialogue pour spécifier des options de génération de type, le fichier ouvert actuellement récupère immédiatement le focus lorsque la boîte de dialogue se ferme.When you open a dialog box to specify options for type generation, the focus returns immediately to the current open file when the dialog box closes.

Vous pouvez utiliser la fonctionnalité Générer à partir de l’utilisation avec des frameworks de test qui s’intègrent à Visual Studio.The Generate From Usage feature can be used with test frameworks that integrate with Visual Studio. Dans cette rubrique, nous allons utiliser l’infrastructure de test unitaire Microsoft.In this topic, the Microsoft Unit Testing Framework is demonstrated.

Note

Il est possible que pour certains des éléments de l’interface utilisateur de Visual Studio, votre ordinateur affiche des noms ou des emplacements différents de ceux indiqués dans les instructions suivantes.Your computer might show different names or locations for some of the Visual Studio user interface elements in the following instructions. L’édition de Visual Studio dont vous disposez et les paramètres que vous utilisez déterminent ces éléments.The Visual Studio edition that you have and the settings that you use, determine these elements. Pour plus d’informations, consultez Personnaliser l’IDE.For more information, see Personalize the IDE.

Créer un projet de bibliothèque de classes Windows et un projet de testCreate a Windows Class Library project and a Test project

  1. Dans Visual C#Visual C# ou Visual BasicVisual Basic, créez un projet de bibliothèque de classes Windows.In Visual C#Visual C# or Visual BasicVisual Basic, create a new Windows Class Library project. Nommez-le GFUDemo_VB ou GFUDemo_CS, selon le langage que vous utilisez.Name it GFUDemo_VB or GFUDemo_CS, depending on which language you are using.

  2. Dans l’Explorateur de solutions, cliquez avec le bouton droit sur l’icône de solution en haut, choisissez Ajouter, puis choisissez Nouveau projet.In Solution Explorer, right-click the solution icon at the top, choose Add, and then choose New Project. Dans le volet gauche de la boîte de dialogue Nouveau projet, choisissez Tester.In the left pane of the New Project dialog box, choose Test.

  3. Dans le volet central, choisissez Projet de test unitaire et acceptez le nom par défaut UnitTestProject1.In the middle pane, choose Unit Test Project and accept the default name of UnitTestProject1. L’illustration suivante montre la boîte de dialogue quand elle apparaît dans Visual C#Visual C#.The following illustration shows the dialog box when it appears in Visual C#Visual C#. Dans Visual BasicVisual Basic, la boîte de dialogue a une apparence similaire.In Visual BasicVisual Basic, the dialog box looks similar.

    Nouveau projet de test, boîte de dialogue

  4. Choisissez OK pour fermer la boîte de dialogue Nouveau projet.Choose OK to close the New Project dialog box.

Ajouter une référence au projet de bibliothèque de classesAdd a reference to the Class Library project

  1. Dans l’Explorateur de solutions, sous votre projet de test unitaire, cliquez avec le bouton droit sur l’entrée Références, puis choisissez Ajouter une référence.In Solution Explorer, under your unit test project, right-click the References entry and choose Add Reference.

  2. Dans la boîte de dialogue Gestionnaire de références, sélectionnez Projets, puis sélectionnez le projet de bibliothèque de classes.In the Reference Manager dialog box, select Projects and then select the class library project.

  3. Choisissez OK pour fermer la boîte de dialogue Gestionnaire de références.Choose OK to close the Reference Manager dialog box.

  4. Enregistrez votre solution.Save your solution. Vous êtes maintenant prêt à commencer l’écriture des tests.You are now ready to begin writing tests.

Générer une nouvelle classe à partir d’un test unitaireGenerate a new class from a unit test

  1. Le projet de test contient un fichier nommé UnitTest1.The test project contains a file that is named UnitTest1. Double-cliquez sur ce fichier dans l’Explorateur de solutions pour l’ouvrir dans l’éditeur de code.Double-click this file in Solution Explorer to open it in the code editor. Une classe de test et une méthode de test ont été générées.A test class and test method have been generated.

  2. Recherchez la déclaration de classe UnitTest1 et renommez-la AutomobileTest.Locate the declaration for class UnitTest1 and rename it to AutomobileTest.

    Note

    IntelliSense offre désormais deux options pour la saisie semi-automatique des instructions IntelliSense : le mode de saisie semi-automatique et le mode de suggestion.IntelliSense now provides two alternatives for IntelliSense statement completion: completion mode and suggestion mode. Utilisez le mode de suggestion quand les classes et les membres sont utilisés avant d’être définis.Use suggestion mode for situations in which classes and members are used before they are defined. Quand une fenêtre IntelliSense est ouverte, vous pouvez appuyer sur Ctrl+Alt+Barre d’espace pour basculer entre le mode de complétion et le mode de suggestion.When an IntelliSense window is open, you can press Ctrl+Alt+Space to toggle between completion mode and suggestion mode. Pour plus d’informations, consultez Utiliser IntelliSense.See Use IntelliSense for more information. Le mode de suggestion sera utile lorsque vous taperez Automobile à l’étape suivante.Suggestion mode will help when you are typing Automobile in the next step.

  3. Recherchez la méthode TestMethod1() et renommez-la DefaultAutomobileIsInitializedCorrectly().Locate the TestMethod1() method and rename it to DefaultAutomobileIsInitializedCorrectly(). Dans cette méthode, créez une instance d’une classe nommée Automobile, comme illustré dans les captures d’écran suivantes.Inside this method, create a new instance of a class named Automobile, as shown in the following screenshots. Une ligne ondulée s’affiche pour signaler une erreur de compilation. Une ampoule Actions rapides s’affiche dans la marge de gauche (dans C# uniquement), ou directement sous la ligne ondulée si vous pointez dessus.A wavy underline appears, which indicates a compile-time error, and a Quick Actions light bulb appears in the left margin (C# only), or directly below the squiggle if you hover over it.

    Actions rapides en Visual Basic

    Actions rapides en C#

  4. Choisissez l’ampoule Actions rapides ou cliquez sur celle-ci.Choose or click the Quick Actions light bulb. Un message d’erreur s’affiche, indiquant que le type Automobile n’est pas défini.You'll see an error message that states that the type Automobile is not defined. Des solutions vous sont également proposées.You are also presented with some solutions.

  5. Cliquez sur Générer un nouveau type pour ouvrir la boîte de dialogue Générer un type.Click Generate new type to open the Generate Type dialog box. Cette boîte de dialogue fournit des options, notamment pour générer le type dans un autre projet.This dialog box provides options that include generating the type in a different project.

  6. Dans la liste Projet, cliquez sur GFUDemo_VB ou GFUDemo_CS pour indiquer à Visual Studio d’ajouter le fichier au projet de bibliothèque de classes plutôt qu’au projet de test.In the Project list, click GFUDemo_VB or GFUDemo_CS to instruct Visual Studio to add the file to the class library project instead of the test project. S’il n’est pas déjà sélectionné, choisissez Créer un fichier et nommez-le Automobile.cs ou Automobile.vb.If it's not already selected, choose Create new file and name it Automobile.cs or Automobile.vb.

    Boîte de dialogue Générer un nouveau type

  7. Cliquez sur OK pour fermer la boîte de dialogue et créer le fichier.Click OK to close the dialog box and create the new file.

  8. Dans l’Explorateur de solutions, regardez sous le nœud du projet GFUDemo_VB ou GFUDemo_CS pour vérifier que le nouveau fichier Automobile.vb ou Automobile.cs s’y trouve.In Solution Explorer, look under the GFUDemo_VB or GFUDemo_CS project node to verify that the new Automobile.vb or Automobile.cs file is there. Dans l’éditeur de code, le focus est toujours dans AutomobileTest.DefaultAutomobileIsInitializedCorrectly, ce qui vous permet de continuer à écrire votre test avec un minimum d’interruption.In the code editor, the focus is still in AutomobileTest.DefaultAutomobileIsInitializedCorrectly, which enables you to continue to write your test with a minimum of interruption.

Générer un stub de propriétéGenerate a property stub

Supposez que la spécification de produit indique que la classe Automobile a deux propriétés publiques nommées Model et TopSpeed.Assume that the product specification states that the Automobile class has two public properties named Model and TopSpeed. Ces propriétés doivent être initialisées avec les valeurs par défaut "Not specified" et -1 par le constructeur par défaut.These properties must be initialized with default values of "Not specified" and -1 by the default constructor. Le test unitaire suivant vérifie que le constructeur par défaut affecte les valeurs par défaut correctes aux propriétés.The following unit test will verify that the default constructor sets the properties to their correct default values.

  1. Ajoutez la ligne de code suivante à la méthode de test DefaultAutomobileIsInitializedCorrectly.Add the following line of code to the DefaultAutomobileIsInitializedCorrectly test method.

    Assert.IsTrue((myAuto.Model == "Not specified") && (myAuto.TopSpeed == -1));
    
    Assert.IsTrue((myAuto.Model = "Not specified") And (myAuto.TopSpeed = -1))
    
  2. Du fait que le code fait référence à deux propriétés non définies sur Automobile, une ligne ondulée s’affiche sous Model et TopSpeed.Because the code references two undefined properties on Automobile, a wavy underline appears under Model and TopSpeed. Pointez sur Model et choisissez l’ampoule Actions rapides, puis choisissez Générer la propriété « Automobile.Model ».Hover over Model and choose the Quick Actions light bulb, then choose Generate property 'Automobile.Model'.

  3. Générez un stub pour la propriété TopSpeed de la même façon.Generate a property stub for the TopSpeed property in the same way.

    Dans la classe Automobile , les types des nouvelles propriétés sont correctement déduits du contexte.In the Automobile class, the types of the new properties are correctly inferred from the context.

Générer un stub pour un nouveau constructeurGenerate a stub for a new constructor

Maintenant, nous allons créer une méthode de test qui génère un stub de constructeur pour initialiser les propriétés Model et TopSpeed.Now we'll create a test method that will generate a constructor stub to initialize the Model and TopSpeed properties. Plus tard, vous ajouterez du code pour terminer le test.Later, you'll add more code to complete the test.

  1. Ajoutez la méthode de test supplémentaire suivante à votre classe AutomobileTest .Add the following additional test method to your AutomobileTest class.

    [TestMethod]
    public void AutomobileWithModelNameCanStart()
    {
        string model = "Contoso";
        int topSpeed = 199;
        Automobile myAuto = new Automobile(model, topSpeed);
    }
    
    <TestMethod()> Public Sub AutomobileWithModelNameCanStart()
        Dim model As String = "Contoso"
        Dim topSpeed As Integer = 199
        Dim myAuto As New Automobile(model, topSpeed)
    End Sub
    
  2. Cliquez sur l’ampoule Actions rapides sous la ligne ondulée rouge, puis cliquez sur Générer un constructeur dans « Automobile ».Click the Quick Actions light bulb under the red squiggle, and then click Generate constructor in 'Automobile'.

    Dans le fichier de classe Automobile , notez que le nouveau constructeur a examiné les noms des variables locales utilisées dans l’appel de constructeur, qu’il a identifié des propriétés ayant le même nom dans la classe Automobile et qu’il a fourni du code dans le corps du constructeur pour stocker les valeurs d’arguments dans les propriétés Model et TopSpeed .In the Automobile class file, notice that the new constructor has examined the names of the local variables that are used in the constructor call, found properties that have the same names in the Automobile class, and supplied code in the constructor body to store the argument values in the Model and TopSpeed properties.

  3. Une fois le nouveau constructeur généré, une ligne ondulée apparaît sous l’appel au constructeur par défaut dans DefaultAutomobileIsInitializedCorrectly.After you generate the new constructor, a wavy underline appears under the call to the default constructor in DefaultAutomobileIsInitializedCorrectly. Le message d’erreur indique que la classe Automobile n’a aucun constructeur qui n’accepte aucun argument.The error message states that the Automobile class has no constructor that takes zero arguments. Pour générer un constructeur explicite par défaut sans aucun paramètre, cliquez sur l’ampoule Actions rapides, puis cliquez sur Générer un constructeur dans « Automobile ».To generate an explicit default constructor that does not have parameters, click the Quick Actions light bulb, and then click Generate constructor in 'Automobile'.

Générer un stub pour une méthodeGenerate a stub for a method

Supposez que la spécification stipule qu’un nouvel élément Automobile peut être placé dans l’état IsRunning si ses propriétés Model et TopSpeed ont des valeurs autres que les valeurs par défaut.Assume that the specification states that a new Automobile can be put into a IsRunning state if its Model and TopSpeed properties are set to something other than the default values.

  1. Ajoutez les lignes suivantes à la méthode AutomobileWithModelNameCanStart .Add the following lines to the AutomobileWithModelNameCanStart method.

    myAuto.Start();
    Assert.IsTrue(myAuto.IsRunning == true);
    
    myAuto.Start()
    Assert.IsTrue(myAuto.IsRunning = True)
    
  2. Cliquez sur l’ampoule Actions rapides pour l’appel de la méthode myAuto.Start, puis cliquez sur Générer une méthode « Automobile.Start ».Click the Quick Actions light bulb for the myAuto.Start method call and then click Generate method 'Automobile.Start'.

  3. Cliquez sur l’ampoule Actions rapides pour la propriété IsRunning, puis cliquez sur Générer la propriété « Automobile.IsRunning ».Click the Quick Actions light bulb for the IsRunning property and then click Generate property 'Automobile.IsRunning'.

    La classe Automobile contient maintenant une méthode nommée Start() et une propriété nommée IsRunning.The Automobile class now contains a method named Start() and a property named IsRunning.

Exécuter les testsRun the tests

  1. Dans le menu Test, choisissez Exécuter > Tous les tests.On the Test menu, choose Run > All Tests.

    La commande Exécuter > Tous les tests exécute tous les tests dans tous les frameworks de tests écrits pour la solution active.The Run > All Tests command runs all the tests in any test frameworks that are written for the current solution. Il y a ici deux tests, qui échouent comme prévu.In this case, there are two tests, and they both fail, as expected. Le test DefaultAutomobileIsInitializedCorrectly échoue car la condition Assert.IsTrue retourne False.The DefaultAutomobileIsInitializedCorrectly test fails because the Assert.IsTrue condition returns False. Le test AutomobileWithModelNameCanStart échoue car la méthode Start dans la classe Automobile lève une exception.The AutomobileWithModelNameCanStart test fails because the Start method in the Automobile class throws an exception.

    La fenêtre Résultats des tests est illustrée ci-dessous.The Test Results window is shown in the following illustration.

    Résultats des tests qui ont échoué

  2. Dans la fenêtre Résultats des tests, double-cliquez sur chaque ligne de résultat de test pour accéder à l’emplacement de chaque test.In the Test Results window, double-click on each test result row to go to the location of each test.

Implémenter le code sourceImplement the source code

  1. Ajoutez le code suivant au constructeur par défaut pour que les propriétés Model, TopSpeed et IsRunning soient toutes initialisées à leurs valeurs par défaut "Not specified", -1 et False (ou false pour C#).Add the following code to the default constructor so that the Model, TopSpeed and IsRunning properties are all initialized to their correct default values of "Not specified", -1, and False (or false for C#).

    public Automobile()
    {
        this.Model = "Not specified";
        this.TopSpeed = -1;
        this.IsRunning = true;
    }
    
    Sub New()
        Model = "Not specified"
        TopSpeed = -1
        IsRunning = True
    End Sub
    
  2. Quand la méthode Start est appelée, elle doit affecter la valeur true à l’indicateur IsRunning uniquement si les propriétés Model ou TopSpeed ont des valeurs autres que leurs valeurs par défaut.When the Start method is called, it should set the IsRunning flag to true only if the Model or TopSpeed properties are set to something other than their default value. Supprimez NotImplementedException du corps de la méthode et ajoutez le code suivant.Remove the NotImplementedException from the method body and add the following code.

    public void Start()
    {
        if (this.Model != "Not specified" || this.TopSpeed != -1)
            this.IsRunning = true;
        else
            this.IsRunning = false;
    }
    
    Sub Start()
        If Model <> "Not specified" Or TopSpeed <> -1 Then
            IsRunning = True
        Else
            IsRunning = False
        End If
    End Sub
    

Réexécuter des testsRun the tests again

  • Dans le menu Test, pointez sur Exécuter, puis cliquez sur Tous les tests.On the Test menu, point to Run, and then click All Tests.

    Cette fois-ci, les tests réussissent.This time the tests pass. La fenêtre Résultats des tests est illustrée ci-dessous.The Test Results window is shown in the following illustration.

    Résultats des tests qui ont réussi

Voir aussiSee also