Sdílet prostřednictvím


Testy jednotek a integrace v minimálních aplikacích API

Fiyaz Bin Hasan a Rick Anderson

Úvod do integračních testů

Integrační testy vyhodnocují komponenty aplikace na širší úrovni než testy jednotek. Testy jednotek se používají k testování izolovaných softwarových komponent, jako jsou například jednotlivé metody tříd. Testy integrace ověřují, že dvě nebo více součástí aplikace spolupracují a vytvářejí očekávaný výsledek, a to včetně všech komponent potřebných k úplnému zpracování požadavku.

Tyto širší testy se používají k otestování infrastruktury a celé architektury aplikace, často včetně následujících komponent:

  • Databáze
  • Systém souborů
  • Síťová zařízení
  • Kanál odpovědi požadavku

Testy jednotek používají prostředky infrastruktury, označované jako falešné nebo napodobené objekty, místo komponent infrastruktury.

Na rozdíl od testů jednotek jsou integrační testy:

  • Použijte skutečné komponenty, které aplikace používá v produkčním prostředí.
  • Vyžaduje více kódu a zpracování dat.
  • Spusťte delší dobu.

Proto omezte použití integračních testů na nejdůležitější scénáře infrastruktury. Pokud je možné testovat chování pomocí testu jednotek nebo integračního testu, zvolte test jednotek.

V diskusích o integračních testech se testovaný projekt často nazývá systém pod testem nebo "SUT". "SUT" se používá v tomto článku k odkazování na aplikaci ASP.NET Core, která se testuje.

Nezapisujte integrační testy pro každou permutaci dat a přístupu k souborům s databázemi a systémy souborů. Bez ohledu na to, kolik míst v aplikaci komunikuje s databázemi a systémy souborů, je obvykle schopná dostatečně testovat databáze a součásti systému souborů zaměřenou na čtení, zápis, aktualizaci a odstranění. Pro rutinní testy logiky metody, které s těmito komponentami pracují, použijte testy jednotek. Při testování jednotek může použití falešných nebo napodobených infrastruktur vést k rychlejšímu provádění testů.

testy integrace ASP.NET Core

Integrační testy v ASP.NET Core vyžadují následující:

  • Projekt testů se používá k zahrnutí a provádění testů. Testovací projekt má odkaz na SUT.
  • Testovací projekt vytvoří testovacího webového hostitele pro SUT a použije klienta testovacího serveru ke zpracování požadavků a odpovědí pomocí SUT.
  • Spouštěč testů se používá k provádění testů a hlášení výsledků testu.

Integrační testy se řídí posloupností událostí, které zahrnují obvyklé testovací kroky Uspořádat, Jednat a Assert :

  1. Webový hostitel SUT je nakonfigurovaný.
  2. Vytvoří se testovací serverový klient pro odesílání požadavků do aplikace.
  3. Spustí se testovací krok Uspořádat : Testovací aplikace připraví požadavek.
  4. Spustí se testovací krok actu : Klient odešle požadavek a obdrží odpověď.
  5. Provede se testovací krok Assert: Skutečnáodpověď se ověří jako úspěšné nebo neúspěšné na základě očekávané odpovědi.
  6. Proces pokračuje, dokud se všechny testy nespustí.
  7. Výsledky testu jsou hlášeny.

Obvykle je testovací webový hostitel nakonfigurovaný jinak než normální webový hostitel aplikace pro testovací běhy. Pro testy se například může použít jiná databáze nebo jiná nastavení aplikace.

Komponenty infrastruktury, jako je testovací webový hostitel a testovací server v paměti (TestServer), jsou poskytovány nebo spravovány balíčkem Microsoft.AspNetCore.Mvc.Testing . Použití tohoto balíčku zjednodušuje vytváření a spouštění testů.

Balíček Microsoft.AspNetCore.Mvc.Testing zpracovává následující úlohy:

  • Zkopíruje soubor závislostí (.deps) z SUT do adresáře testovacího bin projektu.
  • Nastaví kořen obsahu na kořen projektu SUT tak, aby se při spuštění testů zjistily statické soubory a stránky/zobrazení.
  • Poskytuje WebApplicationFactory třídy pro zjednodušení bootstrapping SUT s TestServer.

Dokumentace k testům jednotek popisuje, jak nastavit testovací projekt a spouštěč testů, spolu s podrobnými pokyny ke spouštění testů a doporučení pro pojmenování testů a tříd testů.

Oddělte testy jednotek od integračních testů do různých projektů. Oddělení testů:

  • Pomáhá zajistit, aby součásti testování infrastruktury nejsou omylem zahrnuty do testů jednotek.
  • Umožňuje kontrolu nad tím, jakou sadu testů se spouští.

Ukázkový kód na GitHubu poskytuje příklad testů jednotek a integrace v aplikaci s minimálním rozhraním API.

Typy implementace IResult

Veřejné IResult typy implementace v Microsoft.AspNetCore.Http.HttpResults oboru názvů lze použít k testování minimálních obslužných rutin tras při použití pojmenovaných metod místo lambda.

Následující kód používá NotFound<TValue> třídu:

[Fact]
public async Task GetTodoReturnsNotFoundIfNotExists()
{
    // Arrange
    await using var context = new MockDb().CreateDbContext();

    // Act
    var result = await TodoEndpointsV1.GetTodo(1, context);

    //Assert
    Assert.IsType<Results<Ok<Todo>, NotFound>>(result);

    var notFoundResult = (NotFound) result.Result;

    Assert.NotNull(notFoundResult);
}

Následující kód používá Ok<TValue> třídu:

[Fact]
public async Task GetTodoReturnsTodoFromDatabase()
{
    // Arrange
    await using var context = new MockDb().CreateDbContext();

    context.Todos.Add(new Todo
    {
        Id = 1,
        Title = "Test title",
        Description = "Test description",
        IsDone = false
    });

    await context.SaveChangesAsync();

    // Act
    var result = await TodoEndpointsV1.GetTodo(1, context);

    //Assert
    Assert.IsType<Results<Ok<Todo>, NotFound>>(result);

    var okResult = (Ok<Todo>)result.Result;

    Assert.NotNull(okResult.Value);
    Assert.Equal(1, okResult.Value.Id);
}

Další materiály