Uspořádání a testování projektů pomocí rozhraní příkazového řádku .NET
Tento kurz sleduje kurz: Vytvoření konzolové aplikace s .NET pomocí editoru Visual Studio Code, které vás přemístí nad rámec vytvoření jednoduché konzolové aplikace k vývoji pokročilých a dobře uspořádaných aplikací. Poté, co vám ukážeme, jak pomocí složek uspořádat kód, se v kurzu dozvíte, jak rozšířit konzolovou aplikaci o testovací architekturu xUnit .
Poznámka
Tento kurz doporučuje umístit projekt aplikace a testovací projekt do samostatných složek. Někteří vývojáři dávají přednost tomu, aby tyto projekty zůstaly ve stejné složce. Další informace najdete v tématu o problému githubu dotnet/docs #26395.
Uspořádání kódu pomocí složek
Pokud chcete do konzolové aplikace zavést nové typy, můžete to udělat přidáním souborů obsahujících typy do aplikace. Pokud například do projektu přidáte soubory obsahující AccountInformation
a MonthlyReportRecords
typy, bude struktura souborů projektu plochá a snadno se naviguje:
/MyProject
|__AccountInformation.cs
|__MonthlyReportRecords.cs
|__MyProject.csproj
|__Program.cs
Tato plochá struktura však funguje dobře pouze v případě, že je velikost projektu relativně malá. Dokážete si představit, co se stane, když do projektu přidáte 20 typů? Projekt by rozhodně nebylo snadné navigovat a udržovat s tolika soubory, které zahazují kořenový adresář projektu.
Pokud chcete projekt uspořádat, vytvořte novou složku a pojmenujte ji Modely , do které se budou ukládat soubory typu. Umístěte soubory typů do složky Modely :
/MyProject
|__/Models
|__AccountInformation.cs
|__MonthlyReportRecords.cs
|__MyProject.csproj
|__Program.cs
Projekty, které logicky seskupují soubory do složek, se snadno navigují a udržují. V další části vytvoříte složitější ukázku se složkami a testováním jednotek.
Uspořádání a testování pomocí ukázky NewTypes Pets
Požadavky
- .NET 5.0 SDK nebo novější verze.
Sestavení ukázky
Následující kroky můžete sledovat pomocí ukázky NewTypes Pets nebo si vytvořit vlastní soubory a složky. Typy jsou logicky uspořádány do struktury složek, která umožňuje přidání dalších typů později, a testy jsou také logicky umístěny do složek, které umožňují přidat další testy později.
Ukázka obsahuje dva typy Dog
a Cat
a a implementuje společné rozhraní IPet
.
NewTypes
Pro projekt je vaším cílem uspořádat typy související s domácími mazlíčky do složky Domácí mazlíčci. Pokud se později přidá další sada typů, například WildAnimals , umístí se do složky NewTypes vedle složky Pets . Složka WildAnimals může obsahovat typy pro zvířata, která nejsou domácí zvířata, například Squirrel
typy a Rabbit
. Tímto způsobem, jak se přidávají typy, zůstane projekt dobře uspořádaný.
Vytvořte následující strukturu složek se zadaným obsahem souboru:
/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>net8.0</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
Spusťte následující příkaz:
dotnet run
Získejte následující výstup:
Woof!
Meow!
Volitelné cvičení: Rozšířením tohoto projektu můžete přidat nový typ domácího Bird
mazlíčka, například . Udělejte metodu ptáka TalkToOwner
dát Tweet!
majiteli. Spusťte aplikaci znovu. Výstup bude obsahovat Tweet!
Testování ukázky
Projekt NewTypes
je na svém místě a uspořádali jste ho tak, že ve složce uchováváte typy související s domácími mazlíčky. Dále vytvořte testovací projekt a začněte psát testy pomocí testovací architektury xUnit . Testování jednotek umožňuje automaticky zkontrolovat chování typů domácích mazlíčků a ověřit, že fungují správně.
Přejděte zpět do složky src a vytvořte testovací složku se složkou NewTypesTests . Na příkazovém řádku ze složky NewTypesTests spusťte dotnet new xunit
příkaz . Tento příkaz vytvoří dva soubory: NewTypesTests.csproj a UnitTest1.cs.
Testovací projekt momentálně nemůže testovat typy v NewTypes
a vyžaduje odkaz na NewTypes
projekt. Pokud chcete přidat odkaz na projekt, použijte příkaz dotnet add reference
:
dotnet add reference ../../src/NewTypes/NewTypes.csproj
Nebo máte také možnost přidat odkaz na projekt ručně přidáním <ItemGroup>
uzlu do souboru NewTypesTests.csproj :
<ItemGroup>
<ProjectReference Include="../../src/NewTypes/NewTypes.csproj" />
</ItemGroup>
NewTypesTests.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.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>
Soubor NewTypesTests.csproj obsahuje následující odkazy na balíčky:
-
Microsoft.NET.Test.Sdk
, testovací infrastruktura .NET -
xunit
, testovací architektura xUnit -
xunit.runner.visualstudio
, test runner -
NewTypes
, kód, který se má otestovat
Změňte název UnitTest1.cs na PetTests.cs a nahraďte kód v souboru následujícím kódem:
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);
}
}
Volitelné cvičení: Pokud jste dříve přidali Bird
typ, který dává Tweet!
vlastníku, přidejte testovací metodu do souboru PetTests.cs , abyste zkontrolovali, BirdTalkToOwnerReturnsTweet
že TalkToOwner
metoda funguje správně pro daný Bird
typ.
Poznámka
I když očekáváte, že expected
hodnoty a actual
jsou stejné, počáteční kontrolní výraz s kontrolou Assert.NotEqual
určuje, že tyto hodnoty nejsou stejné. Vždy nejprve vytvořte test, který selže, aby se zkontrolovala logika testu. Po potvrzení, že test selže, upravte kontrolní výraz tak, aby test prošel.
Následující příklad ukazuje kompletní strukturu projektu:
/NewTypes
|__/src
|__/NewTypes
|__/Pets
|__Dog.cs
|__Cat.cs
|__IPet.cs
|__Program.cs
|__NewTypes.csproj
|__/test
|__NewTypesTests
|__PetTests.cs
|__NewTypesTests.csproj
Začněte v adresáři test/NewTypesTests . Spusťte testy pomocí dotnet test
příkazu . Tento příkaz spustí test runner zadaný v souboru projektu.
Podle očekávání se testování nezdaří a konzola zobrazí následující výstup:
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)
Změňte kontrolní výrazy testů z Assert.NotEqual
na 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);
}
}
Znovu spusťte testy pomocí dotnet test
příkazu a získejte následující výstup:
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)
Testování proběhne úspěšně. Metody domácího mazlíčka vracejí správné hodnoty při komunikaci s vlastníkem.
Naučili jste se techniky pro uspořádání a testování projektů pomocí xUnit. Pokračujte s těmito technikami a použijte je ve svých vlastních projektech. Šťastné kódování!