Začínáme s C# a MSTestem

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í, zobrazit nebo stáhnout ukázkový kód, než začnete. Pokyny ke stažení najdete ve vzorech a návodech .

Tento článek se týká testování projektu .NET Core. Pokud testujete projekt ASP.NET Core, přečtěte si téma Integrační testy v ASP.NET Core.

Požadavky

Vytvoření zdrojového projektu

Otevřete okno příkazového řádku. Vytvořte adresář s názvem unit-testing-using-mstest, který bude obsahovat řešení. V tomto novém adresáři spusťte dotnet new sln, abyste vytvořili nový soubor ř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 spuštěním dotnet new classlib vytvořte zdrojový projekt.

Změňte adresář zpět do adresáře unit-testing-using-mstest. Spusťte dotnet sln add, abyste přidali do řešení projekt knihovny tříd:

dotnet sln add PrimeService/PrimeService.csproj

Přejmenujte Class1.cs v adresáři PrimeService na PrimeService.cs. Nahraďte kód v souboru následujícím kódem, který vytvoří nefunkční 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.");
        }
    }
}

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

Nastavte adresář PrimeService.Tests jako aktuální 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="4.1.0" />
</ItemGroup>

Note

Zobrazené verze balíčků jsou příklady. Verze vygenerované pomocí dotnet new mstest závisí na vaší sadě .NET SDK. Šablony a stažené ukázky nemusí používat nejnovější verze balíčků NuGet.

Pokud chcete vyhledat aktualizace po vytvoření a spuštění testů, spusťte dotnet package list --outdated z adresáře testovacího projektu. Slouží dotnet package add <PACKAGE_NAME> k aktualizaci reference balíčku na nejnovější kompatibilní stabilní verzi. Přečtěte si poznámky k verzi, kde najdete nekompatibilní změny před aktualizací, a spusťte dotnet test znovu i poté.

Pokud používáte .NET 9 SDK nebo starší, použijte dotnet add package <PACKAGE_NAME> a dotnet list package --outdated místo toho.

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 reporting pokrytí kódu.

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

dotnet reference add ../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. Odstraňte 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 shouldn't be prime");
        }
    }
}

Atribut TestClass označuje třídu, která obsahuje jednotkové testy. Atribut TestMethod označuje, že metoda je testovací metodou.

MSTest vytvoří novou instanci třídy testu pro každý test, takže konstruktor vytvoří pro každý test samostatnou PrimeService instanci. Konstruktor obsahuje pouze nastavení, které každý test v této třídě potřebuje. Pokud vaše testy potřebují jiné nastavení, vytvořte objekty v testovacích metodách nebo volejte pomocné metody z těchto metod. Pokyny najdete v tématu Použití pomocných metod místo nastavení a rozebrání.

Uložte tento soubor a spusťte #D0, abyste sestavili testy a knihovnu tříd a pak testy spustili. Spouštěč testů MSTest obsahuje vstupní bod programu pro spuštění testů. dotnet test spustí testovací nástroj pomocí jednotkového testovacího projektu, který jste vytvořili.

Test selže, protože jste ještě nevytvořili implementaci. Proveďte tento test tak, že napíšete nejjednodušší kód ve třídě PrimeService, 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 poté projektu 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 stane únavným. 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. K zadání hodnot pro tyto vstupy můžete použít atribut DataRow.

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. Přidejte novou testovací metodu do PrimeService_IsPrimeShould.cs:

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

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

Spusťte dotnet testa dva z těchto testů selžou. Aby všechny testy prošly, změňte podmínku if na začátku metody IsPrime 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 kompletní implementaci knihovny.

Vytvořili jste malou knihovnu a sadu jednotkových testů pro tuto knihovnu. Řešení jste strukturují 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.

Spouštění testů v Azure Pipelines

Pokud chcete testy spustit automaticky při odeslání změn, přidejte do úložiště konfiguraci Azure Pipelines, které obsahuje dokončené řešení. Potřebujete projekt Azure DevOps a přístup k agentovi hostovanému společností Microsoft. Předpoklady najdete v tématu Vytvoření první pipeline.

  1. V kořenovém adresáři úložiště vytvořte azure-pipelines.yml soubor s následujícím obsahem. V příkladu se předpokládá, že adresáře PrimeService a PrimeService.Tests jsou v kořenovém adresáři úložiště a oba projekty cílí na .NET 10.

    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    steps:
    - task: UseDotNet@2
      displayName: Install .NET SDK
      inputs:
        packageType: sdk
        version: 10.0.x
    
    - task: DotNetCoreCLI@2
      displayName: Run MSTest tests
      inputs:
        command: test
        projects: PrimeService.Tests/PrimeService.Tests.csproj
        arguments: --configuration Release
        publishTestResults: true
    
  2. Upravte konfiguraci tak, aby odpovídala vašemu úložišti:

    • Pokud má vaše větev jiný název, nahraďte main v trigger názvem této větve.
    • Pokud je vaše řešení v podadresáři, aktualizujte projects na cestu k testovacímu projektu vzhledem ke kořenovému adresáři úložiště.
    • Pokud vaše projekty cílí na jinou verzi .NET, změňte version v úkolu UseDotNet@2 tak, aby odpovídal. Například použijte 8.0.x pro projekty, které cílí net8.0. Pokud vaše úložiště obsahuje soubor global.json, ujistěte se, že nainstalovaná sada SDK splňuje požadavky na jeho verzi.
  3. Commitněte a pushněte své řešení a soubor azure-pipelines.yml do svého úložiště Git.

  4. V projektu Azure DevOps vyberte Kanály buildů a nasazení>Nový kanál buildu a nasazení nebo Vytvořit kanál buildu a nasazení, pokud se jedná o váš první kanál buildu a nasazení. Vyberte poskytovatele repozitáře a repozitář.

  5. Na stránce Konfigurace vašeho kanálu vyberte Existující soubor YAML Azure Pipelines, vyberte větev a /azure-pipelines.ymlpak vyberte Pokračovat. Zkontrolujte konfiguraci a vyberte Spustit.

UseDotNet@2 Úloha nainstaluje sadu .NET SDK. DotNetCoreCLI@2 Úloha spouští dotnet test, obnoví závislosti, sestaví testovací projekt a jeho odkazovanou knihovnu a spustí testy v konfiguraci Release.

Pomocí publishTestResults: true úloha vygeneruje soubor výsledků TRX a publikuje výsledky, i když test selže. Po dokončení běhu otevřete kartu Testy běhu kanálu a zkontrolujte úspěšné a neúspěšné testy. Neúspěšný test také způsobí selhání testovací úlohy a pipeline.

Note

Tento příklad používá výchozí konfiguraci VSTest z dotnet new mstest se sadou .NET 10 SDK. Pokud povolíte Microsoft.Testing.Platform (MTP), informace o požadované konfiguraci spouštěče najdete v tématu Spouštění testů MTP v kontinuální integraci.

Viz také