Izolowanie testowanego kodu za pomocą struktury Microsoft Fakes

Izolacja kodu to strategia testowania często implementowana za pomocą narzędzi, takich jak Microsoft Fakes, gdzie testowany kod jest oddzielony od pozostałej części aplikacji. Ta separacja jest osiągana przez zastąpienie części aplikacji, które wchodzą w interakcję z kodem testowym za pomocą wycinków lub podkładek. Są to małe fragmenty kodu kontrolowane przez testy, które symulują zachowanie rzeczywistych części, które zastępują.

Zaletą tego podejścia jest to, że pozwala skupić się na testowaniu określonych funkcji kodu w izolacji. Jeśli test zakończy się niepowodzeniem, wiadomo, że przyczyna znajduje się w izolowanym kodzie, a nie w innym miejscu. Ponadto użycie wycinków i podkładek udostępnianych przez firmę Microsoft Fakes umożliwia przetestowanie kodu, nawet jeśli inne części aplikacji jeszcze nie działają.

Wymagania

Uwaga

Profilowanie za pomocą programu Visual Studio nie jest dostępne dla testów korzystających z aplikacji Microsoft Fakes.

Rola fakes firmy Microsoft w izolacji kodu

Microsoft Fakes odgrywa kluczową rolę w izolacji kodu, zapewniając dwa mechanizmy - wycinki i podkładki.

  • Wycinki: są one używane do zastępowania klasy małym zamiennikiem, który implementuje ten sam interfejs. Wymaga to zaprojektowania aplikacji tak, aby każdy składnik był zależny tylko od interfejsów, a nie od innych składników.

  • Podkładki: służą do modyfikowania skompilowanego kodu aplikacji w czasie wykonywania. Zamiast wywoływać określoną metodę, aplikacja uruchamia kod podkładki, który udostępnia test. Podkładki mogą zastępować wywołania zestawów, których nie można modyfikować, takich jak zestawy platformy .NET.

Zazwyczaj wycinki są używane do wywołań w rozwiązaniu programu Visual Studio i podkładek dla wywołań do innych zestawów, do których odwołuje się odwołanie. Jest to spowodowane tym, że w rozwiązaniu dobrym rozwiązaniem jest oddzielenie składników przez zdefiniowanie interfejsów w taki sposób, w jaki wymaga odcięcie. Jednak zestawy zewnętrzne często nie są dostarczane z oddzielnymi definicjami interfejsu, więc zamiast tego są używane podkładki.

Diagram that show Fakes replacing other components.

Rekomendacje kiedy używać wycinków

Wycinki są zwykle używane w przypadku wywołań w rozwiązaniu programu Visual Studio, ponieważ dobrym rozwiązaniem jest oddzielenie składników przez zdefiniowanie interfejsów w sposób wymagany przez odcięcie. Jednak zestawy zewnętrzne, takie jak System.dll, zwykle nie są dostarczane z oddzielnymi definicjami interfejsu, więc podkładki będą używane w tych przypadkach.

Używanie wycinków polega na projektowaniu aplikacji, tak aby różne składniki nie zależały od siebie, ale tylko w przypadku definicji interfejsu. To oddzielenie sprawia, że aplikacja jest bardziej niezawodna i elastyczna i umożliwia łączenie składnika testowego z implementacjami wycinków interfejsów na potrzeby testowania.

W praktyce można wygenerować typy wycinków z definicji interfejsu w programie Visual Studio, a następnie zastąpić rzeczywisty składnik wycinkiem w teście.

Rekomendacje kiedy używać podkładek

Podczas gdy wycinki są używane do wywołań w rozwiązaniu programu Visual Studio, podkładki są zwykle używane do wywołań do innych zestawów, do których się odwołujesz. Wynika to z faktu, że zestawy zewnętrzne, takie jak System.dll, zwykle nie są dostarczane z oddzielnymi definicjami interfejsu, dlatego zamiast tego należy używać podkładek.

Istnieją jednak pewne czynniki, które należy wziąć pod uwagę podczas korzystania z podkładek:

Wydajność: podkładki działają wolniej, ponieważ ponownie zapiszą kod w czasie wykonywania. Wycinki nie mają tego obciążenia związanego z wydajnością i są tak szybkie, jak metody wirtualne mogą być uruchamiane.

Metody statyczne, zapieczętowane typy: do implementowania interfejsów można używać tylko wycinków. W związku z tym typy wycinków nie mogą być używane dla metod statycznych, metod niewirtuatycznych, zapieczętowanych metod wirtualnych, metod w typach zapieczętowanych itd.

Typy wewnętrzne: Zarówno wycinki, jak i podkładki mogą być używane z typami wewnętrznymi, które są dostępne za pomocą atrybutu InternalsVisibleToAttributezestawu .

Metody prywatne: podkładki mogą zastępować wywołania metod prywatnych, jeśli wszystkie typy sygnatury metody są widoczne. Wycinki mogą zastępować tylko widoczne metody.

Interfejsy i metody abstrakcyjne: wycinki zapewniają implementacje interfejsów i abstrakcyjnych metod, które mogą być używane podczas testowania. Podkładki nie mogą instrumentować interfejsów i metod abstrakcyjnych, ponieważ nie mają treści metod.


Przenoszenie aplikacji Microsoft Fakes w programie .NET Framework do projektów w stylu zestawu SDK

Przejście projektów testowych programu .NET Framework, które używają platformy Microsoft Fakes do projektów .NET Framework w stylu zestawu SDK, .NET Core lub .NET 5+.

Do przejścia na platformę .NET Core lub .NET 5.0 będą potrzebne minimalne zmiany w programie .NET Framework skonfigurowanym dla platformy Microsoft Fakes. Przypadki, które należy wziąć pod uwagę, to:

  • Jeśli używasz niestandardowego szablonu projektu, musisz upewnić się, że jest to styl zestawu SDK i kompilacje dla zgodnej platformy docelowej.

  • Niektóre typy istnieją w różnych zestawach w programach .NET Framework i .NET Core/.NET 5.0 (na przykład System.DateTime wmscorlibSystem/programie .NET Framework i System.Runtime na platformie .NET Core i .NET 5.0), a w tych scenariuszach należy zmienić fałszywy zestaw.

  • Jeśli masz odwołanie do zestawu fakes i projektu testowego, może zostać wyświetlone ostrzeżenie kompilacji dotyczące brakującego odwołania podobnego do:

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

    To ostrzeżenie wynika z niezbędnych zmian wprowadzonych w pokoleniu Fakes i można je zignorować. Można go uniknąć, usuwając odwołanie do zestawu z pliku projektu, ponieważ teraz niejawnie dodajemy je podczas kompilacji.

Uruchamianie testów firmy Microsoft Fakes

Tak długo, jak zestawy Microsoft Fakes są obecne w skonfigurowanym FakesAssemblies katalogu (wartość $(ProjectDir)FakesAssembliesdomyślna), można uruchamiać testy przy użyciu zadania vstest.

Testowanie rozproszone za pomocą zadań vstest .NET Core i .NET 5+ przy użyciu programu Microsoft Fakes wymaga programu Visual Studio 2019 Update 9 (wersja zapoznawcza 20201020-06 ) i nowszych.

Zgodność i obsługa aplikacji Microsoft Fakes w różnych wersjach platformy .NET i programu Visual Studio

Microsoft Fakes w starszych projektach przeznaczonych dla platformy .NET Framework (bez zestawu SDK).

  • Generowanie zestawów Microsoft Fakes jest obsługiwane w programie Visual Studio Enterprise 2015 i nowszych wersjach.
  • Testy Microsoft Fakes mogą być uruchamiane ze wszystkimi dostępnymi pakietami NuGet Microsoft.TestPlatform.
  • Pokrycie kodu jest obsługiwane w przypadku projektów testowych korzystających z programu Microsoft Fakes w programie Visual Studio Enterprise 2015 lub nowszym.

Microsoft Fakes w projektach .NET Framework w stylu zestawu SDK, .NET Core i .NET 5.0 lub nowszych

  • Wersja zapoznawcza generacji zestawów Microsoft Fakes jest dostępna w programie Visual Studio Enterprise 2019 Update 6 i jest domyślnie włączona w aktualizacji Update 8.
  • Testy microsoft Fakes dla projektów przeznaczonych dla platformy .NET Framework mogą być uruchamiane ze wszystkimi dostępnymi pakietami NuGet Microsoft.TestPlatform.
  • Testy aplikacji Microsoft Fakes dla projektów przeznaczonych dla platform .NET Core i .NET 5.0 lub nowszych mogą być uruchamiane przy użyciu pakietów NuGet Microsoft.TestPlatform w wersjach 16.9.0-preview-20210106-01 i nowszych.
  • Pokrycie kodu jest obsługiwane w przypadku projektów testowych przeznaczonych dla platformy .NET Framework przy użyciu programu Microsoft Fakes w programie Visual Studio Enterprise w wersji 2015 lub nowszej.
  • Obsługa pokrycia kodu dla projektów testowych przeznaczonych dla platform .NET Core i .NET 5.0 lub nowszego przy użyciu programu Microsoft Fakes jest dostępna w programie Visual Studio 2019 update 9 lub nowszym.