Delen via


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.

Schermopname van de resultaten van de codedekking met kleuring.

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:

  1. Voer Codedekking analyseren uit.
  2. 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: .*

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.

Verwijzingen