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
- .NET 5.0 SDK eller en senare version.
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 xunit
NewTypesTests . 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.10.0" />
<PackageReference Include="xunit" Version="2.8.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="../../src/NewTypes/NewTypes.csproj"/>
</ItemGroup>
</Project>
Filen NewTypesTests.csproj innehåller följande paketreferenser:
Microsoft.NET.Test.Sdk
, .NET-testinfrastrukturenxunit
, xUnit-testramverketxunit.runner.visualstudio
, testkörareNewTypes
, 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 BirdTalkToOwnerReturnsTweet
att 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!