Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Code-isolatie is een teststrategie die vaak wordt geïmplementeerd met hulpprogramma's zoals Microsoft Fakes, waarbij de code die u test, wordt gescheiden van de rest van de toepassing. Deze scheiding wordt bereikt door delen van de applicatie die interageren met de code die wordt getest, te vervangen door stubs of shims. Dit zijn kleine stukjes code die worden beheerd door uw tests, die het gedrag simuleren van de werkelijke onderdelen die ze vervangen.
Het voordeel van deze aanpak is dat u zich kunt richten op het testen van de specifieke functionaliteit van de code in isolatie. Als een test mislukt, weet u dat de oorzaak zich in de geïsoleerde code bevindt en niet ergens anders. Daarnaast kunt u met het gebruik van stubs en shims, geleverd door Microsoft Fakes, uw code testen, zelfs als andere onderdelen van uw toepassing nog niet werken.
Requirements
- Visual Studio Enterprise
- Een .NET Framework-project
- .NET Core, .NET 5.0 of hoger en sdk-stijl projectondersteuning in Visual Studio 2019 en hoger. Zie Microsoft Fakes voor .NET Core- en SDK-projecten voor meer informatie.
Note
Profilering met Visual Studio is niet beschikbaar voor tests die gebruikmaken van Microsoft Fakes.
De rol van Microsoft Fakes in code-isolatie
Microsoft Fakes speelt een belangrijke rol in code-isolatie door twee mechanismen te bieden: stubs en shims.
Stubs: Deze worden gebruikt om een klasse te vervangen door een kleine vervanging die dezelfde interface implementeert. Hiervoor moet uw toepassing zodanig worden ontworpen dat elk onderdeel alleen afhankelijk is van interfaces, niet van andere onderdelen.
Shims: Deze worden gebruikt om de gecompileerde code van uw toepassing tijdens runtime te wijzigen. In plaats van een opgegeven methode aan te roepen, voert de toepassing de shim-code uit die uw test biedt. Shims kunnen aanroepen naar assemblies die u niet kunt wijzigen vervangen, zoals .NET-assemblies.
Stubs worden meestal gebruikt voor aanroepen binnen uw Visual Studio oplossing en shims voor aanroepen naar andere assembly's waarnaar wordt verwezen. Dit komt doordat het binnen uw oplossing een goede gewoonte is om de onderdelen te ontkoppelen door interfaces te definiëren op een manier die stubbing mogelijk maakt. Externe assembly's worden echter vaak niet geleverd met afzonderlijke interfacedefinities, dus in plaats daarvan worden shims gebruikt.
Aanbevelingen over wanneer stubs te gebruiken
Stubs worden doorgaans gebruikt voor aanroepen binnen uw Visual Studio oplossing, omdat het een goede gewoonte is om de onderdelen los te koppelen door interfaces te definiëren op de manier die stubbing vereist. Externe assemblies, zoals System.dll, zijn echter meestal niet beschikbaar met afzonderlijke interfacedefinities, dus worden in deze gevallen in plaats daarvan shims gebruikt.
Het gebruik van stubs omvat het ontwerpen van uw toepassing, zodat de verschillende onderdelen niet afhankelijk zijn van elkaar, maar alleen op interfacedefinities. Door deze ontkoppeling wordt de toepassing robuuster en flexibeler en kunt u het onderdeel dat wordt getest verbinden met stub-implementaties van de interfaces voor testdoeleinden.
In de praktijk kunt u stubtypen genereren op basis van de interfacedefinities in Visual Studio en vervolgens het echte onderdeel vervangen door de stub in uw test.
Aanbevelingen over wanneer shims te gebruiken
Hoewel stubs worden gebruikt voor aanroepen binnen uw Visual Studio oplossing, worden shims meestal gebruikt voor aanroepen naar andere assembly's waarnaar wordt verwezen. Dit komt doordat externe assembly's zoals System.dll meestal niet worden geleverd met afzonderlijke interfacedefinities, dus in plaats daarvan moeten shims worden gebruikt.
Er zijn echter enkele factoren die u moet overwegen bij het gebruik van shims:
Prestaties: Shims worden langzamer uitgevoerd omdat ze uw code tijdens runtime herschrijven. Stubs hebben deze overhead niet en zijn net zo snel als virtuele methoden.
Statische methoden, verzegelde typen: u kunt alleen stubs gebruiken om interfaces te implementeren. Stub-typen kunnen daarom niet worden gebruikt voor statische methoden, niet-virtuele methoden, verzegelde virtuele methoden, methoden in verzegelde typen, enzovoort.
Interne typen: Zowel stubs als shims kunnen worden gebruikt met interne typen die toegankelijk worden gemaakt met behulp van het assemblykenmerk InternalsVisibleToAttribute.
Privémethoden: Shims kunnen aanroepen naar privémethoden vervangen als alle typen van de methodehandtekening zichtbaar zijn. Stubs kunnen alleen zichtbare methoden vervangen.
Interfaces en abstracte methoden: Stubs bieden implementaties van interfaces en abstracte methoden die kunnen worden gebruikt bij het testen. Shims kunnen geen interfaces en abstracte methoden instrumenteren, omdat ze geen methode-lichamen hebben.
Migratie van Microsoft Fakes in .NET Framework naar projecten in SDK-stijl
Het overstappen van uw .NET Framework-testprojecten die gebruikmaken van Microsoft Fakes naar SDK-stijl .NET Framework, .NET Core of .NET 5+ projecten.
U hebt minimale wijzigingen nodig in uw .NET Framework dat is ingesteld voor Microsoft Fakes om over te stappen naar .NET Core of .NET 5.0. De gevallen waar u rekening mee moet houden, zijn:
Als u een aangepaste projectsjabloon gebruikt, moet u ervoor zorgen dat deze van het SDK-type is en is gebouwd voor een compatibel doelframework.
Bepaalde typen bestaan in verschillende assembly's in .NET Framework en .NET Core/.NET 5.0 (bijvoorbeeld
System.DateTimebestaat inSystem/mscorlibin .NET Framework, en inSystem.Runtimein .NET Core en .NET 5.0), en in deze scenario's moet u de assembly wijzigen die wordt vervalst.Als u een assemblyreferentie hebt naar een fakes-assembly en naar het testproject, ziet u mogelijk een buildwaarschuwing over een ontbrekende referentie, zoals:
(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.Deze waarschuwing is het gevolg van noodzakelijke wijzigingen die zijn aangebracht in het genereren van Fakes en kan worden genegeerd. Het kan worden vermeden door de assembly-verwijzing uit het projectbestand te verwijderen, omdat we deze nu impliciet toevoegen tijdens de build.
Microsoft Fakes tests uitvoeren
Zolang Microsoft Fakes assemblies aanwezig zijn in de geconfigureerde map FakesAssemblies (de standaardwaarde is $(ProjectDir)FakesAssemblies), kunt u tests uitvoeren met de vstest-taak.
Gedistribueerd testen met de vstest-taak voor .NET Core- en .NET 5+-projecten die Microsoft Fakes gebruiken, vereist Visual Studio 2019 Update 9 Preview 20201020-06 of hoger.
Compatibiliteit en ondersteuning voor Microsoft Fakes in verschillende .NET- en Visual Studio-versies
Microsoft Fakes in oudere projecten voor .NET Framework (niet-SDK-stijl).
- Microsoft Fakes assembly generatie wordt ondersteund in Visual Studio Enterprise 2015 en hoger.
- Microsoft Fakes tests kunnen worden uitgevoerd met alle beschikbare Microsoft. TestPlatform NuGet-pakketten.
- Codedekking wordt ondersteund voor testprojecten met behulp van Microsoft Fakes in Visual Studio Enterprise 2015 en hoger.
Microsoft Fakes in projecten in SDK-stijl voor .NET Framework, .NET Core en .NET 5.0 of hoger
- Microsoft Fakes-assemblygeneratie werd als preview geïntroduceerd in Visual Studio Enterprise 2019 Update 6 en is standaard ingeschakeld in Update 8.
- Microsoft Fakes-tests voor projecten die zijn gericht op .NET Framework kunnen worden uitgevoerd met alle beschikbare Microsoft.TestPlatform NuGet-pakketten.
- Microsoft neptests voor projecten die gericht zijn op .NET Core en .NET 5,0 of hoger, kunnen worden uitgevoerd met Microsoft. TestPlatform NuGet-pakketten met versies 16.9.0-preview-20210106-01 en hoger.
- Codedekking wordt ondersteund voor testprojecten die gericht zijn op .NET Framework met behulp van Microsoft Fakes in Visual Studio Enterprise-versie 2015 en hoger.
- Ondersteuning voor codedekking voor testprojecten gericht op .NET Core en .NET 5.0 of hoger met Microsoft Fakes is beschikbaar in Visual Studio update 9 en hoger van Visual Studio 2019.