Udostępnij za pośrednictwem


Korzystanie z pokrycia kodu do określania, jaka część kodu jest poddawana testom

Aby określić, jaka część kodu projektu jest faktycznie testowana przez zakodowane testy, takie jak testy jednostkowe, można użyć funkcji pokrycia kodu programu Visual Studio.Aby skutecznie zabezpieczyć się przed błędami, testy powinny obejmować lub pokrywać znaczną część kodu.

Analizy pokrycia kodu mogą dotyczyć zarówno kodów zarządzanych (CLI), jak i niezarządzanych (natywnych).

Pokrycie kodu jest opcją w przypadku uruchamiania metod testowych przy użyciu Eksploratora testów.Tabela wyników zawiera procent kodu, który został uruchomiony w każdym zestawie, każdej klasie i metodzie.Ponadto edytor źródła zawiera kod, który został przetestowany.

Wyniki pokrycie kodu z widział

Wymagania

  • Visual Studio Ultimate, Visual Studio Premium

Analizowanie pokrycia kodu w ramach testów jednostkowych w Eksploratorze testów

  1. W menu Test wybierz polecenie Analizuj pokrycie kodu.

  2. Aby zobaczyć, które wiersze zostały uruchomione, wybierz polecenie Pokaż ikonę widział pokrycie koduPokaż kolorowanie pokrycia kodu.

    Aby zmienić kolory lub użyć pogrubionej czcionki, wybierz polecenie Narzędzia, Opcje, Środowisko, Czcionki i kolory, Pokaż ustawienia dla: Edytor tekstu.W obszarze Wyświetl elementy dopasuj pokrycie.

  3. Jeśli wyniki wykażą niewielkie pokrycie, zbadaj części kodu, które nie są wykonywane, i napisz więcej testów, aby je pokryć.Zespoły deweloperów zazwyczaj dążą do około 80% pokrycia kodu.W niektórych sytuacjach dopuszczalne jest niższe zapotrzebowanie.Niższe zapotrzebowanie jest dopuszczalne np. tam, gdzie dany kod jest generowany na podstawie standardowego szablonu.

PoradaPorada

Aby uzyskać dokładne wyniki:

  • Upewnij się, że optymalizacja kompilatora jest wyłączona.

    Pracując z kodem niezarządzanym (natywnym), należy użyć kompilacji debugowania.

  • Upewnij się, że pliki .pdb (symbol) są generowane dla każdego zestawu.

Jeśli nie uda się uzyskać oczekiwanych wyników, zobacz sekcję Pokrycie kodu — wyszukiwanie błędów. .Nie można zapominać o ponownym uruchomieniu pokrycia kodu po jego aktualizacji.Wyniki pokrycia i kolorowanie kodu nie są automatycznie aktualizowane po zmodyfikowaniu kodu ani po uruchomieniu testów.

Raportowanie w blokach i wierszach

Pokrycie kodu jest liczone w blokach.Blok jest fragmentem kodu z dokładnie jednym punktem wejścia i wyjścia. Jeżeli przepływ kontroli programu przechodzi przez blok podczas uruchamiania testu, blok jest zaliczany do pokrytych.To, ile razy użyto danego bloku, nie ma wpływu na wynik.

Można również uzyskać wyniki wyświetlane w postaci wierszy, wybierając polecenie Dodaj/Usuń kolumny w nagłówku tabeli.Jeżeli uruchomiony test sprawdził wszystkie bloki kodu w każdym jego wierszu, liczy się to jako jeden wiersz.W przypadku gdy wiersz zawiera bloki kodu, które były sprawdzane, oraz takie, które nie były, jest liczony jako wiersz częściowy.

Niektórzy użytkownicy preferują liczbę wierszy, ponieważ wartości procentowe ściślej odpowiadają rozmiarowi fragmentów, które widać w kodzie źródłowym.Duży blok obliczeń jest traktowany jako pojedynczy, nawet jeśli zajmuje wiele wierszy.

Zarządzanie wynikami pokrycia kodu

Okno Wyniki pokrycia kodu zwykle przedstawia najnowszy wynik uruchomionych testów.Wyniki będą się różnić, jeśli zmienisz ich dane lub za każdym razem uruchomisz tylko niektóre z testów.

Okno pokrycia kodu może służyć również do wyświetlania poprzednich wyników lub wyników uzyskanych na innych komputerach.

Można scalać wyniki kilku uruchomień, na przykład tych, które używają różnych danych testowych.

  • Aby wyświetlić poprzedni zestaw wyników, wybierz go z menu rozwijanego.W menu pojawia się tymczasowa lista, która jest czyszczona po otwarciu nowego rozwiązania.

  • Aby wyświetlić wyniki z poprzednich sesji, wybierz polecenie Importuj wyniki pokrycia kodu, przejdź do folderu TestResults w danym rozwiązaniu i zaimportuj plik .coverage.

    Kolorowanie pokrycia może być niepoprawne, jeśli kod źródłowy zmienił się od czasu wygenerowania pliku .coverage.

  • Aby wyniki były czytelne jak tekst, wybierz polecenie Eksportuj wyniki pokrycia kodu.Spowoduje to wygenerowanie pliku .coveragexml, który można odczytać. Można go też przetwarzać z innymi narzędziami lub łatwo wysłać pocztą.

  • Aby wysłać wyniki do kogoś innego, wyślij plik .coverage lub wyeksportowany plik .coveragexml.Następnie można zaimportować plik.Jeśli mają one tę samą wersję kodu źródłowego, mogą odczytać kolorowanie pokrycia.

Scalanie wyników z różnych tras

W niektórych sytuacjach, w zależności od danych testowych, używane będą różne bloki w kodzie.W związku z tym można wykorzystać wyniki z różnych testów.

Można na przykład założyć, że po uruchomieniu testu z wpisem „2” okaże się, że pokryto 50% określonej funkcji.Po uruchomieniu testu po raz drugi z wpisem „-2” widoczne kolorowanie pokrycia obejmie pozostałe 50% funkcji.Teraz należy scalić wyniki z dwóch testów, a raport i widok kolorowania pokrycia pokaże 100% pokrycia funkcji.

W tym celu użyj opcji Ikona przycisku Merge w oknie pokrycie koduScal wyniki pokrycia kodu.Można wybrać dowolną kombinację ostatnich uruchomień lub zaimportowanych wyników.Aby połączyć wyeksportowane wyniki, należy je najpierw zaimportować.

Użyj opcji Eksportuj wyniki pokrycia kodu, aby zapisać wyniki operacji scalania.

Ograniczenia w scalaniu

  • W przypadku scalania danych pokrycia z różnych wersji kodu wyniki są wyświetlane oddzielnie i nie są połączone.Aby uzyskać w pełni połączone wyniki, należy zastosować tę samą kompilację kodu, zmieniając tylko dane testowe.

  • W przypadku scalania pliku wyników, które zostały wyeksportowane, a następnie zaimportowane, wyniki można przeglądać tylko według wierszy, a nie bloków.Użyj polecenia Dodaj/Usuń kolumny, aby wyświetlić dane wiersza.

  • W przypadku scalania wyników z testów programu ASP.NET wyniki dla oddzielnych testów są wyświetlane, ale nie są połączone.Dotyczy to tylko samych artefaktów ASP.NET: wyniki dla innych zestawów zostaną połączone.

Wykluczanie elementów z wyników pokrycia kodu

Można chcieć wykluczyć określone elementy w kodzie z oceny pokrycia, jeśli np. kod jest generowany na podstawie szablonu tekstu.Dodaj atrybut System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage do dowolnego z następujących elementów kodu: class, struct, method, property, property setter lub getter, event.Należy zauważyć, że wykluczenie klasy nie wyklucza jej klas pochodnych.

Na przykład:

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

Wykluczanie elementów w Natywnym kodzie C++

Aby wykluczyć niezarządzane (natywne) elementy kodu C++:

#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)

Użyj następujących makr:

-
ExcludeFromCodeCoverage(ExclusionName, L"FunctionName");

ExcludeSourceFromCodeCoverage(ExclusionName, L"SourceFilePath");
  • ExclusionName jest dowolną unikatową nazwą.

  • FunctionName to w pełni kwalifikowana nazwa funkcji.Może ona zawierać symbole wieloznaczne.Aby na przykład wykluczyć wszystkie funkcje klasy, napisz MyNamespace::MyClass::*

  • SourceFilePath jest ścieżką lokalną lub UNC pliku .cpp.Może ona zawierać symbole wieloznaczne.Poniższy przykład wyłącza wszystkie pliki w określonym katalogu: \\MyComputer\Source\UnitTests\*.cpp

  • #include <CodeCoverage\CodeCoverage.h>

  • Miejsce wywołuje wyłączenie makr w globalnej przestrzeni nazw, nie w dowolnym obszarze nazw lub klasie.

  • Można umieścić wyłączenia w pliku kodu testu jednostkowego lub w pliku kodu aplikacji.

  • Wykluczenia muszą zostać skompilowane jako kod niezarządzany (natywny) przez ustawienie opcji kompilatora albo za pomocą #pragma managed(off).

[!UWAGA]

Aby wyłączyć funkcje w kodzie C++/CLI, zastosuj do funkcji atrybut [System::Diagnostics::CodeAnalysis::ExcludeFromCodeCoverage].To jest tak samo jak w języku C#.

Włączanie lub wyłączanie dodatkowych elementów

Analizy pokrycia kodu są wykonywane tylko na zestawach, które są ładowane i dla których plik .pdb jest dostępny w tym samym katalogu co plik .exe lub .dll.Dlatego w pewnych okolicznościach można rozszerzyć zbiór zestawów, włączony przez uzyskanie kopii odpowiednich plików .pdb.

Można zwiększyć kontrolę nad tym, które zespoły i elementy są zaznaczone dla analizy pokrycia kodu przez napisanie pliku .runsettings.Można np. wykluczyć zestawy określonego typu bez konieczności dodawania atrybutów do ich klas.Aby uzyskać więcej informacji, zobacz Dostosowywanie analizy pokrycia kodu.

Analizowanie pokrycia kodu w usłudze kompilacji

Podczas sprawdzania kodu testy będą uruchamiane na serwerze kompilacji, razem z innymi testami pozostałych członków zespołu. (Jeśli jeszcze tego nie ustawiono, zobacz sekcję Uruchamianie testów w procesie kompilacji). Analiza pokrycia kodu w usłudze kompilacji jest użyteczna, ponieważ zapewnia najbardziej aktualny i wszechstronny obraz pokrycia całego projektu.Zawiera także automatyczne testy systemu i inne zakodowane testy, których zwykle nie uruchamia się na komputerach deweloperskich.

  1. W programie Team Explorer otwórz menu Kompilacje, a następnie dodaj lub edytuj definicję kompilacji.

  2. Na stronie Proces rozwiń węzeł Testy automatyczne, Źródło testów, Parametry uruchomieniowe.Dla opcji Typ pliku ustawień uruchomienia wybierz ustawienie Pokrycie kodu włączone.

    Jeśli masz więcej niż jedną definicję źródła testów, powtórz ten krok dla każdej z nich.

    • Pole o nazwie Typ pliku ustawień uruchomienia nie istnieje.

      Pod węzłem Testy automatyczne wybierz Zestaw testu i przycisk wielokropka [...] na końcu wiersza.W oknie dialogowym Dodaj/Edytuj przebieg testowy w obszarze Moduł uruchamiający testy wybierz Visual Studio Test Runner.

Ustawianie definicji kompilacji pokrycie kodu

Po uruchomieniu kompilacji wyniki pokrycia kodu są dołączane do przebiegu testowego i pojawiają się w podsumowaniu kompilacji.

Analizowanie pokrycia kodu w wierszu polecenia

Aby uruchomić testy z wiersza polecenia, należy użyć narzędzia vstest.console.exe.Pokrycie kodu jest opcją tego narzędzia.Aby uzyskać więcej informacji, zobacz Opcje wiersza poleceń narzędzia VSTest.Console.exe.

  1. Uruchom wiersz polecenia programisty dla programu Visual Studio:

    W menu Start systemu Windows wybierz polecenie Wszystkie programy, Microsoft Visual Studio, Visual Studio Tools, Wiersz polecenia dla deweloperów.

  2. Uruchom:

    vstest.console.exe MyTestAssembly.dll /EnableCodeCoverage

Rozwiązywanie problemów

Jeśli nie widać wyników pokrycia kodu, zobacz Pokrycie kodu — wyszukiwanie błędów.

Zasoby zewnętrzne

Wskazówki

Testing for Continuous Delivery with Visual Studio 2012 – Chapter 2: Unit Testing: Testing the Inside (Testowanie dostarczania ciągłego w programie Visual Studio 2012 — rozdział 2: Testowanie jednostkowe: Testowanie wnętrza)

Zobacz też

Koncepcje

Dostosowywanie analizy pokrycia kodu

Pokrycie kodu — wyszukiwanie błędów

Weryfikowanie kodu przy użyciu testów jednostkowych