Izolace testovaného kódu pomocí Napodobenin Microsoft

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. Toto oddělení se dosahuje nahrazením částí aplikace, které interagují s kódem v rámci testu zástupnými procedurami nebo překrytím. 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 použití zástupných procedur a překrytí, které poskytuje Microsoft Fakes, umožňuje otestovat kód i v případě, že jiné části vaší aplikace ještě nefungují.

Požadavky

  • Visual Studio Enterprise
  • Projekt rozhraní .NET Framework
  • Podpora projektů ve stylu .NET Core, .NET 5.0 nebo novější a verze SDK ve verzi Preview v sadě Visual Studio 2019 Update 6 a je ve výchozím nastavení povolená v aktualizaci Update 8. Další informace naleznete v tématu Microsoft Fakes for .NET Core and SDK-style projects.

Poznámka:

Profilace pomocí sady Visual Studio není k dispozici pro testy, které používají Microsoft Fakes.

Role Falešných kódů Microsoftu v izolaci kódu

Microsoft Fakes hraje klíčovou roli v izolaci kódu tím, že poskytuje dva mechanismy – zástupné procedury a překrytí.

  • Zástupné procedury: Slouží k nahrazení třídy malou náhradou, 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. Přechádky můžou nahradit volání sestavení, která nemůžete upravovat, například sestavení .NET.

Zástupné procedury se obvykle používají pro volání v rámci řešení sady Visual Studio a překrytí pro volání jiných odkazovaných sestavení. Je to proto, že v rámci vašeho řešení je vhodné oddělit komponenty definováním rozhraní způsobem, který vyžaduje překrývání. Externí sestavení ale často neobsahují samostatné definice rozhraní, takže se místo toho používají převlečky.

Diagram that show Fakes replacing other components.

Doporučení k použití zástupné procedury při použití

Zástupné procedury se obvykle používají pro volání v rámci řešení sady Visual Studio, protože je vhodné oddělit komponenty definováním rozhraní způsobem, který vyžaduje překrývání. Externí sestavení, jako je System.dll, však obvykle nejsou poskytována s samostatnými definicemi rozhraní, takže by se v těchto případech místo toho použily 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 umožňuje připojit komponentu pod testem k implementaci zástupných procedur rozhraní pro účely testování.

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

Doporučení k použití shims

Zástupné procedury se používají pro volání v rámci řešení sady Visual Studio, ale překrytí se obvykle používají pro volání jiných odkazovaných sestavení. Důvodem je to, že externí sestavení, jako je System.dll, obvykle nejsou poskytována s samostatnými definicemi rozhraní, takže je nutné místo toho použít shimy.

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. Zástupné procedury nemají tuto režii na výkon a jsou tak rychlé, jak můžou běžet virtuální metody.

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

Interní typy: Zástupné procedury i překryvné procedury lze použít s interními typy, které jsou přístupné pomocí atributu InternalsVisibleToAttributesestavení .

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

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


Přechod microsoft Fakes v rozhraní .NET Framework na projekty ve stylu sady SDK

Přechod projektů testů rozhraní .NET Framework, které používají Microsoft Fakes, na projekty .NET Framework, .NET Core nebo .NET 5+

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

  • Pokud používáte vlastní šablonu projektu, musíte se ujistit, že jde o styl sady SDK a sestavení pro kompatibilní cílovou architekturu.

  • Některé typy existují v různých sestaveních v rozhraní .NET Framework a .NET Core/.NET 5.0 (například System.DateTime existují vmscorlib System/rozhraní .NET Framework a v System.Runtime .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 a testovací projekt, může se zobrazit upozornění sestavení na chybějící odkaz podobný hle:

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

Spouštění testů Microsoft Fakes

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

Distribuované testování pomocí projektů .NET Core a .NET 5 a novějších úloh vstestu pomocí Microsoft Fakes vyžaduje Visual Studio 2019 Update 9 Preview 20201020-06 a vyšší.

Kompatibilita a podpora fakes od Microsoftu v různých verzích .NET a Visual Studio

Microsoft Fakes ve starších projektech, které cílí na rozhraní .NET Framework (bez stylu sady SDK).

  • Generování sestavení Microsoft Fakes je podporováno v sadě Visual Studio Enterprise 2015 a novějších.
  • Testy Microsoft Fakes můžou běžet 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 v sadě Visual Studio Enterprise 2015 a vyšších verzích.

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

  • Generování sestavení Microsoft Fakes ve verzi Preview v sadě Visual Studio Enterprise 2019 Update 6 a je ve výchozím nastavení povolené v aktualizaci Update 8.
  • 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ší, můžou běžet s balíčky NuGet Microsoft.TestPlatform s verzemi 16.9.0-preview-20210106-01 a vyšší.
  • Pokrytí kódu je podporováno pro projekty testů, které cílí na rozhraní .NET Framework pomocí microsoft Fakes v sadě 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 v sadě Visual Studio 2019 update 9 a vyšší.