Procedura dettagliata: Sviluppo di test preventivi con la funzionalità di generazione dall'utilizzoWalkthrough: Test-first development with the Generate From Usage feature

Questo argomento illustra come usare la funzionalità di generazione dall'utilizzo, che supporta lo sviluppo di test preventivi.This topic demonstrates how to use the Generate From Usage feature, which supports test-first development.

Losviluppo di test preventivi è un approccio alla progettazione software in cui prima si scrivono unit test in base alle specifiche del prodotto e quindi si scrive il codice sorgente necessario per fare in modo che i test abbiano esito positivo.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 supporta lo sviluppo di test preventivi grazie alla generazione di nuovi tipi e membri nel codice sorgente quando si fa riferimento a essi per la prima volta nei test case, prima che vengano definiti.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 genera i nuovi tipi e membri con un'interruzione minima del flusso di lavoro.Visual Studio generates the new types and members with minimal interruption to your workflow. È possibile creare stub per tipi, metodi, proprietà, campi o costruttori senza abbandonare la posizione corrente nel codice.You can create stubs for types, methods, properties, fields, or constructors without leaving your current location in code. Quando si apre una finestra di dialogo per specificare le opzioni per la generazione dei tipi, lo stato attivo torna immediatamente al file aperto corrente quando si chiude la finestra di dialogo.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.

La funzionalità di generazione dall'uso può essere usata con framework di test che si integrano con Visual Studio.The Generate From Usage feature can be used with test frameworks that integrate with Visual Studio. In questo argomento viene illustrato il framework di unit test Microsoft.In this topic, the Microsoft Unit Testing Framework is demonstrated.

Note

I nomi o i percorsi visualizzati per alcuni elementi dell'interfaccia utente di Visual Studio in questo articolo potrebbero essere diversi nel computer in uso.Your computer might show different names or locations for some of the Visual Studio user interface elements in this article. È infatti possibile che si usi un'edizione diversa di Visual Studio o impostazioni di ambiente diverse.You may be using a different edition of Visual Studio or different environment settings. Per altre informazioni, vedere Personalizzare l'IDE.For more information, see Personalize the IDE.

Creare un progetto di libreria di classi Windows e un progetto di testCreate a Windows Class Library project and a Test project

  1. In C# o Visual Basic creare un nuovo progetto di Libreria di classi Windows.In C# or Visual Basic, create a new Windows Class Library project. Assegnare al progetto il nome GFUDemo_VB o GFUDemo_CS, a seconda del linguaggio in uso.Name it GFUDemo_VB or GFUDemo_CS, depending on which language you are using.

  2. In Esplora soluzioni fare clic con il pulsante destro del mouse sull'icona in alto, scegliere Aggiungi > Nuovo progetto.In Solution Explorer, right-click the solution icon at the top, choose Add > New Project.

  3. Creare un nuovo progetto Progetto unit test (.NET Framework) .Create a new Unit Test Project (.NET Framework) project.

    La figura seguente illustra la finestra di dialogo Nuovo progetto per modelli C#.The following illustration shows the New Project dialog box for C# templates.

    Modello Progetto unit test

Aggiungere un riferimento al progetto di libreria di classiAdd a reference to the Class Library project

  1. Nel progetto di unit test in Esplora soluzioni fare clic con il pulsante destro del mouse sulla voce Riferimenti e scegliere Aggiungi riferimento.In Solution Explorer, under your unit test project, right-click the References entry and choose Add Reference.

  2. Nella finestra di dialogo Gestione riferimenti selezionare Progetti e scegliere un progetto di libreria di classi.In the Reference Manager dialog box, select Projects and then select the class library project.

  3. Scegliere OK per chiudere la finestra di dialogo Gestione riferimenti.Choose OK to close the Reference Manager dialog box.

  4. Salvare la soluzione.Save your solution. A questo punto, è possibile iniziare a scrivere test.You are now ready to begin writing tests.

Generare una nuova classe da uno unit testGenerate a new class from a unit test

  1. Il progetto di test contiene un file denominato UnitTest1.The test project contains a file that is named UnitTest1. Fare doppio clic su questo file in Esplora soluzioni per aprirlo nell'editor del codice.Double-click this file in Solution Explorer to open it in the code editor. Vengono generati una classe di test e un metodo di test.A test class and test method have been generated.

  2. Individuare la dichiarazione della classe UnitTest1 e rinominarla in AutomobileTest.Locate the declaration for class UnitTest1 and rename it to AutomobileTest.

    Note

    IntelliSense offre ora due alternative per il completamento delle istruzioni IntelliSense: la modalità di terminazione e la modalità con suggerimenti.IntelliSense now provides two alternatives for IntelliSense statement completion: completion mode and suggestion mode. Usare la modalità con suggerimenti per i casi in cui classi e membri vengono usati prima di essere definiti.Use suggestion mode for situations in which classes and members are used before they are defined. Quando una finestra di IntelliSense è aperta, è possibile premere CTRL+ALT+BARRA SPAZIATRICE per passare dalla modalità di terminazione alla modalità con suggerimenti e viceversa.When an IntelliSense window is open, you can press Ctrl+Alt+Space to toggle between completion mode and suggestion mode. Per altre informazioni, vedere Usare IntelliSense.See Use IntelliSense for more information. La modalità con suggerimenti sarà utile quando si digita Automobile nel passaggio successivo.Suggestion mode will help when you are typing Automobile in the next step.

  3. Individuare il metodo TestMethod1() e rinominarlo in DefaultAutomobileIsInitializedCorrectly().Locate the TestMethod1() method and rename it to DefaultAutomobileIsInitializedCorrectly(). All'interno di questo metodo creare una nuova istanza di una classe denominata Automobile, come illustrato negli screenshot seguenti.Inside this method, create a new instance of a class named Automobile, as shown in the following screenshots. Vengono visualizzate una sottolineatura ondulata che indica un errore in fase di compilazione e una lampadina di errore Azioni rapide nel margine a sinistra o direttamente sotto la sottolineatura a zigzag se si passa il puntatore del mouse.A wavy underline appears, which indicates a compile-time error, and a Quick Actions error light bulb appears in the left margin, or directly below the squiggle if you hover over it.

    Azioni rapide in Visual Basic

    Azioni rapide in C#

  4. Scegliere o fare clic sulla lampadina Azioni rapide.Choose or click the Quick Actions light bulb. Verrà visualizzato un messaggio di errore a indicare che il tipo Automobile non è definito.You'll see an error message that states that the type Automobile is not defined. Vengono anche proposte alcune soluzioni.You are also presented with some solutions.

  5. Fare clic su Genera nuovo tipo per aprire la finestra di dialogo Genera tipo.Click Generate new type to open the Generate Type dialog box. Questa finestra di dialogo contiene alcune opzioni, tra cui la possibilità di generare il tipo in un progetto diverso.This dialog box provides options that include generating the type in a different project.

  6. Nell'elenco Progetto fare clic su GFUDemo_VB o GFUDemo_CS per indicare a Visual Studio di aggiungere il file al progetto di libreria di classi invece che al progetto di 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. Se non è già selezionata, scegliere l'opzione Crea nuovo file e denominare il file Automobile.cs o Automobile.vb.If it's not already selected, choose Create new file and name it Automobile.cs or Automobile.vb.

    Finestra di dialogo Genera nuovo tipo

  7. Fare clic su OK per chiudere la finestra di dialogo e creare il nuovo file.Click OK to close the dialog box and create the new file.

  8. In Esplora soluzioni verificare che sotto il nodo di progetto GFUDemo_VB o GFUDemo_CS sia presente il nuovo file Automobile.vb o Automobile.cs.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. Nell'editor del codice lo stato attivo è ancora in AutomobileTest.DefaultAutomobileIsInitializedCorrectly. È quindi possibile continuare a scrivere il test con un'interruzione minima.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.

Generare uno stub per una proprietàGenerate a property stub

Si supponga che la specifica del prodotto indichi che la classe Automobile ha due proprietà pubbliche denominate Model e TopSpeed.Assume that the product specification states that the Automobile class has two public properties named Model and TopSpeed. Queste proprietà devono essere inizializzate con i valori predefiniti "Not specified" e -1 dal costruttore predefinito.These properties must be initialized with default values of "Not specified" and -1 by the default constructor. Lo unit test seguente verificherà che il costruttore predefinito imposti le proprietà sui valori predefiniti corretti.The following unit test will verify that the default constructor sets the properties to their correct default values.

  1. Aggiungere la riga di codice seguente al metodo di test di 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. Poiché il codice fa riferimento a due proprietà non definite in Automobile, viene visualizzata una sottolineatura ondulata sotto Model e TopSpeed.Because the code references two undefined properties on Automobile, a wavy underline appears under Model and TopSpeed. Passare il puntatore del mouse su Model, scegliere la lampadina di errore Azioni rapide e quindi l'opzione Genera proprietà 'Automobile.Model' .Hover over Model and choose the Quick Actions error light bulb, then choose Generate property 'Automobile.Model'.

  3. Generare uno stub per la proprietà TopSpeed nello stesso modo.Generate a property stub for the TopSpeed property in the same way.

    Nella classe Automobile i tipi delle nuove proprietà vengono dedotti correttamente dal contesto.In the Automobile class, the types of the new properties are correctly inferred from the context.

Generare uno stub per un nuovo costruttoreGenerate a stub for a new constructor

A questo punto viene creato un metodo di test che genererà uno stub per il costruttore per inizializzare le proprietà Model e TopSpeed.Now we'll create a test method that will generate a constructor stub to initialize the Model and TopSpeed properties. Successivamente, verrà aggiunto altro codice per completare il test.Later, you'll add more code to complete the test.

  1. Aggiungere l'ulteriore metodo di test seguente alla 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. Fare clic sulla lampadina di errore Azioni rapide sotto la sottolineatura rossa a zigzag e selezionare Genera costruttore in 'Automobile' .Click the Quick Actions error light bulb under the red squiggle, and then click Generate constructor in 'Automobile'.

    Nel file della classe Automobile osservare che il nuovo costruttore ha esaminato i nomi delle variabili locali che vengono usati nella chiamata al costruttore, ha trovato le proprietà che hanno gli stessi nomi nella classe Automobile e ha fornito il codice nel corpo del costruttore per archiviare i valori degli argomenti nelle proprietà Model e 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. Dopo aver generato il nuovo costruttore, viene visualizzata una sottolineatura ondulata sotto la chiamata al costruttore predefinito in DefaultAutomobileIsInitializedCorrectly.After you generate the new constructor, a wavy underline appears under the call to the default constructor in DefaultAutomobileIsInitializedCorrectly. Il messaggio di errore indica che la classe Automobile non ha un costruttore che accetta zero argomenti.The error message states that the Automobile class has no constructor that takes zero arguments. Per generare un costruttore predefinito esplicito che non ha parametri, fare clic sulla lampadina di errore Azioni rapide e quindi su Genera costruttore in 'Automobile' .To generate an explicit default constructor that does not have parameters, click the Quick Actions error light bulb, and then click Generate constructor in 'Automobile'.

Generare uno stub per un metodoGenerate a stub for a method

Si supponga che la specifica indichi che un nuovo oggetto Automobile può essere impostato in uno stato IsRunning se le sue proprietà Model e TopSpeed sono impostate su valori diversi da quelli predefiniti.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. Aggiungere le righe seguenti al metodo AutomobileWithModelNameCanStart .Add the following lines to the AutomobileWithModelNameCanStart method.

    myAuto.Start();
    Assert.IsTrue(myAuto.IsRunning == true);
    
    myAuto.Start()
    Assert.IsTrue(myAuto.IsRunning = True)
    
  2. Fare clic sulla lampadina di errore Azioni rapide per la chiamata al metodo myAuto.Start e quindi su Genera metodo 'Automobile.Start' .Click the Quick Actions error light bulb for the myAuto.Start method call and then click Generate method 'Automobile.Start'.

  3. Fare clic sulla lampadina Azioni rapide per la proprietà IsRunning e quindi su Genera proprietà 'Automobile.IsRunning' .Click the Quick Actions light bulb for the IsRunning property and then click Generate property 'Automobile.IsRunning'.

    La classe Automobile ora contiene un metodo denominato Start() e una proprietà denominata IsRunning.The Automobile class now contains a method named Start() and a property named IsRunning.

Eseguire i testRun the tests

  1. Nel menu Test scegliere Esegui > Tutti i test.On the Test menu, choose Run > All Tests.

    Il comando Esegui > Tutti i test esegue tutti i test in tutti i framework di test scritti per la soluzione corrente.The Run > All Tests command runs all the tests in any test frameworks that are written for the current solution. In questo caso ci sono due test e hanno entrambi esito negativo, come previsto.In this case, there are two tests, and they both fail, as expected. Il test DefaultAutomobileIsInitializedCorrectly ha esito negativo perché la condizione Assert.IsTrue restituisce False.The DefaultAutomobileIsInitializedCorrectly test fails because the Assert.IsTrue condition returns False. Il test AutomobileWithModelNameCanStart ha esito negativo perché il metodo Start nella classe Automobile genera un'eccezione.The AutomobileWithModelNameCanStart test fails because the Start method in the Automobile class throws an exception.

    La finestra Risultati test è illustrata nella figura seguente.The Test Results window is shown in the following illustration.

    Risultati dei test non riusciti

  2. Nella finestra Risultati del test fare doppio clic su ogni riga dei risultati del test per passare alla posizione di ogni test.In the Test Results window, double-click on each test result row to go to the location of each test.

Implementare il codice sorgenteImplement the source code

  1. Aggiungere il codice seguente al costruttore predefinito in modo che le proprietà Model, TopSpeed e IsRunning vengano tutte inizializzate con i valori predefiniti corretti, ovvero "Not specified", -1e False (o false per 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 = false;
    }
    
    Sub New()
        Model = "Not specified"
        TopSpeed = -1
        IsRunning = False
    End Sub
    
  2. Quando il metodo Start viene chiamato, deve impostare il flag IsRunning su true solo se la proprietà Model o TopSpeed è impostata su un valore diverso da quello predefinito.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. Rimuovere NotImplementedException dal corpo del metodo e aggiungere il codice seguente.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
    

Eseguire di nuovo i testRun the tests again

  • Scegliere Esegui dal menu Test e fare clic su Tutti i test.On the Test menu, point to Run, and then click All Tests.

    Questa volta il test ha esito positivo.This time the tests pass. La finestra Risultati test è illustrata nella figura seguente.The Test Results window is shown in the following illustration.

    Risultati dei test riusciti

Vedere ancheSee also