Bestimmen des Umfangs des zu testenden Codes mithilfe von Codeabdeckung

Wenn Sie den Anteil des Projektcodes ermitteln möchten, der in codierten Tests wie Komponententests tatsächlich getestet wird, verwenden Sie die Codeabdeckungsfunktion von Visual Studio.Um sich effektiv vor Fehlern zu schützen, sollten Sie die Tests für den Großteil Ihres Codes ausführen bzw. diesen "abdecken".

Die Codeabdeckungsanalyse kann sowohl in verwaltetem (CLI) als auch in nicht verwaltetem (systemeigenen) Code angewendet werden.

Sie sollten die Codeabdeckung verwenden, wenn Sie Testmethoden mit dem Test-Explorer ausführen.In der Ergebnistabelle wird der Prozentsatz des Codes angegeben, der in den einzelnen Assemblys, Klassen und Methoden ausgeführt wurde.Außerdem wird im Quellcode-Editor angezeigt, welcher Code getestet wurde.

Codeabdeckungsergebnisse mit Färbung

Anforderungen

  • Visual Studio Ultimate, Visual Studio Premium

So analysieren Sie die Codeabdeckung in Komponententests im Test-Explorer

  1. Wählen Sie im Menü Test die Option Codeabdeckung analysieren aus.

  2. Um anzuzeigen, welche Zeilen ausgeführt wurden, wählen Sie Symbol "Codeabdeckungsfärbung anzeigen"Codeabdeckungsfärbung anzeigen aus.

    Um die Farben zu ändern oder den Text fett formatiert anzuzeigen, wählen Sie Extras, Optionen, Umgebung, Schriftarten und Farben und Einstellungen anzeigen für: Text-Editor aus.Unter Elemente anzeigen können Sie die Abdeckungselemente anpassen.

  3. Wenn die Ergebnisse eine niedrige Abdeckung anzeigen, untersuchen Sie, welche Teile des Codes nicht ausgeführt werden, und schreiben Sie weitere Tests, um diese abzudecken.Entwicklungsteams streben normalerweise eine Codeabdeckung von ca. 80 % an.In einigen Situationen ist eine geringere Abdeckung akzeptabel.Beispielsweise ist eine geringere Abdeckung akzeptabel, wenn ein Teil des Codes aus einer Standardvorlage generiert wird.

TippTipp

So erhalten Sie genaue Ergebnisse:

  • Überprüfen Sie, ob Compileroptimierung deaktiviert ist.

    Wenn Sie mit nicht verwaltetem (systemeigenen) Code arbeiten, verwenden Sie einen Debugbuild.

  • Stellen Sie sicher, dass Sie für jede Assembly PDB-Dateien (Symboldateien) generieren.

Sollten Sie nicht die erwarteten Ergebnisse erhalten, finden Sie weitere Informationen unter Problembehandlung bei der Codeabdeckung. .Vergessen Sie nicht, die Codeabdeckung nach Aktualisierung des Codes erneut auszuführen.Abdeckungsergebnisse und Codefarbe werden nach Änderung des Codes oder der Ausführung von nicht automatisch aktualisiert.

Berichterstellung in Blöcken oder in Zeilen

Die Codeabdeckung wird in Blöcken gezählt.Ein Block ist ein Stück Code mit genau einem Einstiegs- und Endpunkt. Wenn die Ablaufsteuerung des Programms einen Block während eines Testlaufs durchläuft, wird dieser Block als abgedeckt gezählt.Wie oft der Block verwendet wird, hat keinen Einfluss auf das Ergebnis.

Die Ergebnisse können auch auf Zeilen bezogen angezeigt werden, wenn Sie in der Tabellenkopfzeile Spalten hinzufügen/entfernen auswählen.Werden im Testlauf alle Codeblöcke einer beliebigen Codezeile ausgeführt, zählt dies als eine Zeile.Wenn eine Zeile Codeblöcke enthält, von denen einige ausgeführt werden und andere nicht, zählt dies als Teilzeile.

Manche Benutzer bevorzugen die Zählung in Zeilen, da die Prozentsätze genauer der Größe der Fragmente entsprechen, die im Quellcode angezeigt werden.Ein langer Block mit Berechnungen zählt als ein einzelner Block, selbst wenn er viele Zeilen einnimmt.

Verwalten von Codeabdeckungsergebnissen

Im Fenster "Codeabdeckungsergebnisse" wird normalerweise das Ergebnis der letzten Ausführung angezeigt.Die Ergebnisse ändern sich, wenn Sie die Testdaten ändern oder jeweils nur einige Tests ausführen.

Das Fenster "Codeabdeckung" kann auch zur Anzeige von vorherigen Ergebnissen oder von Ergebnissen verwendet werden, die über andere Computer abgerufen wurden.

Sie können die Ergebnisse aus mehreren Testläufen zusammenführen, zum Beispiel aus Testläufen, in denen unterschiedliche Testdaten verwendet werden.

  • Um ein vorheriges Resultset aufzurufen, wählen Sie dieses aus dem Dropdownmenü aus.Das Menü enthält eine temporäre Liste, die gelöscht wird, wenn Sie eine neue Projektmappe öffnen.

  • Um Ergebnisse aus einer vorherigen Sitzung aufzurufen, wählen Sie Codeabdeckungsergebnisse importieren aus, navigieren Sie zum Ordner "TestResults" in der Projektmappe, und importieren Sie eine COVERAGE-Datei.

    Die Codeabdeckungsfärbung ist möglicherweise falsch, wenn der Quellcode nach Generieren der COVERAGE-Datei geändert wurde.

  • Um die Ergebnisse als Text lesbar zu machen, wählen Sie Codeabdeckungsergebnisse exportieren aus.Dadurch wird eine lesbare COVERAGEXML-Datei generiert, die mit anderen Tools verarbeitet oder problemlos in einer E-Mail gesendet werden kann.

  • Um Ergebnisse an eine andere Person weiterzuleiten, senden Sie dieser entweder eine COVERAGE-Datei oder eine exportierte COVERAGEXML-Datei.Die Datei kann dann importiert werden.Verfügt die andere Person über dieselbe Version des Quellcodes, kann sie die Abdeckungsfärbung sehen.

Zusammenführen von Ergebnissen aus verschiedenen Ausführungen

In einigen Situationen werden abhängig von den Testdaten andere Blöcke im Code verwendet.Daher sollten Sie die Ergebnisse aus verschiedenen Testläufen kombinieren.

Bei einem Test mit der Eingabe "2 " stellen Sie beispielsweise fest, dass 50 % einer bestimmten Funktion abgedeckt werden.Wenn Sie den Test ein zweites Mal mit der Eingabe "– 2 " ausführen, sehen Sie in der Ansicht der Abdeckungsfärbung, dass die anderen 50 % der Funktion abgedeckt werden.Führen Sie nun die Ergebnisse aus den zwei Testläufen zusammen. Die Berichtsansicht und die Ansicht der Abdeckungsfärbung zeigen nun an, dass 100 % der Funktion ausgeführt wurden.

Führen Sie dies mithilfe der Option Symbol für Schaltfläche "Zusammenführen" im Fenster "Codeabdeckung"Codeabdeckungsergebnisse zusammenführen durch.Sie können eine beliebige Kombinationen aus den letzten Testläufen oder aus importierten Ergebnissen auswählen.Wenn Sie exportierte Ergebnisse kombinieren möchten, müssen Sie diese zuerst importieren.

Speichern Sie die Ergebnisse eines Zusammenführungsvorgangs mithilfe der Option Codeabdeckungsergebnisse exportieren.

Einschränkungen beim Zusammenführen

  • Wenn Sie Abdeckungsdaten aus verschiedenen Versionen desselben Codes zusammenführen, werden die Ergebnisse separat dargestellt und sind nicht kombiniert.Um vollständig kombinierte Ergebnisse zu erhalten, verwenden Sie denselben Build des Codes, und ändern Sie nur die Testdaten.

  • Wenn Sie eine Ergebnisdatei zusammenführen, die exportiert und anschließend importiert wurde, können Sie die Ergebnisse nur nach Zeilen und nicht nach Blöcken anzeigen.Verwenden Sie den Befehl Spalten hinzufügen/entfernen, um die Zeilendaten anzuzeigen.

  • Wenn Sie Ergebnisse aus Tests für ein ASP.NET-Projekt zusammenführen, werden die Ergebnisse für die separaten Tests angezeigt und sind nicht kombiniert.Dies gilt nur für ASP.NET-Artefakte selbst: Die Ergebnisse für alle anderen Assemblys werden kombiniert dargestellt.

Ausschließen von Elementen aus den Codeabdeckungsergebnissen

Sie können bestimmte Elemente im Code aus den Abdeckungsergebnissen ausschließen, zum Beispiel, wenn der Code aus einer Textvorlage generiert wird.Fügen Sie das System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage-Attribut zu einem der folgenden Codeelemente hinzu: Klasse, Struktur, Methode, Eigenschaft-Setter oder -Getter oder Ereignis.Beachten Sie, dass durch das Ausschließen einer Klasse nicht deren abgeleitete Klassen ausgeschlossen werden.

Beispiel:

using System.Diagnostics.CodeAnalysis; 
...
public class ExampleClass1
{ 
    [ExcludeFromCodeCoverage]
    void ExampleMethod() {...}

    [ExcludeFromCodeCoverage] // exclude property
    int ExampleProperty1 
    { get {...} set{...}}

    int ExampleProperty2
    {
        get
        {
            ...
        }
        [ExcludeFromCodeCoverage] // exclude setter
        set
        {
            ...
        }
    }
 
}
[ExcludeFromCodeCoverage]
class ExampleClass2 { ... }
Imports System.Diagnostics.CodeAnalysis


Class ExampleClass1        
    <ExcludeFromCodeCoverage()>
    Public Sub ExampleSub1()
        ...
    End Sub

    ' Exclude property
    < ExcludeFromCodeCoverage()>
    Property ExampleProperty1 As Integer
        ...
    End Property

    ' Exclude setter
    Property ExampleProperty2 As Integer
        Get
            ...
        End Get
        <ExcludeFromCodeCoverage()>
        Set(ByVal value As Integer)
            ...
        End Set
    End Property
End Class

<ExcludeFromCodeCoverage()>
Class ExampleClass2
...
End Class
// A .cpp file compiled as managed (CLI) code.
using namespace System::Diagnostics::CodeAnalysis;
...
public ref class ExampleClass1
{
  public:
    [ExcludeFromCodeCoverage]
    void ExampleFunction1() { ... }
    
    [ExcludeFromCodeCoverage]
    property int ExampleProperty2 {...}

    property int ExampleProperty2 {
      int get() { ... }
     [ExcludeFromCodeCoverage]
      void set(int value) { ...  }
   }

}

[ExcludeFromCodeCoverage]
public ref class ExampleClass2
{ ... }

Ausschließen von Elementen im systemeigenen C++-Code

So schließen Sie nicht verwaltete (systemeigene) Elemente im C++-Code aus:

#include <CodeCoverage\CodeCoverage.h>
...

// Exclusions must be compiled as unmanaged (native):
#pragma managed(push, off)

// Exclude a particular function:
ExcludeFromCodeCoverage(Exclusion1, L"MyNamespace::MyClass::MyFunction");

// Exclude all the functions in a particular class:
ExcludeFromCodeCoverage(Exclusion2, L"MyNamespace::MyClass2::*");

// Exclude all the functions generated from a particular template: 
ExcludeFromCodeCoverage(Exclusion3, L"*::MyFunction<*>"); 


// Exclude all the code from a particular .cpp file:
ExcludeSourceFromCodeCoverage(Exclusion4, L"*\\unittest1.cpp");

// After setting exclusions, restore the previous managed/unmanaged state:
#pragma managed(pop)

Verwenden Sie folgende Makros:

-
ExcludeFromCodeCoverage(ExclusionName, L"FunctionName");

ExcludeSourceFromCodeCoverage(ExclusionName, L"SourceFilePath");
  • ExclusionName ist ein beliebiger eindeutiger Name.

  • FunctionName ist ein vollqualifizierter Funktionsname.Er enthält möglicherweise Platzhalter.Um beispielsweise alle Funktionen einer Klasse auszuschließen, schreiben Sie MyNamespace::MyClass::*

  • SourceFilePath ist der lokale oder UNC-Pfad einer CPP-Datei.Er enthält möglicherweise Platzhalter.Im folgenden Beispiel werden alle Dateien in einem bestimmten Verzeichnis ausgeschlossen: \\MyComputer\Source\UnitTests\*.cpp

  • #include <CodeCoverage\CodeCoverage.h>

  • Platzaufrufe zu den Ausschlussmakros im globalen Namespace, nicht innerhalb eines Namespace oder einer Klasse.

  • Sie können die Ausschlüsse entweder in der Komponententestcodedatei oder in der Anwendungscodedatei platzieren.

  • Die Ausschlüsse müssen als nicht verwalteter (systemeigener) Code kompiliert werden, indem Sie entweder die Compileroption festlegen oder #pragma managed(off) verwenden.

HinweisHinweis

Um Funktionen in C++/CLI-Code auszuschließen, wenden Sie das Attribut [System::Diagnostics::CodeAnalysis::ExcludeFromCodeCoverage] auf die Funktion an.Dasselbe gilt für C#.

Ein- oder Ausschließen zusätzlicher Elemente

Die Codeabdeckungsanalyse wird nur für geladene Assemblys ausgeführt, für die eine PDB-Datei in demselben Verzeichnis verfügbar ist, in dem sich die DLL- oder EXE-Datei befindet.Daher können Sie in bestimmten Fällen den Satz der enthaltenen Assemblys erweitern, indem Sie Kopien der entsprechenden PDB-Dateien abrufen.

Sie können besser steuern, welche Assemblys und Elemente für die Codeabdeckungsanalyse ausgewählt werden, indem Sie eine RUNSETTINGS-Datei schreiben.Beispielsweise können Sie Assemblys bestimmter Arten ausschließen, ohne deren Klassen Attribute hinzuzufügen.Weitere Informationen finden Sie unter Anpassen der Codeabdeckungsanalyse.

Analysieren der Codeabdeckung im Builddienst

Wenn Sie Code einchecken, werden Ihre Tests zusammen mit allen anderen Tests von anderen Teammitgliedern auf dem Buildserver ausgeführt. (Wenn Sie dies noch nicht eingerichtet haben, finden Sie Informationen zur Einrichtung unter Ausführen von Testläufen im Buildprozess.) Es ist hilfreich, die Codeabdeckung für den Builddienst zu analysieren, da Sie dadurch das aktuellste und umfassendste Bild der Codeabdeckung für das gesamte Projekt erhalten.Dazu gehören auch automatisierte Systemtests und andere codierte Tests, die Sie normalerweise nicht auf Entwicklungscomputern ausführen.

  1. Öffnen Sie im Team Explorer Builds und fügen Sie dann eine Builddefinition hinzu oder bearbeiten Sie sie.

  2. Rufen Sie auf der Seite Prozess die Elemente Automatisierte Tests, Testquelle und Testlaufeinstellungen auf.Legen Sie die Option Codeabdeckung aktiviert für die Typ der Testlaufeinstellungen-Datei fest.

    Wenn Sie über mehrere Testquelldefinitionen verfügen, wiederholen Sie diesen Schritt für jede einzelne Definition.

    • Es ist jedoch kein Feld mit dem Namen Typ der Testlaufeinstellungen-Datei vorhanden.

      Wählen Sie Testassembly unter Automatisierte Tests, und klicken Sie auf die Schaltfläche mit den Auslassungspunkten [...] am Ende der Zeile.Wählen Sie unterhalb von Test Runner im Dialogfeld Testlauf hinzufügen/bearbeiten die Option Visual Studio Test Runner aus.

Festlegen der Builddefinition für Codeabdeckung

Nach Ausführung des Builds werden die Codeabdeckungsergebnisse an den Testlauf angefügt und in der Buildzusammenfassung angezeigt.

Analysieren der Codeabdeckung in einer Befehlszeile

Um Tests über die Befehlszeile auszuführen, verwenden Sie "vstest.console.exe".Die Codeabdeckung ist eine Option in diesem Hilfsprogramm.Weitere Informationen finden Sie unter Befehlszeilenoptionen für VSTest.Console.exe.

  1. Starten der Visual Studio Developer-Eingabeaufforderung:

    Wählen Sie im Windows-Menü Start nacheinander Alle Programme, Microsoft Visual Studio, Visual Studio-Tools und Developer-Eingabeaufforderung aus.

  2. Führen Sie Folgendes aus:

    vstest.console.exe MyTestAssembly.dll /EnableCodeCoverage

Problembehandlung

Wenn Sie keine Codeabdeckungsergebnisse sehen, finden Sie weitere Informationen unter Problembehandlung bei der Codeabdeckung.

Externe Ressourcen

Empfehlungen

Tests für fortlaufende Übermittlung mit Visual Studio 2012 – Kapitel 2: Komponententests – Interne Tests

Siehe auch

Konzepte

Anpassen der Codeabdeckungsanalyse

Problembehandlung bei der Codeabdeckung

Überprüfen von Code mithilfe von Komponententests