Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Megjegyzés:
Ez nem a cikk legújabb verziója. Az aktuális kiadásról a cikk .NET 10-es verziójában olvashat.
Figyelmeztetés
A ASP.NET Core ezen verziója már nem támogatott. További információt a .NET és a .NET Core támogatási szabályzatában talál. A jelen cikk .NET 9-es verzióját lásd az aktuális kiadásért .
Fiyaz Bin Hasan és Rick Anderson
Bevezetés az integrációs tesztekbe
Az integrációs tesztek az alkalmazás összetevőit szélesebb szinten értékelik ki, mint egységtesztek. Az egységtesztek izolált szoftverösszetevők, például az egyes osztálymódszerek tesztelésére szolgálnak. Az integrációs tesztek megerősítik, hogy két vagy több alkalmazásösszetevő együttműködik a várt eredmény érdekében, beleértve a kérések teljes feldolgozásához szükséges összes összetevőt is.
Ezek a szélesebb körű tesztek az alkalmazás infrastruktúrájának és teljes keretrendszerének tesztelésére szolgálnak, gyakran a következő összetevőket is beleértve:
- Adatbázis
- Fájlrendszer
- Hálózati berendezések
- Kérelem-válasz folyamat
Az egységtesztek az infrastruktúra-összetevők helyett létrehozott összetevőket használnak, más néven hamis vagy szimulált objektumokat.
Az egységtesztekkel ellentétben az integrációs tesztek:
- Használja azokat a tényleges összetevőket, amelyeket az alkalmazás éles környezetben használ.
- További kód- és adatfeldolgozást igényel.
- A futtatás hosszabb időt vesz igénybe.
Ezért az integrációs tesztek használatának korlátozása a legfontosabb infrastruktúra-forgatókönyvekre. Ha egy viselkedést egységteszt vagy integrációs teszt használatával lehet tesztelni, válassza ki az egységtesztet.
Az integrációs tesztek megvitatása során a tesztelt projektet gyakran nevezik System Under Test, vagy röviden "SUT" néven. A cikk során a "SUT" a tesztelt ASP.NET Core-alkalmazásra hivatkozik.
Ne írjon integrációs teszteket az adatbázisok és fájlrendszerek minden permutációs adat- és fájlhozzáféréshez. Függetlenül attól, hogy az alkalmazások hány helyen használják az adatbázisokat és a fájlrendszereket, az olvasási, írási, frissítési és törlési integrációs tesztek koncentrált készlete általában képes megfelelően tesztelni az adatbázis- és fájlrendszer-összetevőket. Használjon egységteszteket az ezen összetevőkkel interakcióba lépő metóduslogika rutintesztjeihez. Az egységtesztekben az infrastruktúra hamis vagy hamisított használata gyorsabb tesztvégrehajtást eredményez.
ASP.NET Core integrációs tesztek
A ASP.NET Core integrációs tesztjeihez a következők szükségesek:
- A tesztprojektek a teszteket tartalmazzák és hajtják végre. A tesztprojekt hivatkozással rendelkezik a SUT-ra.
- A tesztprojekt létrehoz egy tesztwebhely-gazdagépet a SUT számára, és egy tesztkiszolgáló-ügyféllel kezeli a kérelmeket és a válaszokat a SUT-val.
- A tesztfuttató a tesztek végrehajtására és a teszteredmények jelentésére szolgál.
Az integrációs tesztek olyan események sorozatát követik, amelyek magukban foglalják a szokásos Előkészület, Végrehajtásés Ellenőrzés tesztelési lépéseket.
- Az SUT webhoszt konfigurálva van.
- Létrejön egy tesztkiszolgáló-ügyfél, amely kéréseket küld az alkalmazásnak.
- A Arrange tesztelési lépés végrehajtása: A tesztalkalmazás előkészít egy kérést.
- A törvény tesztlépés végrehajtása: Az ügyfél elküldi a kérést, és megkapja a választ.
- A ellenőrzési tesztlépést végrehajtják: A tényleges választ a rendszer a várt válasz alapján érvényesíti, és érvényesnek nyilvánítja (), vagy sikertelennek ().
- A folyamat az összes teszt végrehajtásáig folytatódik.
- A teszteredmények jelentésre kerültek.
A teszt webgazda általában eltérő konfigurációval van beállítva, mint az alkalmazás normál webgazdája a tesztek futtatásához. Előfordulhat például, hogy a tesztekhez egy másik adatbázist vagy különböző alkalmazásbeállításokat használnak.
Az infrastruktúra-összetevőket, például a tesztweb-gazdagépet és a memóriabeli tesztkiszolgálót (TestServer) a Microsoft.AspNetCore.Mvc.Testing csomag biztosítja vagy felügyeli. A csomag használata leegyszerűsíti a tesztek létrehozását és végrehajtását.
A Microsoft.AspNetCore.Mvc.Testing csomag a következő feladatokat kezeli:
- Másolja a függőségi fájlt (
.deps) a SUT-ból a tesztprojektbinkönyvtárába. - A tartalomgyökerét-re a SUT projektgyökeréhez állítja, hogy a statikus fájlok és a lapok/nézetek megtalálhatók legyenek a tesztek végrehajtásakor.
- A WebApplicationFactory osztály gördülékenyebbé teszi a SUT
TestServerhasználatával történő rendszerindítását.
Az egységtesztek dokumentációja ismerteti a tesztprojektek és tesztfuttatók beállításának módját, valamint a tesztek futtatásának részletes utasításait, valamint a tesztek és tesztosztályok elnevezésére vonatkozó javaslatokat.
Egységtesztek elkülönítése az integrációs tesztektől különböző projektekre. A tesztek elkülönítése:
- Segít biztosítani, hogy az infrastruktúra tesztelési összetevői véletlenül ne legyenek belefoglalva az egységtesztekbe.
- Lehetővé teszi a tesztkészlet futtatásának szabályozását.
A GitHubon található mintakód egy minimális API-alkalmazás egység- és integrációs tesztjeit szemlélteti.
IResult implementálási típusai az egységtesztben
Az alábbi példa bemutatja, hogyan lehet egységtesztelni azokat a minimális útvonalkezelőket, amelyek visszatérnek IResult, az xUnit tesztelési keretrendszer segítségével. A külső adatbázist a tesztelés során egy memórián belüli adatbázisra cseréli a rendszer, amelynek MockDb implementációja a mintakódban található.
A névtér nyilvános IResult implementálási típusai a Microsoft.AspNetCore.Http.HttpResults minimális útvonalkezelők egységtesztelésére használhatók, ha a lambdas helyett nevesített metódusokat használnak.
A következő kód az osztályt NotFound<TValue> használja:
[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);
}
A következő kód az osztályt Ok<TValue> használja:
[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);
}
Az előző példákban az eredmény egy konkrét típusba kerül, mert a vizsgált végpont több típusú ( NotFound<TValue> a vagy Ok<TValue>) eredményt adhat vissza. Ha azonban a végpont egyetlen TypedResults típust ad vissza, akkor az eredmény automatikusan erre a típusra következtet, és nincs szükség öntésre.
Az alábbi kód az osztályt Ok használja, az érték típusa pedig a következő gyűjtemény:Todo
[Fact]
public async Task GetAllReturnsTodosFromDatabase()
{
// Arrange
await using var context = new MockDb().CreateDbContext();
context.Todos.Add(new Todo
{
Id = 1,
Title = "Test title 1",
Description = "Test description 1",
IsDone = false
});
context.Todos.Add(new Todo
{
Id = 2,
Title = "Test title 2",
Description = "Test description 2",
IsDone = true
});
await context.SaveChangesAsync();
// Act
var result = await TodoEndpointsV1.GetAllTodos(context);
//Assert
Assert.IsType<Ok<Todo[]>>(result);
Assert.NotNull(result.Value);
Assert.NotEmpty(result.Value);
Assert.Collection(result.Value, todo1 =>
{
Assert.Equal(1, todo1.Id);
Assert.Equal("Test title 1", todo1.Title);
Assert.False(todo1.IsDone);
}, todo2 =>
{
Assert.Equal(2, todo2.Id);
Assert.Equal("Test title 2", todo2.Title);
Assert.True(todo2.IsDone);
});
}
További források
- Az alapszintű hitelesítési tesztek nem .NET-adattárak, de a .NET-csapat egyik tagja írta. Példákat kínál az alapszintű hitelesítés tesztelésére.
- Mintakód megtekintése vagy letöltése
- Hitelesítés és engedélyezés minimális API-kban
- Használja a porttunnelinget a Visual Studioban webes API-k hibakereséséhez
- Tesztvezérlő logika az ASP.NET Core-ban
- Razor Oldalak egységtesztjei az ASP.NET Core-ban