Izolace kódu pod testem pomocí Microsoft Fakes

Izolace kódu je testovací strategie, která se často implementuje s nástroji, jako je Microsoft Fakes, kde je kód, který testujete, oddělený od zbytku aplikace. Tohoto oddělení se dosáhne nahrazením částí aplikace, které komunikují s testovaným kódem, stuby nebo shimy. Jedná se o malé části kódu řízené vašimi testy, které simulují chování skutečných částí, které nahrazují.

Výhodou tohoto přístupu je, že se můžete zaměřit na testování konkrétních funkcí kódu izolovaně. Pokud test selže, víte, že příčina je v izolovaném kódu a ne někde jinde. Kromě toho vám použití stubů a shimů, které poskytuje Microsoft Fakes, umožňuje testovat kód, i když ostatní části vaší aplikace ještě nefungují.

Požadavky

  • Visual Studio Enterprise
  • Projekt rozhraní .NET Framework
  • .NET Core, .NET 5.0 nebo novější a podpora projektů ve stylu sady SDK v Visual Studio 2019 a novějších verzích. Další informace naleznete v tématu Microsoft Fakes for .NET Core and SDK-style projects.

Note

Profilace pomocí Visual Studio není dostupná pro testy, které používají Microsoft Fakes.

Role Microsoft Fakes v izolaci kódu

Microsoft Fakes hraje klíčovou roli při izolaci kódu tím, že poskytuje dva mechanismy – stuby a shimy.

  • Stuby: Slouží k nahrazení třídy malým zástupným objektem, který implementuje stejné rozhraní. To vyžaduje, aby byla aplikace navržena tak, aby každá komponenta závisela pouze na rozhraních, nikoli na jiných komponentách.

  • Shims: Slouží k úpravě zkompilovaného kódu aplikace za běhu. Místo volání zadané metody spustí aplikace kód shim, který váš test poskytuje. Shimy mohou nahradit volání do sestavení, která nemůžete upravit, například do knihoven .NET.

Obvykle se stuby používají pro volání v rámci vašeho řešení sady Visual Studio a shimy pro volání do jiných odkazovaných sestavení. Je to proto, že ve svém řešení je vhodné oddělit komponenty tím, že definujete rozhraní tak, jak to vyžaduje stubování. Externí sestavení ale často neobsahují samostatné definice rozhraní, takže se místo toho používají převlečky.

Diagram znázorňující, jak napodobeniny nahrazují jiné komponenty.

Doporučení, kdy použít zástupné objekty

Stuby se obvykle používají pro volání ve vašem řešení sady Visual Studio, protože je vhodné oslabit vazby mezi komponentami definováním rozhraní tak, jak to stubování vyžaduje. Externí sestavení, jako je například System.dll, ale obvykle nejsou k dispozici s samostatnými definicemi rozhraní, takže by se v těchto případech místo toho používaly shimy.

Použití zástupných procedur zahrnuje návrh aplikace tak, aby různé komponenty nebyly závislé na sobě navzájem, ale pouze na definicích rozhraní. Díky tomuto oddělení je aplikace robustnější a flexibilnější a můžete tak testovanou komponentu pro účely testování propojit se zástupnými implementacemi rozhraní.

V praxi můžete generovat typy zástupných procedur z definic rozhraní v Visual Studio a pak nahradit skutečnou komponentu zástupným kódem v testu.

Doporučení k použití shims

Zatímco stuby se používají pro volání v rámci vašeho řešení sady Visual Studio, shimy se obvykle používají pro volání do jiných odkazovaných sestavení. Důvodem je to, že externí sestavení, jako je System.dll, obvykle nejsou k dispozici s samostatnými definicemi rozhraní, takže se místo toho musí použít převlečky.

Při použití shimů je však potřeba vzít v úvahu některé faktory:

Výkon: Shimy běží pomaleji, protože přepisují kód za běhu. Stuby nemají tuto výkonnostní režii a jsou stejně rychlé jako virtuální metody.

Statické metody, zapečetěné typy: K implementaci rozhraní můžete použít pouze zástupné procedury. Proto nelze typy stub použít pro statické metody, nevirtuální metody, uzavřené virtuální metody, metody v uzavřených typech atd.

Interní typy: Stuby i shimy lze použít s interními typy, které jsou zpřístupněny pomocí atributu sestavení InternalsVisibleToAttribute.

Privátní metody: Shims může nahradit volání privátních metod, pokud jsou viditelné všechny typy v podpisu metody. Stuby mohou nahrazovat pouze viditelné metody.

Rozhraní a abstraktní metody: Stuby poskytují implementace rozhraní a abstraktních metod, které lze použít při testování. Shims nemůže instrumentovat rozhraní a abstraktní metody, protože nemají těla metod.


Převod Microsoft Fakes z platformy .NET Framework na projekty ve stylu SDK

Přechod projektů testů .NET Framework, které používají Microsoft Fakes, na projekty .NET Framework ve stylu sady SDK, .NET Core nebo .NET 5 nebo novějších.

K přechodu na .NET Core nebo .NET 5.0 budete potřebovat minimální změny nastavené v rozhraní .NET Framework pro Microsoft Fakes. Případy, které byste měli zvážit, jsou:

  • Pokud používáte vlastní šablonu projektu, musíte zajistit, aby byla ve stylu SDK a sestavila se pro kompatibilní cílový framework.

  • Některé typy existují v různých sestaveních v .NET Framework a .NET Core/.NET 5.0 (například System.DateTime existuje v System/mscorlib v .NET Framework a v System.Runtime v .NET Core a .NET 5.0) a v těchto scénářích je potřeba změnit sestavení, které je falešné.

  • Pokud máte odkaz na sestavení Fakes i na testovací projekt, může se zobrazit upozornění při sestavení na chybějící referenci podobné tomuto:

    (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.
    

    Toto upozornění je způsobeno nezbytnými změnami provedenými ve generaci Fakes a je možné ho ignorovat. Můžete se tomu vyhnout odebráním odkazu na sestavení ze souboru projektu, protože je teď implicitně přidáme během sestavení.

Spuštění testů Microsoft Fakes

Pokud jsou v nakonfigurovaném adresáři FakesAssemblies přítomna sestavení Microsoft Fakes (výchozí hodnota je $(ProjectDir)FakesAssemblies), můžete spouštět testy pomocí úlohy vstest.

Distribuované testování pomocí úlohy vstest .NET Core a .NET 5+ s využitím projektů Microsoft Fakes vyžaduje Visual Studio 2019 Update 9 Preview 20201020-06 a vyšší.

Kompatibilita a podpora nástroje Microsoft Fakes v různých verzích .NET a Visual Studia

Microsoft Fakes ve starších projektech cílících na .NET Framework (ve stylu jiném než SDK).

  • Generování sestavení Microsoft Fakes je podporováno v sadě Visual Studio Enterprise 2015 a vyšších verzích.
  • Testy Microsoft Fakes lze spouštět se všemi dostupnými balíčky NuGet Microsoft.TestPlatform.
  • Pokrytí kódu je podporováno u testovacích projektů používajících Microsoft Fakes ve Visual Studio Enterprise 2015 a novějších.

Microsoft Fakes v projektech .NET Framework, .NET Core a .NET 5.0 nebo novějších ve stylu SDK

  • Generování sestavení Microsoft Fakes bylo k dispozici ve verzi Preview v sadě Visual Studio Enterprise 2019 Update 6 a v aktualizaci Update 8 je ve výchozím nastavení povolené.
  • Testy Microsoft Fakes pro projekty, které cílí na rozhraní .NET Framework, mohou běžet se všemi dostupnými balíčky NuGet Microsoft.TestPlatform.
  • Testy Microsoft Fakes pro projekty, které cílí na .NET Core a .NET 5.0 nebo novější, lze spouštět s balíčky NuGet Microsoft.TestPlatform ve verzích 16.9.0-preview-20210106-01 a novějšími.
  • Pokrytí kódu se podporuje u testovacích projektů, které cílí na .NET Framework pomocí Microsoft Fakes ve verzi Visual Studio Enterprise verze 2015 a vyšší.
  • Podpora pokrytí kódu pro projekty testů, které cílí na .NET Core a .NET 5.0 nebo novější pomocí Microsoft Fakes, je k dispozici ve verzi Visual Studio 2019 Update 9 a vyšší.