Testování částí C# pomocí MSTest a .NET

Tento kurz vás provede interaktivním prostředím a podrobným sestavením ukázkového řešení, kde se seznámíte s koncepty testování jednotek. Pokud chcete postupovat podle kurzu pomocí předem připraveného řešení, před zahájením si prohlédněte nebo stáhněte ukázkový kód . Pokyny ke stažení najdete v tématu Ukázky a kurzy.

Tento článek se týká testování projektu .NET Core. Pokud testujete projekt ASP.NET Core, podívejte se na testy integrace v ASP.NET Core.

Požadavky

Vytvoření zdrojového projektu

Otevřete okno prostředí. Vytvořte adresář s názvem unit-testing-using-mstest pro uložení řešení. V tomto novém adresáři spusťte spuštěním dotnet new sln nového souboru řešení pro knihovnu tříd a testovací projekt. Vytvořte adresář PrimeService . Následující osnova ukazuje zatím adresářovou strukturu a strukturu souborů:

/unit-testing-using-mstest
    unit-testing-using-mstest.sln
    /PrimeService

Nastavte PrimeService jako aktuální adresář a spusťte dotnet new classlib ho, abyste vytvořili zdrojový projekt. Přejmenujte Class1.cs na PrimeService.cs. Nahraďte kód v souboru následujícím kódem, který vytvoří neúspěšnou implementaci PrimeService třídy:

using System;

namespace Prime.Services
{
    public class PrimeService
    {
        public bool IsPrime(int candidate)
        {
            throw new NotImplementedException("Please create a test first.");
        }
    }
}

Změňte adresář zpět na adresář unit-testing-using-mstest . Spuštěním dotnet sln add příkazu přidejte projekt knihovny tříd do řešení:

dotnet sln add PrimeService/PrimeService.csproj

Vytvoření testovacího projektu

Vytvořte adresář PrimeService.Tests. Následující osnova ukazuje adresářovou strukturu:

/unit-testing-using-mstest
    unit-testing-using-mstest.sln
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests

Vytvořte adresář PrimeService.Tests jako aktuální adresář a vytvořte nový projekt pomocí dotnet new mstest. Nový příkaz dotnet vytvoří testovací projekt, který jako testovací knihovnu používá MSTest. Šablona nakonfiguruje spouštěč testů v souboru PrimeServiceTests.csproj :

<ItemGroup>
  <PackageReference Include="MSTest" Version="3.2.0" />
  <PackageReference Include="Microsoft.Testing.Extensions.CodeCoverage" Version="17.10.1" />
</ItemGroup>

Testovací projekt vyžaduje k vytvoření a spuštění testů jednotek další balíčky. dotnet new v předchozím kroku jsme přidali potřebné balíčky a nástroje MSTest pro generování sestav pokrytí kódu.

Přidejte do projektu knihovnu PrimeService tříd jako jinou závislost. dotnet add reference Použijte příkaz:

dotnet add reference ../PrimeService/PrimeService.csproj

Celý soubor můžete zobrazit v úložišti ukázek na GitHubu.

Následující osnova ukazuje konečné rozložení řešení:

/unit-testing-using-mstest
    unit-testing-using-mstest.sln
    /PrimeService
        Source Files
        PrimeService.csproj
    /PrimeService.Tests
        Test Source Files
        PrimeServiceTests.csproj

Přejděte do adresáře unit-testing-using-mstest a spusťte dotnet sln add:

dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj

Vytvoření prvního testu

Napište neúspěšný test, proveďte ho úspěšně a opakujte proces. Odeberte UnitTest1.cs z adresáře PrimeService.Tests a vytvořte nový soubor C# s názvem PrimeService_IsPrimeShould.cs s následujícím obsahem:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Prime.Services;

namespace Prime.UnitTests.Services
{
    [TestClass]
    public class PrimeService_IsPrimeShould
    {
        private readonly PrimeService _primeService;

        public PrimeService_IsPrimeShould()
        {
            _primeService = new PrimeService();
        }

        [TestMethod]
        public void IsPrime_InputIs1_ReturnFalse()
        {
            bool result = _primeService.IsPrime(1);

            Assert.IsFalse(result, "1 should not be prime");
        }
    }
}

Atribut TestClass označuje třídu, která obsahuje testy jednotek. Atribut TestMethod označuje metodu je testovací metoda.

Uložte tento soubor a spusťte dotnet test testy a knihovnu tříd a pak testy spusťte. Spouštěč testů MSTest obsahuje vstupní bod programu pro spuštění testů. dotnet test spustí spouštěč testů pomocí projektu testování jednotek, který jste vytvořili.

Váš test selže. Ještě jste nevytvořili implementaci. Proveďte tento test tak, že napíšete nejjednodušší kód ve PrimeService třídě, která funguje:

public bool IsPrime(int candidate)
{
    if (candidate == 1)
    {
        return false;
    }
    throw new NotImplementedException("Please create a test first.");
}

V adresáři unit-testing-using-mstest spusťte dotnet test znovu. Příkaz dotnet test spustí sestavení projektu PrimeService a pak projekt PrimeService.Tests . Po sestavení obou projektů spustí tento jediný test. Projde.

Přidání dalších funkcí

Teď, když jste udělali jeden test, je čas napsat více. Existuje několik dalších jednoduchých případů pro prime čísla: 0, -1. Můžete přidat nové testy s atributem TestMethod, ale to se rychle změní na zdlouhavé. Existují další atributy MSTest, které umožňují napsat sadu podobných testů. Testovací metoda může spustit stejný kód, ale má různé vstupní argumenty. Pomocí atributu DataRow můžete zadat hodnoty pro tyto vstupy.

Místo vytváření nových testů použijte tyto dva atributy k vytvoření jednoho testu řízeného daty. Test řízený daty je metoda, která testuje několik hodnot menší než dvě, což je nejnižší základní číslo. Do PrimeService_IsPrimeShould.cs přidejte novou testovací metodu:

[TestMethod]
[DataRow(-1)]
[DataRow(0)]
[DataRow(1)]
public void IsPrime_ValuesLessThan2_ReturnFalse(int value)
{
    var result = _primeService.IsPrime(value);

    Assert.IsFalse(result, $"{value} should not be prime");
}

Spusťte dotnet testa dva z těchto testů selžou. Chcete-li provést všechny testy úspěšné, změňte if klauzuli na začátku IsPrime metody v souboru PrimeService.cs :

if (candidate < 2)

Pokračujte iterováním přidáním dalších testů, dalších teorie a dalšího kódu v hlavní knihovně. Máte dokončenou verzi testů a úplnou implementaci knihovny.

Vytvořili jste malou knihovnu a sadu testů jednotek pro tuto knihovnu. Řešení jste strukturovali tak, aby přidání nových balíčků a testů bylo součástí normálního pracovního postupu. Většinu času a úsilí jste se zaměřili na řešení cílů aplikace.

Viz také