Nyelv

A tesztelés alatt álló kód elkülönítése Microsoft hamis kódokkal

A kódelkülönítés olyan tesztelési stratégia, amely gyakran olyan eszközökkel van implementálva, mint a Microsoft Hamisítványok, ahol a tesztelt kód el van választva az alkalmazás többi részétől. Ez az elkülönítés úgy valósítható meg, hogy az alkalmazásnak a tesztelt kóddal kapcsolatba lépő részeit stubokra vagy shimekre cseréljük. Ezek a tesztek által vezérelt kis kódrészletek, amelyek szimulálják a ténylegesen lecserélt részek viselkedését.

Ennek a megközelítésnek az az előnye, hogy lehetővé teszi, hogy a kód adott funkcióinak tesztelésére összpontosítson külön-külön. Ha egy teszt sikertelen, akkor tudja, hogy az ok az izolált kódban van, és nem valahol máshol. Emellett a Microsoft Fakes által biztosított stubok és shimek használata lehetővé teszi, hogy a kódod akkor is teszteld, ha az alkalmazásod más részei még nem működnek.

Requirements

Note

A profilalkotás a Visual Studióval nem érhető el a Microsoft Fakes-t használó tesztekhez.

A Microsoft Fakes szerepe a kód elszigetelésében

A Microsoft Fakes kulcsszerepet játszik a kód izolálásában azáltal, hogy két mechanizmust biztosít: stubokat és shimeket.

  • Stubok: Ezeket arra használják, hogy egy osztályt egy kisebb helyettesítő elemmel váltsanak fel, amely ugyanazt az interfészt valósítja meg. Ehhez az alkalmazást úgy kell megtervezni, hogy az egyes összetevők csak a felületektől függjenek, más összetevőktől nem.

  • Shims: Ezek az alkalmazás lefordított kódjának futásidőben történő módosítására szolgálnak. Megadott metódushívás helyett az alkalmazás a teszt által biztosított shim kódot futtatja. A shimek helyettesíthetik a nem módosítható szerelvények, például a .NET-szerelvények felé irányuló hívásokat.

A Visual Studio-megoldáson belüli hívásokhoz általában stubokat, míg a többi hivatkozott szerelvényhez irányuló hívásokhoz shimeket használnak. Ennek az az oka, hogy a megoldásban bevett gyakorlat az összetevők szétválasztása azáltal, hogy az interfészeket a stubok használatának megfelelően definiálja. A külső szerelvények azonban gyakran nem tartoznak külön interfészdefiníciókhoz, ezért a rendszer inkább shim-eket használ.

Ábra, amely azt mutatja, hogy a hamis elemek más komponenseket helyettesítenek.

Javaslatok arra, hogy mikor érdemes stubokat használni

A stubokat általában a Visual Studio-megoldáson belüli hívásokhoz használják, mert bevált gyakorlat az összetevőket úgy szétválasztani, hogy az interfészeket a stuboláshoz szükséges módon definiálják. Azonban a külső szerelvényekhez, például a System.dll-hez, általában nem állnak rendelkezésre külön interfészdefiníciók, ezért ezekben az esetekben inkább shim-eket használnának.

A stubok használata azt jelenti, hogy az alkalmazást úgy kell megtervezni, hogy a különböző komponensek ne egymástól, hanem csak az interfészdefinícióktól függjenek. Ez a leválasztás robusztusabbá és rugalmasabbá teszi az alkalmazást, és lehetővé teszi a tesztelt összetevő csatlakoztatását az interfészek csonk implementációihoz tesztelési célokra.

A gyakorlatban létrehozhat csonktípusokat a Visual Studio felületdefinícióiból, majd lecserélheti a valódi összetevőt a tesztben szereplő csonkra.

Ajánlások arra, hogy mikor érdemes a Shimseket használni

Míg a csonkokat a Visual Studio-megoldáson belüli hívásokhoz használják, addig a shimeket jellemzően más hivatkozott assemblyk hívásaihoz használják. Ennek az az oka, hogy a külső szerelvények, például a System.dll általában nem biztosítanak külön interfészdefiníciókat, ezért inkább a shim-eket kell használni.

A shims használatakor azonban figyelembe kell venni néhány tényezőt:

Teljesítmény: A shims lassabban fut, mert futásidőben újraírják a kódot. A stuboknál nincs ilyen teljesítménybeli többletterhelés, és olyan gyorsan futnak, amilyen gyorsan a virtuális metódusok futhatnak.

Statikus módszerek, lezárt típusok: Csak csonkokkal valósíthat meg interfészeket. Ezért a csonktípusok nem használhatók statikus metódusokhoz, nem virtuális módszerekhez, lezárt virtuális módszerekhez, lezárt típusok metódusaihoz stb.

Belső típusok: A csonkok és a shimek egyaránt használhatók olyan belső típusok esetén, amelyek a szerelvény attribútumával InternalsVisibleToAttributeérhetők el.

Privát metódusok: A shims képes lecserélni a privát metódusokra irányuló hívásokat, ha a metódusaláírás összes típusa látható. A stubok csak a látható metódusokat helyettesíthetik.

Interfészek és absztrakt metódusok: A stubok a tesztelés során használható interfészeket és absztrakt metódusokat implementálnak. A shimek nem képesek interfészeket és absztrakt metódusokat instrumentálni, mivel ezek nem rendelkeznek metódustörzzsel.


A Microsoft Fakes átállítása .NET-keretrendszerbeli projektekről SDK-stílusú projektekre

A Microsoft Fakes-t használó .NET-keretrendszerbeli tesztprojektek átállítása SDK-stílusú .NET-keretrendszer-, .NET Core- vagy .NET 5+ projektekre.

A Microsoft Fakes .NET Core-ra vagy .NET 5.0-ra való átállításához csak minimális módosításokra van szükség a .NET Framework beállításaiban. A következő eseteket kell figyelembe vennie:

  • Ha egyéni projektsablont használ, gondoskodnia kell arról, hogy SDK-stílusú legyen, és kompatibilis célkerethez építsen.

  • Bizonyos típusok különböző szerelvényekben léteznek .NET Keretrendszerben és .NET Core/.NET 5.0-s verzióban (például System.DateTime létezik System/mscorlib .NET keretrendszerben, System.Runtime a .NET Core-ban és .NET 5.0-ban), és ezekben a forgatókönyvekben módosítania kell a hamisított szerelvényt.

  • Ha szerelvényhivatkozással rendelkezik egy hamis szerelvényre és a tesztprojektre, a következőhöz hasonló, hiányzó hivatkozásra vonatkozó buildre vonatkozó figyelmeztetés jelenhet meg:

    (ResolveAssemblyReferences target) ->
    warning MSB3245: Could not resolve this reference. Could not locate the assembly "AssemblyName.Fakes". Check to make sure the assembly exists on disk.
    If this reference is required by your code, you may get compilation errors.
    

    Ez a figyelmeztetés a Hamisítandók létrehozása során szükséges módosítások miatt van, és figyelmen kívül hagyható. Ezt elkerülheti, ha eltávolítja a szerelvényhivatkozást a projektfájlból, mert most implicit módon hozzáadjuk őket a buildelés során.

Microsoft hamis tesztek futtatása

Amíg a Microsoft Fakes-szerelvények megtalálhatók a beállított FakesAssemblies könyvtárban (amelynek alapértelmezett értéke: $(ProjectDir)FakesAssemblies), a vstest feladat használatával futtathat teszteket.

A vstest feladattal végzett elosztott teszteléshez a Microsoft Fakes használatával készült .NET Core- és .NET 5+ projektek esetén Visual Studio 2019 Update 9 Preview 20201020-06 vagy újabb verzió szükséges.

A Microsoft Fakes kompatibilitása és támogatása a különböző .NET- és Visual Studio-verziókban

Microsoft .NET keretrendszert (nem SDK-stílust) célzó régebbi projektekben való hamisítások.

  • A Microsoft Fakes szerelvények létrehozása a Visual Studio Enterprise 2015-ben és újabb verzióiban támogatott.
  • A Microsoft Fakes-tesztek az összes elérhető Microsoft.TestPlatform NuGet-csomaggal futtathatók.
  • A kódlefedettség támogatott a Microsoft Fakes-t használó tesztprojektek esetén a Visual Studio Enterprise 2015-ben és újabb verziókban.

Microsoft Fakes SDK-stílusú .NET Framework-, .NET Core- és .NET 5.0-s vagy újabb projektekhez

  • A Microsoft Fakes szerelvénygenerálása előzetesként jelent meg a Visual Studio Enterprise 2019 6-os frissítésében, és a 8-as frissítésben alapértelmezés szerint engedélyezett.
  • A .NET-keretrendszert célzó projektekhez készült Microsoft Fakes-tesztek az összes elérhető Microsoft.TestPlatform NuGet-csomaggal futtathatók.
  • A .NET Core-t, valamint a .NET 5.0-s vagy újabb verziót célzó projektekhez készült Microsoft Fakes-tesztek a 16.9.0-preview-20210106-01 vagy újabb verziójú Microsoft.TestPlatform NuGet-csomagokkal futtathatók.
  • A kódlefedettség elérhető a .NET-keretrendszert célzó tesztprojektekhez a Microsoft Fakes használatával a Visual Studio Enterprise 2015-ös és újabb verzióiban.
  • A Microsoft Fakes használatával a .NET Core-t, valamint a .NET 5.0-s vagy újabb verziókat célzó tesztprojektek kódlefedettségi támogatása a Visual Studio 2019 9-es vagy újabb frissítésétől érhető el.