Risolvere i problemi di code coverage

Si applica a: Visual Studio

Lo strumento di analisi del code coverage in Visual Studio raccoglie i dati per assembly nativi e gestiti ( file.dll o .exe ). In alcuni casi, tuttavia, nella finestra Risultati code coverage viene visualizzato un errore simile a "Risultati vuoti generati: ....". Questo articolo consente di risolvere i vari motivi per cui potrebbero verificarsi risultati vuoti.

Cosa dovrebbe vedere?

Se si sceglie un comando Analizza code coverage dal menu Test e se la compilazione e i test vengono eseguiti correttamente, verrà visualizzato un elenco di risultati nella finestra Code Coverage . Potrebbe essere necessario espandere gli elementi per visualizzare i dettagli.

Screenshot che mostra i risultati del code coverage con la colorazione.

Per altre informazioni, vedere Usare il code coverage per determinare la quantità di codice da testare.

Possibili motivi per non visualizzare risultati o risultati obsoleti

Non si usa l'edizione corretta di Visual Studio

Hai bisogno di Visual Studio Enterprise.

Non sono stati eseguiti test

Analisi

Controllare la finestra di output. Nell'elenco a discesa Mostra output da scegliere Test. Verificare se sono presenti avvisi o errori registrati.

Spiegazione

L'analisi del code coverage viene eseguita durante l'esecuzione dei test. Include solo gli assembly caricati in memoria quando vengono eseguiti i test. Se nessuno dei test viene eseguito, non c'è nulla da segnalare per il code coverage.

Risoluzione

In Esplora test selezionare Esegui tutto per verificare che i test vengano eseguiti correttamente. Correggere eventuali errori prima di usare Analyze Code Coverage.

Si sta esaminando un risultato precedente

Quando si modificano ed eseguono di nuovo i test, un risultato di code coverage precedente può essere ancora visibile, inclusa la colorazione del codice da quella precedente esecuzione. Per risolvere il problema, seguire questa procedura:

  1. Eseguire Analyze Code Coverage.Run Analyze Code Coverage.
  2. Assicurarsi di aver selezionato il set di risultati più recente nella finestra Risultati code coverage .

I file con estensione pdb (simbolo) non sono disponibili

Analisi

Aprire la cartella di destinazione di compilazione (in genere bin\debug) e verificare che per ogni assembly sia presente un file con estensione pdb nella stessa directory del file .dll o .exe .

Spiegazione

Il motore di code coverage richiede che ogni assembly abbia il file PDB associato accessibile durante l'esecuzione del test. Se non è presente alcun file con estensione pdb per un assembly specifico, l'assembly non viene analizzato.

Il file con estensione pdb deve essere generato dalla stessa compilazione dei file .dll o .exe .

Risoluzione

Assicurarsi che le impostazioni di compilazione generino il file con estensione pdb .

  • Se i file con estensione pdb non vengono aggiornati al momento della compilazione del progetto, aprire le proprietà del progetto, selezionare la pagina Compilazione , scegliere Avanzate ed esaminare Informazioni di debug.

  • In Visual Studio 2022 e versioni successive, per i progetti C# destinati a .NET Core o .NET 5+, aprire le proprietà del progetto, selezionare la scheda Compila , scegliere Generale ed esaminare i simboli di debug.

  • Per i progetti C++, assicurarsi che i file con estensione pdb generati dispongano di informazioni di debug complete. Aprire le proprietà del progetto e verificare che l'opzione Generainformazioni di debugdel debug dellinker sia impostata su Genera informazioni di debug ottimizzate per la condivisione e la pubblicazione (/DEBUG:FULL).Open the project properties and verify that Linker> Debugging > Generate Debug Info is set to Generate Debug Information optimized for sharing and publishing (/DEBUG:FULL).

Se i file con estensione pdb e .dll o .exe si trovano in posizioni diverse, copiare il file con estensione pdb nella stessa directory. È anche possibile configurare il motore di code coverage per cercare i file con estensione pdb in un altro percorso. Per altre informazioni, vedere Personalizzare l'analisi del code coverage.

Viene usato un binario instrumentato o ottimizzato

Analisi

Determinare se il file binario è stato sottoposto a qualsiasi forma di ottimizzazione avanzata, ad esempio Ottimizzazione guidata profilo, o se è stato instrumentato da uno strumento di profilatura, ad esempio vsinstr.exe o vsperfmon.exe.

Spiegazione

Se un assembly è già stato instrumentato o ottimizzato da un altro strumento di profilatura, l'assembly viene omesso dall'analisi di code coverage. L'analisi del code coverage non può essere eseguita su tali assembly.

Risoluzione

Disattivare l'ottimizzazione e usare una nuova compilazione.

Il codice non è gestito (.NET) o nativo (C++)

Analisi

Determinare se si eseguono alcuni test nel codice gestito o C++.

Spiegazione

L'analisi del code coverage in Visual Studio è disponibile solo nel codice gestito e nativo (C++). Se si usano strumenti di terze parti, è possibile che il codice venga eseguito in una piattaforma diversa o in tutto o in parte.

Risoluzione

Nessuna disponibile.

Il nome del progetto include 'DataCollector'

I progetti che usano DataCollector nel nome del progetto non verranno identificati dal code coverage.

Assembly installato da NGen

Analisi

Determinare se l'assembly viene caricato dalla cache delle immagini native.

Spiegazione

Per motivi di prestazioni, gli assembly di immagini native non vengono analizzati. Per altre informazioni, vedere Ngen.exe (generatore di immagini native).For more information, seeNgen.exe (Native Image Generator).

Risoluzione

Usare una versione MSIL dell'assembly. Non elaborarlo con NGen.

Il file con estensione runsettings personalizzato presenta problemi di sintassi

Analisi

Se si usa un file con estensione runsettings personalizzato, potrebbe essere presente un errore di sintassi. Il code coverage non viene eseguito e la finestra di code coverage non viene aperta alla fine dell'esecuzione del test o mostra i risultati precedenti.

Spiegazione

È possibile eseguire gli unit test con un file con estensione runsettings personalizzato per configurare le opzioni di code coverage. Le opzioni consentono di includere o escludere file. Per altre informazioni, vedere Personalizzare l'analisi del code coverage.

Risoluzione

Esistono due possibili tipi di errori:

  • Errore XML

    Aprire il file con estensione runsettings nell'editor XML di Visual Studio. Cercare le indicazioni di errore.

  • Errore di espressione regolare

    Ogni stringa nel file è un'espressione regolare. Esaminare ognuno di essi per individuare gli errori e, in particolare, cercare:

    • Parentesi non corrispondenti (...) o parentesi senza caratteri di escape \(...\). Se si desidera trovare una corrispondenza tra parentesi nella stringa di ricerca, è necessario eseguirne l'escape. Ad esempio, per trovare una corrispondenza con una funzione, usare: .*MyFunction\(double\)
    • Asterisco o più all'inizio di un'espressione. Per trovare la corrispondenza con qualsiasi stringa di caratteri, usare un punto seguito da un asterisco: .*

File con estensione runsettings personalizzato con esclusioni non corrette

Analisi

Se si usa un file con estensione runsettings personalizzato, assicurarsi che includa l'assembly.

Spiegazione

È possibile eseguire gli unit test con un file con estensione runsettings personalizzato per configurare le opzioni di code coverage. Le opzioni consentono di includere o escludere file. Per altre informazioni, vedere Personalizzare l'analisi del code coverage.

Risoluzione

Rimuovere tutti i Include nodi dal file con estensione runsettings e quindi rimuovere tutti i Exclude nodi. Se questo risolve il problema, inserirli di nuovo in fasi.

Assicurarsi che il nodo DataCollectors specifichi code coverage. Confrontarlo con l'esempio in Personalizzare l'analisi del code coverage.

Alcuni codici vengono sempre visualizzati come non coperti

Il codice di inizializzazione nelle DLL native viene eseguito prima della strumentazione

Analisi

Nel codice nativo collegato in modo statico, parte della funzione di inizializzazione DllMain e del codice chiamato viene talvolta visualizzata come non coperta, anche se il codice è stato eseguito.

Spiegazione

Lo strumento di code coverage funziona inserendo la strumentazione in un assembly poco prima dell'avvio dell'esecuzione dell'applicazione. In qualsiasi assembly caricato in anticipo, il codice di inizializzazione in DllMain viene eseguito non appena viene caricato l'assembly e prima dell'esecuzione dell'applicazione. Tale codice sembra non essere trattato, che in genere si applica agli assembly caricati in modo statico.

Risoluzione

Nessuna.

Riferimenti