Dela via


Genomgång: Test-driven utveckling med funktionen Generera från användning

Det här avsnittet visar hur du använder funktionen Generera från användning , som stöder test-first-utveckling.

Test-first development är en metod för programvarudesign där du först skriver enhetstester baserat på produktspecifikationer och sedan skriver den källkod som krävs för att testerna ska lyckas. Visual Studio stöder test-first-utveckling genom att generera nya typer och medlemmar i källkoden när du först refererar till dem i dina testfall innan de definieras.

Visual Studio genererar de nya typerna och medlemmarna med minimalt avbrott i arbetsflödet. Du kan skapa stubs för typer, metoder, egenskaper, fält eller konstruktorer utan att lämna din aktuella plats i kod. När du öppnar en dialogruta för att ange alternativ för typgenerering återgår fokus omedelbart till den aktuella öppna filen när dialogrutan stängs.

Funktionen Generera från användning kan användas med testramverk som integreras med Visual Studio. I det här avsnittet visas Microsoft Unit Testing Framework.

Anmärkning

Anvisningarna i den här artikeln illustrerar den senaste versionen av den interaktiva utvecklingsupplevelsen (IDE) som är tillgänglig i Visual Studio. Datorn kan visa olika namn eller platser för vissa av användargränssnittselementen. Du kanske använder en annan version av Visual Studio eller andra miljöinställningar. Mer information finns i Anpassa IDE-.

Skapa ett Windows-klassbiblioteksprojekt och ett testprojekt

  1. Skapa ett nytt Windows-klassbiblioteksprojekt i C# eller Visual Basic. Namnge den GFUDemo_VB eller GFUDemo_CS, beroende på vilket språk du använder.

  2. Högerklicka på lösningsikonen längst upp i Solution Explorer och välj Lägg till>nytt projekt.

  3. Skapa ett nytt projekt för enhetstestprojekt (.NET Framework).

Lägga till en referens till klassbiblioteksprojektet

  1. I Solution Explorer högerklickar du på posten Referenser under ditt enhetstestprojekt och väljer Lägg till referens.

  2. I dialogrutan Referenshanteraren väljer du Projekt och sedan klassbiblioteksprojektet.

  3. Välj OK för att stänga dialogrutan Referenshanteraren .

  4. Spara din lösning. Nu är du redo att börja skriva tester.

Generera en ny klass från ett enhetstest

  1. Testprojektet innehåller en fil med namnet UnitTest1. Dubbelklicka på den här filen i Solution Explorer för att öppna den i kodredigeraren. En testklass och testmetod har genererats.

  2. Leta upp deklarationen för klassen UnitTest1 och byt namn på den till AutomobileTest.

    Anmärkning

    IntelliSense tillhandahåller nu två alternativ för slutförande av IntelliSense-instruktion: slutförandeläge och förslagsläge. Använd förslagsläge för situationer där klasser och medlemmar används innan de definieras. När ett IntelliSense-fönster är öppet kan du trycka på Ctrl+Alt+Space för att växla mellan slutförandeläge och förslagsläge. Mer information finns i Använda IntelliSense . Förslagsläget hjälper dig när du skriver Automobile i nästa steg.

  3. TestMethod1() Leta upp metoden och byt namn på den till DefaultAutomobileIsInitializedCorrectly(). I den här metoden skapar du en ny instans av en klass med namnet Automobile, enligt följande skärmbilder. En vågig understrykning visas, vilket indikerar ett kompileringsfel. En Quick Actions-ikon med en felindikator visas i vänstermarginalen eller direkt under understrykningen om du hovrar över den.

    Snabbåtgärder i Visual Basic

    Snabbåtgärder i C#

  4. Välj eller klicka på glödlampan Snabbåtgärder . Ett felmeddelande visas som anger att typen Automobile inte har definierats. Du får också några lösningar.

  5. Klicka på Generera ny typ för att öppna dialogrutan Generera typ . Den här dialogrutan innehåller alternativ som inkluderar att generera typen i ett annat projekt.

  6. I listan Projekt klickar du på GFUDemo_VB eller GFUDemo_CS för att instruera Visual Studio att lägga till filen i klassbiblioteksprojektet i stället för testprojektet. Om den inte redan är markerad väljer du Skapa ny fil och namnger den Automobile.cs eller Automobile.vb.

    Dialogrutan Generera ny typ

  7. Klicka på OK för att stänga dialogrutan och skapa den nya filen.

  8. I Solution Explorer tittar du under projektnoden GFUDemo_VB eller GFUDemo_CS för att kontrollera att den nya Automobile.vb - eller Automobile.cs filen finns där. I kodredigeraren är fokus fortfarande i AutomobileTest.DefaultAutomobileIsInitializedCorrectly, vilket gör att du kan fortsätta att skriva testet med ett minimum av avbrott.

Generera en egenskapsstub

Anta att produktspecifikationen anger att Automobile klassen har två offentliga egenskaper med namnet Model och TopSpeed. Dessa egenskaper måste initieras med standardvärdena "Not specified" och -1 av standardkonstruktorn. Följande enhetstest kontrollerar att standardkonstruktorn anger egenskaperna till rätt standardvärden.

  1. Lägg till följande kodrad i DefaultAutomobileIsInitializedCorrectly testmetoden.

    Assert.IsTrue((myAuto.Model == "Not specified") && (myAuto.TopSpeed == -1));
    
  2. Eftersom koden refererar till två odefinierade egenskaper på Automobilevisas en vågig understrykning under Model och TopSpeed. Hovra över Model och välj Snabbåtgärder-indikatorn, och välj sedan Generera egenskapen 'Automobile.Model'.

  3. Generera en egenskapsstub för TopSpeed egenskapen på samma sätt.

    Automobile I klassen härleds typerna av de nya egenskaperna korrekt från kontexten.

Generera en stub för en ny konstruktor

Nu ska vi skapa en testmetod som genererar en konstruktorstub för att initiera egenskaperna Model och TopSpeed. Senare lägger du till mer kod för att slutföra testet.

  1. Lägg till följande ytterligare testmetod i klassen AutomobileTest .

    [TestMethod]
    public void AutomobileWithModelNameCanStart()
    {
        string model = "Contoso";
        int topSpeed = 199;
        Automobile myAuto = new Automobile(model, topSpeed);
    }
    
  2. Klicka på felglödlampan "Snabbåtgärder" under den röda sicksacklinjen och klicka sedan på Generera konstruktor i 'Automobile'.

    Observera att den Automobile nya konstruktorn i klassfilen har undersökt namnen på de lokala variabler som används i konstruktoranropet, hittat egenskaper som har samma namn i Automobile klassen och angett kod i konstruktorns brödtext för att lagra argumentvärdena i Model egenskaperna och TopSpeed .

  3. När du har genererat den nya konstruktorn visas en vågig understrykning under anropet till standardkonstruktorn i DefaultAutomobileIsInitializedCorrectly. Felmeddelandet anger att Automobile klassen inte har någon konstruktor som tar noll argument. Om du vill generera en explicit standardkonstruktor som inte har parametrar klickar du på glödlampan snabbåtgärder och klickar sedan på Generera konstruktor i "Automobile".

Generera en stub för en metod

Anta att specifikationen anger att en ny Automobile kan placeras i ett IsRunning tillstånd om dess Model och TopSpeed egenskaper är inställda på något annat än standardvärdena.

  1. Lägg till följande rader i AutomobileWithModelNameCanStart metoden.

    myAuto.Start();
    Assert.IsTrue(myAuto.IsRunning == true);
    
  2. Klicka på fel glödlampan för snabbåtgärder för metodanropet myAuto.Start och klicka sedan på Generera metoden 'Automobile.Start'.

  3. Klicka på glödlampan Snabbåtgärder för IsRunning egenskapen och klicka sedan på Generera egenskapen "Automobile.IsRunning".

    Klassen Automobile innehåller nu en metod med namnet Start() och en egenskap med namnet IsRunning.

Kör testerna

  1. testmenyn väljer du Kör>alla tester.

    Kommandot Kör>alla tester kör alla tester i alla testramverk som är skrivna för den aktuella lösningen. I det här fallet finns det två tester och båda misslyckas som förväntat. Testet DefaultAutomobileIsInitializedCorrectly misslyckas eftersom villkoret Assert.IsTrue returnerar False. Testet AutomobileWithModelNameCanStart misslyckas eftersom Start metoden i Automobile klassen genererar ett undantag.

    Fönstret Testresultat visas i följande bild.

    Testresultat som misslyckades

  2. I fönstret Testresultat dubbelklickar du på varje testresultatrad för att gå till platsen för varje test.

Implementera källkoden

  1. Lägg till följande kod i standardkonstruktorn så att Model, TopSpeed och IsRunning egenskaperna alla initieras till deras rätta standardvärden av "Not specified", -1 och False (eller false för C#).

    public Automobile()
    {
        this.Model = "Not specified";
        this.TopSpeed = -1;
        this.IsRunning = true;
    }
    
  2. När Start-metoden anropas bör den ställa IsRunning-flaggan till true endast om Model- eller TopSpeed-egenskapen är inställd på något annat än deras standardvärde. NotImplementedException Ta bort från metodtexten och lägg till följande kod.

    public void Start()
    {
        if (this.Model != "Not specified" || this.TopSpeed != -1)
            this.IsRunning = true;
        else
            this.IsRunning = false;
    }
    

Kör testerna igen

  • testmenyn pekar du på Kör och klickar sedan på Alla tester.

    Den här gången godkänns testerna. Fönstret Testresultat visas i följande bild.

    Testresultat som har godkänts