Problemen met codedekking oplossen
Van toepassing op: Visual Studio
Het hulpprogramma voor codedekkingsanalyse in Visual Studio verzamelt gegevens voor systeemeigen en beheerde assembly's (.dll of .exe bestanden). In sommige gevallen wordt in het venster Codedekkingsresultaten echter een fout weergegeven die lijkt op 'Lege resultaten gegenereerd: ....'. Dit artikel helpt u bij het oplossen van problemen en het oplossen van de verschillende redenen waarom u mogelijk lege resultaten tegenkomt.
Wat zou je moeten zien?
Als u een opdracht Codedekking analyseren kiest in het menu Testen en als de build en tests zijn uitgevoerd, ziet u een lijst met resultaten in het venster Codedekking . Mogelijk moet u de items uitvouwen om de details te zien.
Zie Codedekking gebruiken om te bepalen hoeveel code wordt getest voor meer informatie.
Mogelijke redenen om geen resultaten of oude resultaten te zien
U gebruikt niet de juiste editie van Visual Studio
U hebt Visual Studio Enterprise nodig.
Er zijn geen tests uitgevoerd
Analyse
Controleer het uitvoervenster. Kies Tests in de vervolgkeuzelijst Uitvoer weergeven. Kijk of er waarschuwingen of fouten zijn vastgelegd.
Uitleg
Er wordt een codedekkingsanalyse uitgevoerd terwijl tests worden uitgevoerd. Het omvat alleen assembly's die in het geheugen worden geladen wanneer de tests worden uitgevoerd. Als geen van de tests wordt uitgevoerd, is er niets om codedekking te rapporteren.
Oplossing
Selecteer Alles uitvoeren in Test Explorer om te controleren of de tests zijn uitgevoerd. Los eventuele fouten op voordat u Codedekking analyseren gebruikt.
U bekijkt een vorig resultaat
Wanneer u uw tests wijzigt en opnieuw uitvoert, kan een eerder resultaat van de codedekking nog steeds zichtbaar zijn, inclusief de codekleuring van die oude uitvoering. Volg deze stappen om het probleem op te lossen:
- Voer De codedekking analyseren uit.
- Zorg ervoor dat u de meest recente resultatenset hebt geselecteerd in het venster Resultaten van codedekking .
.pdb-bestanden (symbool) zijn niet beschikbaar
Analyse
Open de doelmap compileren (meestal bin\debug) en controleer of er voor elke assembly een .pdb-bestand in dezelfde map staat als het .dll - of .exe-bestand .
Uitleg
De engine voor codedekking vereist dat elke assembly het bijbehorende .pdb-bestand heeft dat toegankelijk is tijdens de testuitvoering. Als er geen PDB-bestand voor een bepaalde assembly is, wordt de assembly niet geanalyseerd.
Het PDB-bestand moet worden gegenereerd op basis van dezelfde build als de .dll - of .exe-bestanden .
Oplossing
Zorg ervoor dat de build-instellingen het .pdb-bestand genereren.
Als de PDB-bestanden niet worden bijgewerkt wanneer het project is gemaakt, opent u de projecteigenschappen, selecteert u de pagina Opbouwen, kiest u Geavanceerd en inspecteert u foutopsporingsgegevens.
Open in Visual Studio 2022 en latere versies voor C#-projecten die gericht zijn op .NET Core of .NET 5+ de projecteigenschappen, selecteer het tabblad Build , kies Algemeen en inspecteer de symbolen voor foutopsporing.
Voor C++-projecten moet u ervoor zorgen dat de gegenereerde PDB-bestanden volledige foutopsporingsgegevens bevatten. Open de projecteigenschappen en controleer of Linker>Foutopsporingsgegevens> genereren is ingesteld op Foutopsporingsgegevens genereren die zijn geoptimaliseerd voor delen en publiceren (/DEBUG:FULL).
Als de .pdb - en .dll - of .exe-bestanden zich op verschillende plaatsen bevinden, kopieert u het .pdb-bestand naar dezelfde map. Het is ook mogelijk om de engine voor codedekking te configureren om te zoeken naar .pdb-bestanden op een andere locatie. Zie Analyse van codedekking aanpassen voor meer informatie.
Er wordt een geïnstrueerd of geoptimaliseerd binair bestand gebruikt
Analyse
Bepaal of het binaire bestand een vorm van geavanceerde optimalisatie heeft ondergaan, zoals Profielgestuurde optimalisatie, of is geïnstrueerd door een profileringsprogramma zoals vsinstr.exe of vsperfmon.exe.
Uitleg
Als een assembly al is geïnstrueerd of geoptimaliseerd door een ander profileringsprogramma, wordt de assembly weggelaten uit de codedekkingsanalyse. Codedekkingsanalyse kan niet worden uitgevoerd op dergelijke assembly's.
Oplossing
Schakel optimalisatie uit en gebruik een nieuwe build.
Code wordt niet beheerd (.NET) of systeemeigen (C++) code
Analyse
Bepaal of u een aantal tests uitvoert op beheerde of C++-code.
Uitleg
Analyse van codedekking in Visual Studio is alleen beschikbaar voor beheerde en systeemeigen code (C++). Als u met hulpprogramma's van derden werkt, kunnen sommige of alle code op een ander platform worden uitgevoerd.
Oplossing
Geen beschikbaar.
Projectnaam bevat 'DataCollector'
Projecten die Gebruikmaken van DataCollector in de projectnaam, worden niet geïdentificeerd door codedekking.
Assembly is geïnstalleerd door NGen
Analyse
Bepaal of de assembly wordt geladen vanuit de systeemeigen installatiekopieëncache.
Uitleg
Om prestatieredenen worden systeemeigen installatiekopieën niet geanalyseerd. Zie Ngen.exe (Native Image Generator) voor meer informatie.
Oplossing
Gebruik een MSIL-versie van de assembly. Verwerk het niet met NGen.
Het aangepaste .runsettings-bestand heeft syntaxisproblemen
Analyse
Als u een aangepast .runsettings-bestand gebruikt, kan dit een syntaxisfout bevatten. Codedekking wordt niet uitgevoerd en het venster voor codedekking wordt niet geopend aan het einde van de testuitvoering of er worden oude resultaten weergegeven.
Uitleg
U kunt uw eenheidstests uitvoeren met een aangepast .runsettings-bestand om opties voor codedekking te configureren. Met de opties kunt u bestanden opnemen of uitsluiten. Zie Analyse van codedekking aanpassen voor meer informatie.
Oplossing
Er zijn twee mogelijke soorten fouten:
XML-fout
Open het .runsettings-bestand in de XML-editor van Visual Studio. Zoek naar foutindicaties.
Fout in reguliere expressie
Elke tekenreeks in het bestand is een reguliere expressie. Bekijk elk item op fouten en zoek in het bijzonder naar:
- Niet-overeenkomende haakjes (...) of niet-gescaped haakjes \(...\). Als u een haakje in de zoekreeks wilt koppelen, moet u deze escapen. Als u bijvoorbeeld wilt overeenkomen met een functie, gebruikt u het volgende:
.*MyFunction\(double\)
- Sterretje of plusteken aan het begin van een expressie. Als u een tekenreeks wilt vergelijken, gebruikt u een punt gevolgd door een sterretje:
.*
- Niet-overeenkomende haakjes (...) of niet-gescaped haakjes \(...\). Als u een haakje in de zoekreeks wilt koppelen, moet u deze escapen. Als u bijvoorbeeld wilt overeenkomen met een functie, gebruikt u het volgende:
Aangepast .runsettings-bestand met onjuiste uitsluitingen
Analyse
Als u een aangepast .runsettings-bestand gebruikt, moet u ervoor zorgen dat het uw assembly bevat.
Uitleg
U kunt uw eenheidstests uitvoeren met een aangepast .runsettings-bestand om opties voor codedekking te configureren. Met de opties kunt u bestanden opnemen of uitsluiten. Zie Analyse van codedekking aanpassen voor meer informatie.
Oplossing
Verwijder alle Include
knooppunten uit het runettings-bestand en verwijder vervolgens alle Exclude
knooppunten. Als hiermee het probleem wordt opgelost, plaatst u deze terug in fasen.
Zorg ervoor dat het DataCollectors-knooppunt codedekking opgeeft. Vergelijk het met het voorbeeld in Analyse van codedekking aanpassen.
Sommige code wordt altijd weergegeven als niet gedekt
Initialisatiecode in systeemeigen DLL's wordt uitgevoerd vóór instrumentatie
Analyse
In statisch gekoppelde systeemeigen code wordt een deel van de initialisatiefunctie DllMain en code die wordt aangeroepen soms weergegeven als niet gedekt, ook al is de code uitgevoerd.
Uitleg
Het hulpprogramma voor codedekking werkt door instrumentatie in een assembly in te voegen net voordat de toepassing wordt uitgevoerd. In een assembly die vooraf is geladen, wordt de initialisatiecode in DllMain uitgevoerd zodra de assembly wordt geladen en voordat de toepassing wordt uitgevoerd. Deze code lijkt niet te worden gedekt, wat doorgaans van toepassing is op statisch geladen assembly's.
Oplossing
Geen.