Testování částí jazyka C# v .NET Core pomocí příkazu dotnet test a xUnit
Tento kurz ukazuje, jak vytvořit řešení obsahující projekt testování částí a projekt zdrojového kódu. Pokud chcete postupovat podle kurzu s využitím předem vytvořeného řešení, prohlédněte si nebo stáhněte ukázkový kód. Pokyny ke stažení najdete v ukázkách a kurzech.
Vytvoření řešení
V této části se vytvoří řešení, které obsahuje zdrojové a testovací projekty. Dokončené řešení má následující adresářovou strukturu:
/unit-testing-using-dotnet-test
unit-testing-using-dotnet-test.sln
/PrimeService
PrimeService.cs
PrimeService.csproj
/PrimeService.Tests
PrimeService_IsPrimeShould.cs
PrimeServiceTests.csproj
Následující pokyny popisují postup vytvoření testovacího řešení. Pokyny k vytvoření testovacího řešení v jednom kroku najdete v tématu Příkazy pro vytvoření testovacího řešení.
Otevřete okno prostředí.
Spusťte následující příkaz:
dotnet new sln -o unit-testing-using-dotnet-testPříkaz
dotnet new slnvytvoří nové řešení v adresáři unit-testing-using-dotnet-test.Změňte adresář na složku unit-testing-using-dotnet-test.
Spusťte následující příkaz:
dotnet new classlib -o PrimeServicePříkaz
dotnet new classlibvytvoří nový projekt knihovny tříd ve složce PrimeService. Nová knihovna tříd bude obsahovat kód, který se má otestovat.Přejmenujte Class1.cs na PrimeService.cs.
Nahraďte kód v souboru PrimeService.cs následujícím kódem:
using System; namespace Prime.Services { public class PrimeService { public bool IsPrime(int candidate) { throw new NotImplementedException("Not implemented."); } } }Předchozí kód:
- Vyvolá s NotImplementedException zprávou, že není implementována.
- Aktualizuje se později v tomto kurzu.
V adresáři unit-testing-using-dotnet-test spusťte následující příkaz, který do řešení přidá projekt knihovny tříd:
dotnet sln add ./PrimeService/PrimeService.csprojSpuštěním následujícího příkazu vytvořte projekt PrimeService.Tests:
dotnet new xunit -o PrimeService.TestsPředcházející příkaz:
- Vytvoří projekt PrimeService.Tests v adresáři PrimeService.Tests. Projekt testů používá jako testovací knihovnu xUnit.
- Nakonfiguruje spouštěč testů přidáním následujících
<PackageReference />prvků do souboru projektu:Microsoft.NET.Test.Sdkxunitxunit.runner.visualstudiocoverlet.collector
Přidejte testovací projekt do souboru řešení spuštěním následujícího příkazu:
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csprojPřidejte
PrimeServiceknihovnu tříd jako závislost do projektu PrimeService.Tests:dotnet add ./PrimeService.Tests/PrimeService.Tests.csproj reference ./PrimeService/PrimeService.csproj
Příkazy pro vytvoření řešení
Tato část shrnuje všechny příkazy v předchozí části. Pokud jste dokončili kroky v předchozí části, tuto část přeskočte.
Následující příkazy vytvoří testovací řešení na počítači s Windows. V případě systémů macOS a Unix aktualizujte příkaz na verzi operačního systému ren pro ren přejmenování souboru:
dotnet new sln -o unit-testing-using-dotnet-test
cd unit-testing-using-dotnet-test
dotnet new classlib -o PrimeService
ren .\PrimeService\Class1.cs PrimeService.cs
dotnet sln add ./PrimeService/PrimeService.csproj
dotnet new xunit -o PrimeService.Tests
dotnet add ./PrimeService.Tests/PrimeService.Tests.csproj reference ./PrimeService/PrimeService.csproj
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj
Postupujte podle pokynů pro "Nahraďte kód v PrimeService.cs následujícím kódem" v předchozí části.
Vytvoření testu
Oblíbeným přístupem při vývoji řízeném testy je napsat test před implementací cílového kódu. V tomto kurzu se používá přístup TDD. Metoda IsPrime je volatelná, ale není implementovaná. Testovací volání IsPrime selže. V případě TDD se píše test, o které se říká, že selhávají. Cílový kód se aktualizuje, aby test prošl. Tento přístup opakujete, zapisujete neúspěšný test a pak aktualizujete cílový kód tak, aby byl průchod.
Aktualizujte projekt PrimeService.Tests:
- Odstraňte Soubor PrimeService.Tests/UnitTest1.cs.
- Vytvořte soubor PrimeService.Tests/PrimeService_IsPrimeShould.cs.
- Nahraďte kód v souboru PrimeService_IsPrimeShould.cs následujícím kódem:
using Xunit;
using Prime.Services;
namespace Prime.UnitTests.Services
{
public class PrimeService_IsPrimeShould
{
[Fact]
public void IsPrime_InputIs1_ReturnFalse()
{
var primeService = new PrimeService();
bool result = primeService.IsPrime(1);
Assert.False(result, "1 should not be prime");
}
}
}
Atribut [Fact] deklaruje testovací metodu, kterou spustí spouštěče testů. Ve složce PrimeService.Tests spusťte dotnet test . Příkaz dotnet test sestaví oba projekty a spustí testy. Spouštěče testů xUnit obsahuje vstupní bod programu pro spuštění testů. dotnet test spustí spouštěč testů pomocí projektu testování částí.
Test selže, IsPrime protože nebyl implementován. Při použití přístupu TDD napište jenom dostatečný kód, aby tento test projde. Aktualizujte IsPrime soubor následujícím kódem:
public bool IsPrime(int candidate)
{
if (candidate == 1)
{
return false;
}
throw new NotImplementedException("Not fully implemented.");
}
Spusťte dotnet test. Test je promyšl.
Přidání dalších testů
Přidejte testy prvočísla pro 0 a -1. Můžete zkopírovat test vytvořený v předchozím kroku a vytvořit kopie následujícího kódu pro testování 0 a -1. Ale nedělejte to, protože existuje lepší způsob.
var primeService = new PrimeService();
bool result = primeService.IsPrime(1);
Assert.False(result, "1 should not be prime");
Kopírování testovacího kódu, když se změní pouze parametr, vede k duplikaci kódu a testovacímu bloatu. Následující atributy xUnit umožňují zápis sady podobných testů:
[Theory]představuje sadu testů, které spouští stejný kód, ale mají různé vstupní argumenty.[InlineData]Attribute určuje hodnoty pro tyto vstupy.
Místo vytváření nových testů použijte předchozí atributy xUnit k vytvoření jedné teorie. Nahraďte následující kód:
[Fact]
public void IsPrime_InputIs1_ReturnFalse()
{
var primeService = new PrimeService();
bool result = primeService.IsPrime(1);
Assert.False(result, "1 should not be prime");
}
následujícím kódem:
[Theory]
[InlineData(-1)]
[InlineData(0)]
[InlineData(1)]
public void IsPrime_ValuesLessThan2_ReturnFalse(int value)
{
var result = _primeService.IsPrime(value);
Assert.False(result, $"{value} should not be prime");
}
V předchozím kódu a [Theory] povolte testování [InlineData] několika hodnot menších než dvě. Dvě jsou nejmenší prvočíslo.
Za deklaraci třídy a před atribut přidejte následující [Theory] kód:
private readonly PrimeService _primeService;
public PrimeService_IsPrimeShould()
{
_primeService = new PrimeService();
}
Spusťte dotnet test a dva testy selžou. Pokud chcete, aby všechny testy byly splněny, aktualizujte IsPrime metodu následujícím kódem:
public bool IsPrime(int candidate)
{
if (candidate < 2)
{
return false;
}
throw new NotImplementedException("Not fully implemented.");
}
Podle přístupu TDD přidejte další neúspěšné testy a pak aktualizujte cílový kód. Podívejte se na hotovou verzi testů a úplnou implementaci knihovny.
Dokončená IsPrime metoda není efektivním algoritmem pro testování nealgoritmů.