Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento kurz navazuje na kurz Vytvoření konzolové aplikace s pomocí .NET a editoru Visual Studio Code a vede vás za hranice vytvoření jednoduché konzolové aplikace k vývoji pokročilých a dobře uspořádaných aplikací. Po zobrazení způsobu použití složek k uspořádání kódu se v kurzu dozvíte, jak rozšířit konzolovou aplikaci pomocí testovací architektury 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, struktura souborů projektu je plochá a snadno se orientuje:
/MyProject
|__AccountInformation.cs
|__MonthlyReportRecords.cs
|__MyProject.csproj
|__Program.cs
Tato plochá struktura ale funguje dobře jenom 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ě nebyl snadný na orientaci a údržbu kvůli tomu množství souborů, které zaplní kořenový adresář projektu.
Pokud chcete projekt uspořádat, vytvořte novou složku a pojmenujte ji Modely pro uložení souborů typu. Soubory typu umístěte do složky Models :
/MyProject
|__/Models
|__AccountInformation.cs
|__MonthlyReportRecords.cs
|__MyProject.csproj
|__Program.cs
Projekty, které logicky seskupují soubory do složek, se dají snadno procházet a udržovat. V další části vytvoříte složitější ukázku se složkami a jednotkovým testováním.
Uspořádání a testování pomocí ukázkového příkladu NewTypes Pets
Požadavky
- .NET 5.0 SDK nebo novější
Sestavení ukázky
Následující kroky můžete použít buď pomocí ukázky NewTypes Pets , nebo vytvořit vlastní soubory a složky. Typy jsou logicky uspořádané do struktury složek, které později umožňují přidat více typů a testy jsou také logicky umístěny do složek, které umožňují pozdější přidání dalších testů.
Ukázka obsahuje dva typy Dog a Cat, které implementují společné rozhraní IPet.
NewTypes Vaším cílem projektu je uspořádat typy související s domácími mazlíčky do složky Domácí zvířata. Pokud je později přidána další sada typů WildAnimals , umístí se například do složky NewTypes spolu se složkou Domácí zvířata . Složka WildAnimals může obsahovat typy zvířat, která nejsou domácími mazlíčky, jako například typy Squirrel a Rabbit. Tímto způsobem, jak se přidají typy, zůstane projekt dobře uspořádaný.
Vytvořte následující strukturu složek s označený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 mazlíčka, například Bird. Ať metoda TalkToOwner ptáka dává Tweet! majiteli. Spusťte aplikaci znovu. Výstup bude obsahovat Tweet!
Testování ukázky
Projekt NewTypes je zavedený a vy jste ho uspořádali tím, že jste typy související s domácími mazlíčky umístili do složky. Dále vytvořte svůj testovací projekt a začněte psát testy pomocí testovací architektury xUnit . Testování jednotek umožňuje automaticky zkontrolovat chování typů zvířat 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 v ní. Na příkazovém řádku ze složky NewTypesTests spusťte dotnet new xunitpříkaz . Tento příkaz vytvoří dva soubory: NewTypesTests.csproj a UnitTest1.cs.
Testovací projekt momentálně nemůže testovat typy NewTypes a vyžaduje odkaz na NewTypes projekt. Pokud chcete přidat odkaz na projekt, použijte dotnet reference add příkaz:
dotnet reference add ../../src/NewTypes/NewTypes.csproj
Nebo máte možnost ručního přidání odkazu na projekt 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 k otestování
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ý přináší Tweet! vlastníkovi, přidejte testovací metodu do souboru PetTests.cs, abyste ověřili, zda metoda BirdTalkToOwnerReturnsTweet funguje správně pro daný TalkToOwner typ.
Poznámka:
Ačkoli očekáváte, že hodnoty expected a actual jsou stejné, počáteční tvrzení s kontrolou Assert.NotEqual uvádí, ž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 úplnou 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í spouštěč testů 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 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íhá úspěšně. Metody těchto typů domácích zvířat vrací správné hodnoty, když mluví s majitelem.
Naučili jste se techniky pro uspořádání a testování projektů pomocí xUnit. Pokračujte v aplikaci těchto technik ve vlastních projektech. Šťastné programování!