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 Resultaten van codedekking 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 ondervindt.
Wat moet je zien?
Als u een opdracht Codedekking analyseren kiest in het menu Testen en als de build en tests met succes worden 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 of oude resultaten te zien
U gebruikt niet de juiste versie van Visual Studio
U hebt Visual Studio Enterprise nodig.
Er zijn geen tests uitgevoerd
Analyse
Controleer het uitvoervenster. Kies in de vervolgkeuzelijst Uitvoer weergeven de optie Tests. Kijk of er waarschuwingen of fouten zijn geregistreerd.
Uitleg
Codedekkingsanalyse wordt uitgevoerd terwijl tests worden uitgevoerd. Het bevat alleen assembly's die in het geheugen worden geladen wanneer de tests worden uitgevoerd. Als geen van de tests wordt uitgevoerd, is er niets voor codedekking om te rapporteren.
Oplossing
Selecteer in Test Explorer de optie Alles uitvoeren om te controleren of de tests zijn uitgevoerd. Los eventuele fouten op voordat u Codedekking analyseren gebruikt.
U kijkt naar een eerder resultaat
Wanneer u uw tests wijzigt en opnieuw uitvoert, kan een eerder codedekkingsresultaat nog steeds zichtbaar zijn, inclusief de codekleuring van die oude uitvoering. Volg deze stappen om het probleem op te lossen:
- Voer 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 codedekkingsengine vereist dat elke assembly het bijbehorende .pdb-bestand toegankelijk heeft 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 uw build-instellingen het .pdb-bestand genereren.
Als de PDB-bestanden niet worden bijgewerkt wanneer het project wordt gebouwd, opent u de projecteigenschappen, selecteert u de pagina Bouwen , kiest u Geavanceerd en controleert u Foutopsporingsgegevens.
In Visual Studio 2022 en latere versies opent u voor C#-projecten die gericht zijn op .NET Core of .NET 5+, de projecteigenschappen, selecteert u het tabblad Bouwen , kiest u Algemeen en controleert u 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 geoptimaliseerd voor delen en publiceren (/DEBUG:FULL).
Als de bestanden .pdb en .dll of .exe zich op verschillende plaatsen bevinden, kopieert u het .pdb-bestand naar dezelfde map. Het is ook mogelijk om codedekkingsengine 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 Profile Guided Optimization, 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 voor beheerde of C++-code.
Uitleg
Codedekkingsanalyse in Visual Studio is alleen beschikbaar voor beheerde en systeemeigen (C++) code. 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 DataCollector in de projectnaam gebruiken, worden niet geïdentificeerd door codedekking.
Assembly is geïnstalleerd door NGen
Analyse
Bepaal of de assembly is 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. Niet verwerken met NGen.
Het aangepaste .runsettings-bestand heeft syntaxisproblemen
Analyse
Als u een aangepast .runettings-bestand gebruikt, kan dit een syntaxisfout bevatten. Codedekking wordt niet uitgevoerd en het venster codedekking wordt niet geopend aan het einde van de testuitvoering of het toont oude resultaten.
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 typen fouten:
XML-fout
Open het .runsettings-bestand in de XML-editor van Visual Studio. Zoek naar foutindicaties.
Fout met reguliere expressie
Elke tekenreeks in het bestand is een reguliere expressie. Controleer elk exemplaar op fouten en zoek in het bijzonder naar:
- Niet-overeenkomende haakjes (...) of niet-gebeeldlijnde haakjes \(...\). Als u een haakje in de zoekreeks wilt vinden, 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 overeenkomen, gebruikt u een punt gevolgd door een sterretje:
.*
- Niet-overeenkomende haakjes (...) of niet-gebeeldlijnde haakjes \(...\). Als u een haakje in de zoekreeks wilt vinden, moet u deze escapen. Als u bijvoorbeeld wilt overeenkomen met een functie, gebruikt u het volgende:
Aangepast .runettings-bestand met onjuiste uitsluitingen
Analyse
Als u een aangepast .runettings-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 .runsettings-bestand en verwijder vervolgens alle Exclude
knooppunten. Als het probleem hiermee is opgelost, plaatst u ze terug in fasen.
Zorg ervoor dat het knooppunt DataCollectors codedekking opgeeft. Vergelijk dit 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 elke 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 gedekt te zijn, wat meestal van toepassing is op statisch geladen assembly's.
Oplossing
Geen.