Az alkalmazásgazda kezelése .NET.NET Aspire tesztekben
Ha funkcionális vagy integrációs teszteket ír .NET.NET Aspire, a alkalmazásgazda példány hatékony kezelése kulcsfontosságú. Az alkalmazásgazda a teljes alkalmazáskörnyezetet képviseli, és költséges lehet létrehozni és lebontani. Ez a cikk azt ismerteti, hogyan kezelheti az alkalmazásgazdapéldányt a .NET.NET Aspire tesztekben.
A .NET.NET Aspire tesztek írásakor használja a 📦 Aspire.Hosting.Testing
NuGet-csomagot, amely néhány segédosztályt tartalmaz az alkalmazás gazdagéppéldányának a tesztekben történő kezeléséhez.
A DistributedApplicationTestingBuilder
osztály használata
Az első teszt megírásáról szóló oktatóanyagban megismerkedett a DistributedApplicationTestingBuilder osztállyal, amely az alkalmazás gazdagép példányának létrehozására használható.
var appHost = await DistributedApplicationTestingBuilder
.CreateAsync<Projects.AspireApp_AppHost>();
A DistributedApplicationTestingBuilder.CreateAsync<T>
metódus általános paraméterként veszi fel az alkalmazásgazdaprojekt típusát az alkalmazás gazdagéppéldányának létrehozásához. Bár ezt a módszert a tesztek elején hajtják végre, hatékonyabb egyszer létrehozni az alkalmazásgazda példányát, és megosztani azt a tesztek között, ahogy a tesztcsomag növekszik.
Az xUnittal implementálja az IAsyncLifetime felületet a tesztosztályon az alkalmazásgazdapéldány aszinkron inicializálásának és eltávolításának támogatásához. A InitializeAsync
metódus az alkalmazás-gazdagép példányának létrehozására szolgál a tesztek futtatása előtt, és a DisposeAsync
metódus megsemmisíti az alkalmazás-gazdagépet a tesztek befejezése után.
public class WebTests : IAsyncLifetime
{
private DistributedApplication _app;
public async Task InitializeAsync()
{
var appHost = await DistributedApplicationTestingBuilder
.CreateAsync<Projects.AspireApp_AppHost>();
_app = await appHost.BuildAsync();
}
public async Task DisposeAsync() => await _app.DisposeAsync();
[Fact]
public async Task GetWebResourceRootReturnsOkStatusCode()
{
// test code here
}
}
Az MSTesttel a tesztosztály statikus metódusainak ClassInitializeAttribute és ClassCleanupAttribute használatával biztosíthatja az alkalmazás gazdagéppéldányának inicializálását és törlését. A ClassInitialize
metódus az alkalmazás gazdagéppéldányának létrehozására szolgál a tesztek futtatása előtt, és a ClassCleanup
metódus a tesztek befejezése után megsemmisíti az alkalmazásgazdapéldányt.
[TestClass]
public class WebTests
{
private static DistributedApplication _app;
[ClassInitialize]
public static async Task ClassInitialize(TestContext context)
{
var appHost = await DistributedApplicationTestingBuilder
.CreateAsync<Projects.AspireApp_AppHost>();
_app = await appHost.BuildAsync();
}
[ClassCleanup]
public static async Task ClassCleanup() => await _app.DisposeAsync();
[TestMethod]
public async Task GetWebResourceRootReturnsOkStatusCode()
{
// test code here
}
}
Az NUnit-tel a OneTimeSetUp és OneTimeTearDown attribútumokat használja a tesztosztály metódusain, hogy előkészítse és lebontsa az alkalmazásházigazda példányát. A OneTimeSetUp
metódus az alkalmazás gazdagéppéldányának létrehozására szolgál a tesztek futtatása előtt, és a OneTimeTearDown
metódus a tesztek befejezése után megsemmisíti az alkalmazásgazdapéldányt.
public class WebTests
{
private DistributedApplication _app;
[OneTimeSetUp]
public async Task OneTimeSetup()
{
var appHost = await DistributedApplicationTestingBuilder
.CreateAsync<Projects.AspireApp_AppHost>();
_app = await appHost.BuildAsync();
}
[OneTimeTearDown]
public async Task OneTimeTearDown() => await _app.DisposeAsync();
[Test]
public async Task GetWebResourceRootReturnsOkStatusCode()
{
// test code here
}
}
A tesztfuttatás elindításakor az alkalmazás gazdagépét rögzítve az egyes tesztekben anélkül elérheti azt, hogy újra létre kellene hoznia azt, ezzel csökkentve a tesztek futtatási idejét. Ezután, amikor a tesztfuttatás befejeződik, az alkalmazásgazda felszabadul, amely megtisztítja a tesztfuttatás során létrehozott erőforrásokat, például a tárolókat.
Argumentumok átadása az alkalmazásgazda számára
Az alkalmazás hosztjának args
paraméterével érheti el az argumentumokat. A rendszer argumentumokat is átad .NETkonfigurációs rendszerének, így így számos konfigurációs beállítást felülbírálhat. A következő példában a környezetet felülbírálja azáltal, hogy parancssori opcióként adja meg:
var builder = await DistributedApplicationTestingBuilder
.CreateAsync<Projects.MyAppHost>(
[
"--environment=Testing"
]);
Más argumentumok továbbíthatók az alkalmazásgazda Program
és elérhetővé tehetők az alkalmazásgazda számára. A következő példában egy paramétert ad át az alkalmazásgazdának, és ezzel szabályozza, hogy adatköteteket adjon hozzá egy Postgres-példányhoz.
Az alkalmazásgazda Program
konfigurációval támogatja a kötetek engedélyezését vagy letiltását:
var postgres = builder.AddPostgres("postgres1");
if (builder.Configuration.GetValue("UseVolumes", true))
{
postgres.WithDataVolume();
}
A tesztkódban a "UseVolumes=false"
-t a args
-ben továbbítod az alkalmazáshostnak.
public async Task DisableVolumesFromTest()
{
// Disable volumes in the test builder via arguments:
using var builder = await DistributedApplicationTestingBuilder
.CreateAsync<Projects.TestingAppHost1_AppHost>(
[
"UseVolumes=false"
]);
// The container will have no volume annotation since we disabled volumes by passing UseVolumes=false
var postgres = builder.Resources.Single(r => r.Name == "postgres1");
Assert.Empty(postgres.Annotations.OfType<ContainerMountAnnotation>());
}
A DistributedApplicationFactory
osztály használata
Bár a DistributedApplicationTestingBuilder
osztály sok esetben hasznos, előfordulhatnak olyan helyzetek, amikor nagyobb mértékben szeretné szabályozni az alkalmazásgazda elindítását, például a kód végrehajtását a szerkesztő létrehozása előtt vagy az alkalmazásgazda létrehozása után. Ön megvalósítja az DistributedApplicationFactory osztály saját verzióját ezekben az esetekben. Ezt használja a DistributedApplicationTestingBuilder
belsőleg.
public class TestingAspireAppHost()
: DistributedApplicationFactory(typeof(Projects.AspireApp_AppHost))
{
// override methods here
}
A konstruktorhoz paraméterként az alkalmazásgazda projekthivatkozásának típusa szükséges. Opcionálisan megadhat argumentumokat az alapul szolgáló alkalmazás-készítőnek. Ezek az argumentumok szabályozzák az alkalmazásgazda indítását, és értékeket adnak az Program.cs fájl által az alkalmazás gazdagéppéldányának elindításához használt args változónak.
Életciklus-módszerek
A DistributionApplicationFactory
osztály számos olyan életciklus-metódust biztosít, amelyek felülírásával egyedi viselkedést nyújthat az app-gazda előkészítése és létrehozása során. A rendelkezésre álló módszerek a következők: OnBuilderCreating
, OnBuilderCreated
, OnBuilding
és OnBuilt
.
Például a OnBuilderCreating
metódussal állíthatjuk be a konfigurációt, például az előfizetést és az erőforráscsoport adatait Azure, mielőtt az alkalmazásgazda létrejön, és minden függő Azure erőforrás ki lesz építve, ami a megfelelő Azure környezetet használó teszteket eredményez.
public class TestingAspireAppHost() : DistributedApplicationFactory(typeof(Projects.AspireApp_AppHost))
{
protected override void OnBuilderCreating(DistributedApplicationOptions applicationOptions, HostApplicationBuilderSettings hostOptions)
{
hostOptions.Configuration ??= new();
hostOptions.Configuration["environment"] = "Development";
hostOptions.Configuration["AZURE_SUBSCRIPTION_ID"] = "00000000-0000-0000-0000-000000000000";
hostOptions.Configuration["AZURE_RESOURCE_GROUP"] = "my-resource-group";
}
}
A .NET konfigurációs rendszerben az elsőbbségi sorrend miatt a környezeti változók lesznek használtak a appsettings.json és secrets.json fájlban lévő elemekkel szemben.
Egy másik forgatókönyv, amelyet érdemes lehet használni az életciklusban, az alkalmazásgazda által használt szolgáltatások konfigurálása. Az alábbi példában olyan forgatókönyvet vegyünk figyelembe, amelyben felülbíráljuk a OnBuilderCreated
API-t, hogy rugalmasságot adjunk a HttpClient
:
protected override void OnBuilderCreated(
DistributedApplicationBuilder applicationBuilder)
{
applicationBuilder.Services.ConfigureHttpClientDefaults(clientBuilder =>
{
clientBuilder.AddStandardResilienceHandler();
});
}
Lásd még:
- Az első .NET.NET Aspire teszt megírása