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

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 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:

  1. Voer De 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 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: .*

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.

Verwijzingen