Organisera och testa projekt med .NET CLI

Den här självstudien följer Självstudie: Skapa ett konsolprogram med .NET med Visual Studio Code, vilket tar dig bortom skapandet av en enkel konsolapp för att utveckla avancerade och välorganiserade program. När du har visat hur du använder mappar för att organisera koden visar självstudien hur du utökar ett konsolprogram med xUnit-testramverket .

Anteckning

Den här självstudien rekommenderar att du placerar programprojektet och testprojektet i separata mappar. Vissa utvecklare föredrar att behålla dessa projekt i samma mapp. Mer information finns i GitHub-problem med dotnet/docs #26395.

Använda mappar för att organisera kod

Om du vill introducera nya typer i en konsolapp kan du göra det genom att lägga till filer som innehåller typerna i appen. Om du till exempel lägger till filer som innehåller AccountInformation och MonthlyReportRecords typer i projektet är projektfilstrukturen platt och enkel att navigera i:

/MyProject
|__AccountInformation.cs
|__MonthlyReportRecords.cs
|__MyProject.csproj
|__Program.cs

Den här platta strukturen fungerar dock bara bra när storleken på projektet är relativt liten. Kan du föreställa dig vad som händer om du lägger till 20 typer i projektet? Projektet skulle definitivt inte vara lätt att navigera och underhålla med så många filer som skräpar ner projektets rotkatalog.

Om du vill organisera projektet skapar du en ny mapp och ger den namnet Modeller för att lagra typfilerna. Placera typfilerna i mappen Modeller :

/MyProject
|__/Models
   |__AccountInformation.cs
   |__MonthlyReportRecords.cs
|__MyProject.csproj
|__Program.cs

Projekt som logiskt grupperar filer i mappar är enkla att navigera och underhålla. I nästa avsnitt skapar du ett mer komplext exempel med mappar och enhetstestning.

Organisera och testa med hjälp av exemplet newtypes pets

Krav

Skapa exemplet

För följande steg kan du antingen följa med i Exemplet på NewTypes-husdjur eller skapa egna filer och mappar. Typerna är logiskt ordnade i en mappstruktur som tillåter tillägg av fler typer senare, och tester placeras också logiskt i mappar som tillåter tillägg av fler tester senare.

Exemplet innehåller två typer, Dog och Cat, och har dem implementera ett gemensamt gränssnitt, IPet. NewTypes För projektet är målet att organisera husdjursrelaterade typer i en husdjursmapp. Om en annan uppsättning typer läggs till senare, till exempel WildAnimals , placeras de i mappen NewTypes tillsammans med mappen Husdjur . Mappen WildAnimals kan innehålla typer för djur som inte är husdjur, till exempel Squirrel och Rabbit typer. På så sätt som typer läggs till förblir projektet välorganiserat.

Skapa följande mappstruktur med angivet filinnehåll:

/NewTypes
|__/src
   |__/NewTypes
      |__/Pets
         |__Dog.cs
         |__Cat.cs
         |__IPet.cs
      |__Program.cs
      |__NewTypes.csproj

IPet.cs:

using System;

namespace Pets
{
    public interface IPet
    {
        string TalkToOwner();
    }
}

Dog.cs:

using System;

namespace Pets
{
    public class Dog : IPet
    {
        public string TalkToOwner() => "Woof!";
    }
}

Cat.cs:

using System;

namespace Pets
{
    public class Cat : IPet
    {
        public string TalkToOwner() => "Meow!";
    }
}

Program.cs:

using System;
using Pets;
using System.Collections.Generic;

namespace ConsoleApplication
{
    public class Program
    {
        public static void Main(string[] args)
        {
            List<IPet> pets = new List<IPet>
            {
                new Dog(),
                new Cat()
            };

            foreach (var pet in pets)
            {
                Console.WriteLine(pet.TalkToOwner());
            }
        }
    }
}

NewTypes.csproj:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
  </PropertyGroup>

</Project>

Kör följande kommando:

dotnet run

Hämta följande utdata:

Woof!
Meow!

Valfri övning: Du kan lägga till en ny husdjurstyp, till exempel en Bird, genom att utöka det här projektet. Gör fågelns TalkToOwner metod ge en Tweet! till ägaren. Kör appen igen. Utdata kommer att innehålla Tweet!

Testa exemplet

Projektet NewTypes är på plats och du har organiserat det genom att ha husdjursrelaterade typer i en mapp. Skapa sedan testprojektet och börja skriva tester med xUnit-testramverket . Med enhetstestning kan du automatiskt kontrollera beteendet för dina husdjurstyper för att bekräfta att de fungerar korrekt.

Gå tillbaka till mappen src och skapa en testmapp med mappen NewTypesTests i den. Kör i en kommandotolk från mappen dotnet new xunitNewTypesTests . Det här kommandot skapar två filer: NewTypesTests.csproj och UnitTest1.cs.

Testprojektet kan för närvarande inte testa typerna i NewTypes och kräver en projektreferens till NewTypes projektet. Om du vill lägga till en projektreferens använder du dotnet add reference kommandot:

dotnet add reference ../../src/NewTypes/NewTypes.csproj

Du kan också lägga till projektreferensen manuellt genom att lägga till en <ItemGroup> nod i filen NewTypesTests.csproj :

<ItemGroup>
  <ProjectReference Include="../../src/NewTypes/NewTypes.csproj" />
</ItemGroup>

NewTypesTests.csproj:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.9.0" />
    <PackageReference Include="xunit" Version="2.8.0" />
    <PackageReference Include="xunit.runner.visualstudio" Version="2.8.0" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="../../src/NewTypes/NewTypes.csproj"/>
  </ItemGroup>

</Project>

Filen NewTypesTests.csproj innehåller följande paketreferenser:

  • Microsoft.NET.Test.Sdk, .NET-testinfrastrukturen
  • xunit, xUnit-testramverket
  • xunit.runner.visualstudio, testkörare
  • NewTypes, koden som ska testas

Ändra namnet på UnitTest1.cs till PetTests.cs och ersätt koden i filen med följande kod:

using System;
using Xunit;
using Pets;

public class PetTests
{
    [Fact]
    public void DogTalkToOwnerReturnsWoof()
    {
        string expected = "Woof!";
        string actual = new Dog().TalkToOwner();

        Assert.NotEqual(expected, actual);
    }

    [Fact]
    public void CatTalkToOwnerReturnsMeow()
    {
        string expected = "Meow!";
        string actual = new Cat().TalkToOwner();

        Assert.NotEqual(expected, actual);
    }
}

Valfri övning: Om du lade till en Bird typ tidigare som ger ägaren Tweet! en, lägger du till en testmetod i filen PetTests.cs för BirdTalkToOwnerReturnsTweetatt kontrollera att TalkToOwner metoden fungerar korrekt för Bird typen.

Anteckning

Även om du förväntar dig att expected värdena och actual är lika, anger en första försäkran Assert.NotEqual med kontrollen att dessa värden inte är lika med. Skapa alltid ett test som misslyckas för att kontrollera testets logik. När du har bekräftat att testet misslyckas justerar du försäkran så att testet kan klaras.

Följande visar hela projektstrukturen:

/NewTypes
|__/src
   |__/NewTypes
      |__/Pets
         |__Dog.cs
         |__Cat.cs
         |__IPet.cs
      |__Program.cs
      |__NewTypes.csproj
|__/test
   |__NewTypesTests
      |__PetTests.cs
      |__NewTypesTests.csproj

Starta i katalogen test/NewTypesTests . Kör testerna med dotnet test kommandot . Det här kommandot startar testkörare som anges i projektfilen.

Som förväntat misslyckas testningen och konsolen visar följande utdata:

Test run for C:\Source\dotnet\docs\samples\snippets\core\tutorials\testing-with-cli\csharp\test\NewTypesTests\bin\Debug\net5.0\NewTypesTests.dll (.NETCoreApp,Version=v5.0)
Microsoft (R) Test Execution Command Line Tool Version 16.8.1
Copyright (c) Microsoft Corporation.  All rights reserved.

Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.50]     PetTests.DogTalkToOwnerReturnsWoof [FAIL]
  Failed PetTests.DogTalkToOwnerReturnsWoof [6 ms]
  Error Message:
   Assert.NotEqual() Failure
Expected: Not "Woof!"
Actual:   "Woof!"
  Stack Trace:
     at PetTests.DogTalkToOwnerReturnsWoof() in C:\Source\dotnet\docs\samples\snippets\core\tutorials\testing-with-cli\csharp\test\NewTypesTests\PetTests.cs:line 13

Failed!  - Failed:     1, Passed:     1, Skipped:     0, Total:     2, Duration: 8 ms - NewTypesTests.dll (net5.0)

Ändra försäkran för dina tester från Assert.NotEqual till Assert.Equal:

using System;
using Xunit;
using Pets;

public class PetTests
{
    [Fact]
    public void DogTalkToOwnerReturnsWoof()
    {
        string expected = "Woof!";
        string actual = new Dog().TalkToOwner();

        Assert.Equal(expected, actual);
    }

    [Fact]
    public void CatTalkToOwnerReturnsMeow()
    {
        string expected = "Meow!";
        string actual = new Cat().TalkToOwner();

        Assert.Equal(expected, actual);
    }
}

Kör testerna igen med dotnet test kommandot och hämta följande utdata:

Test run for C:\Source\dotnet\docs\samples\snippets\core\tutorials\testing-with-cli\csharp\test\NewTypesTests\bin\Debug\net5.0\NewTypesTests.dll (.NETCoreApp,Version=v5.0)
Microsoft (R) Test Execution Command Line Tool Version 16.8.1
Copyright (c) Microsoft Corporation.  All rights reserved.

Starting test execution, please wait...
A total of 1 test files matched the specified pattern.

Passed!  - Failed:     0, Passed:     2, Skipped:     0, Total:     2, Duration: 2 ms - NewTypesTests.dll (net5.0)

Testningen godkänns. Husdjurstypernas metoder returnerar rätt värden när de pratar med ägaren.

Du har lärt dig tekniker för att organisera och testa projekt med xUnit. Gå vidare med dessa tekniker som tillämpar dem i dina egna projekt. Glad kodning!