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

Aby określić, jaka część kodu projektu jest testowana przez kodowane testy, takie jak testy jednostkowe, możesz użyć funkcji pokrycia kodu programu Visual Studio. Aby skutecznie chronić przed usterkami, testy powinny wykonywać lub obejmować dużą część kodu.

Analiza pokrycia kodu jest możliwa zarówno w przypadku kodu zarządzanego (CLR) i niezarządzanego (natywnego). Obsługiwane są zarówno instrumentacja statyczna, jak i dynamiczna. Aby użyć pokrycia kodu w scenariuszach wiersza polecenia, użyj narzędzia vstest.console.exe lub Microsoft.CodeCoverage.Console, które jest rozszerzeniem dotnet-coverage, które obsługuje również kod natywny.

Opcja pokrycia kodu jest dostępna w menu Test po uruchomieniu metod testowych przy użyciu Eksploratora testów. W tabeli wyników przedstawiono procent kodu wykonanego w każdym zestawie, klasie i procedurze. Edytor źródłowy wyróżnia przetestowany kod. Wyniki można wyeksportować w popularnych formatach, takich jak Cobertura.

Wymagania

Funkcja pokrycia kodu jest dostępna tylko w programie Visual Studio Enterprise.

Uwaga

W przypadku pokrycia kodu platformy .NET można również użyć narzędzia wiersza polecenia dotnet-coverage.

Analizowanie pokrycia kodu

  1. W menu Test wybierz pozycję Analizuj pokrycie kodu dla wszystkich testów.

    Zrzut ekranu przedstawiający menu Test z wyróżnioną funkcją Analizuj pokrycie kodu.

    Zrzut ekranu przedstawiający menu Test z wyróżnioną funkcją Analizuj pokrycie kodu.

    Napiwek

    Pokrycie kodu można również uruchomić w oknie narzędzia Eksplorator testów.

  2. Po uruchomieniu testów, aby zobaczyć, które wiersze zostały uruchomione, wybierz pozycję Zrzut ekranu przedstawiający menu Analizowanie pokrycia kodu w programie Visual StudioPokaż kolorowanie pokrycia kodu w oknie Wyniki pokrycia kodu. Domyślnie kod, który jest objęty testami, jest wyróżniony jasnoniebieskim.

    Zrzut ekranu przedstawiający wyróżnione pokrycie kodu.

    Zrzut ekranu przedstawiający wyróżnione pokrycie kodu.

    Na liście rozwijanej opcji Pokaż kolorowanie pokrycia kodu można wybrać, czy kolorowanie ma zastosowanie do wierszy kodu, glifów na lewym marginesie, czy obu tych opcji.

  3. Aby zmienić kolory lub użyć pogrubionej twarzy, wybierz pozycję Narzędzia>Opcje>Czcionki środowiska>i Kolory>Pokaż ustawienia dla: Edytor tekstu. W obszarze Elementy wyświetlania dostosuj ustawienia elementów "Pokrycie", na przykład Pokrycie nie dotyczy obszaru.

    Zrzut ekranu przedstawiający czcionki i kolory pokrycia kodu

    Zrzut ekranu przedstawiający czcionki i kolory pokrycia kodu.

  4. Jeśli wyniki pokazują niskie pokrycie, sprawdź, które części kodu 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.

Napiwek

Aby zoptymalizować pokrycie kodu:

  • Wyłącz optymalizację kompilatora.
  • Jeśli pracujesz z kodem niezarządzanym (natywnym), użyj kompilacji debugowania.
  • Wygeneruj pliki .pdb (symbol) dla każdego zestawu.

Jeśli nie uzyskasz oczekiwanych wyników, zobacz Rozwiązywanie problemów z pokryciem kodu.

Nie zapomnij ponownie uruchomić pokrycia kodu po zaktualizowaniu kodu. Wyniki pokrycia i kolorowanie kodu nie są automatycznie aktualizowane po zmodyfikowaniu kodu ani uruchomieniu testów.

Napiwek

Począwszy od programu Visual Studio 2022 Update 2, możesz włączyć szybsze wyniki testu pokrycia kodu, wybierając pozycję Narzędzia Opcje środowiska w wersji zapoznawczej funkcje, a następnie wybierając ulepszenia środowiska pokrycia kodu, a następnie ponownie uruchamiając program Visual Studio.>>>

Raport w blokach lub wierszach

Pokrycie kodu jest liczone w blokach. Blok jest częścią kodu z dokładnie jednym wejściem i punktem wyjścia. Jeśli przepływ sterowania programu przechodzi przez blok podczas przebiegu testu, ten blok jest liowany jako objęty. Liczba użytych bloków nie ma wpływu na wynik.

Możesz również wyświetlić wyniki dla wierszy, wybierając pozycję Dodaj/Usuń kolumny w nagłówku tabeli. 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.

Napiwek

Wiersz kodu może zawierać więcej niż jeden blok kodu. Jeśli tak jest, a przebieg testu wykonuje ćwiczenia wszystkich bloków kodu w wierszu, jest liczone jako jeden wiersz. Jeśli niektóre, ale nie wszystkie bloki kodu w wierszu są wykonywane, jest liczone jako wiersz częściowy.

Filtrowanie wyników pokrycia kodu

Okno Wyniki pokrycia kodu zwykle pokazuje wynik dla całego rozwiązania. Wyniki można filtrować, aby wyświetlić wyniki tylko dla plików, które zostały zaktualizowane w bieżącej gałęzi.

  • Aby wyświetlić raport zestawu zmian, wybierz ikonę Konfiguruj widoki pokrycia kodu w oknie Wyniki pokrycia kodu. Następnie wybierz pozycję Raport zestawu zmian z listy rozwijanej Zawartość raportu. Zaktualizuj aktywne repozytorium i gałąź podstawową, aby porównać z nim, aby udostępnić raport porównawczy.

W polu wyszukiwania w oknie Wyniki pokrycia kodu istnieje kilka sposobów filtrowania raportu.

  • Aby wyszukać według nazwy (Pokaż tylko te, które pasują do ciągu wyszukiwania w oknie), wprowadź ciąg wyszukiwania w polu wyszukiwania.
  • Aby filtrować według typu , wprowadź nazwę typu w polu wyszukiwania.
  • Aby wyświetlić wszystkie wyczyść pole wyszukiwania.
  • Aby wyświetlić 100% w pełni pokryte, wprowadź tekst "Objęte (%Linie)":"100" w polu wyszukiwania.
  • Aby wyświetlić (0% i < 100%) częściowo pokryte, wprowadź tekst "Częściowo pokryte (>%Linie)":"<##" zastępując element ## wartością procentową.
  • Aby wyświetlić 0% pokryte, w polu wyszukiwania wprowadź tekst "Nieobjęte (%Linie)":"0".

Zarządzanie wynikami pokrycia kodu

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

Okno Wyniki pokrycia kodu może być również używane 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 poprzedniej sesji, wybierz pozycję Importuj wyniki pokrycia kodu, przejdź do folderu TestResults w rozwiązaniu i zaimportuj plik pokrycia .

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

  • Aby wyniki można było odczytać jako tekst, wybierz pozycję Eksportuj wyniki pokrycia kodu. Spowoduje to wygenerowanie czytelnego pliku coveragexml , który można przetworzyć za pomocą innych narzędzi lub łatwo wysłać pocztą. Możesz również wybrać formaty eksportu, takie jak Cobertura.

  • Aby wysłać wyniki do innej osoby, wyślij plik pokrycia 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.

Scal wyniki z różnych przebiegów

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 przebiegów 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 danymi wejściowymi "-2" zobaczysz w widoku kolorowania pokrycia, że pozostałe 50% funkcji jest objęte. Teraz scalisz wyniki z dwóch przebiegów testów, a widok kolorowania raportu i pokrycia pokazuje, że 100% funkcji zostało pokryte.

Użyj Ikona przycisku Scal w oknie Pokrycie kodu.wyników pokrycia kodu scalania, aby to zrobić. 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

  • Jeśli scalisz dane pokrycia z różnych wersji kodu, wyniki są wyświetlane oddzielnie, ale 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. To zachowanie dotyczy 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. System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute Dodaj atrybut do dowolnego z następujących elementów kodu: class, struct, method, property, property setter lub getter, event.

Napiwek

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

Użyj następujących makr:

ExcludeFromCodeCoverage(ExclusionName, L", nazwa funkcji");

ExcludeSourceFromCodeCoverage(ExclusionName, L"SourceFilePath");

  • ExclusionName to dowolna unikatowa nazwa.

  • 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 to ścieżka lokalna lub UNC pliku .cpp . Może ona zawierać symbole wieloznaczne. Poniższy przykład wyklucza 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ą być kompilowane jako kod niezarządzany (natywny), ustawiając opcję kompilatora lub przy użyciu polecenia #pragma managed(off).

Uwaga

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

Dołączanie lub wykluczanie dodatkowych elementów

Analiza pokrycia kodu jest wykonywana tylko na załadowanych zestawach i dla których plik .pdb jest dostępny w tym samym katalogu co plik .dll lub .exe . W związku z tym w niektórych okolicznościach można rozszerzyć zestawy dołączone przez pobranie kopii odpowiednich plików .pdb .

Możesz wykonać większą kontrolę nad tym, które zestawy i elementy są wybrane do analizy pokrycia kodu, pisząc plik .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 Azure Pipelines

Po zaewidencjonowanie kodu testy są uruchamiane na serwerze kompilacji wraz z testami od innych członków zespołu. Warto analizować pokrycie kodu w usłudze Azure Pipelines, aby uzyskać najbardziej aktualny i kompleksowy obraz pokrycia w całym projekcie. Pokrycie kodu w usłudze Azure Pipelines obejmuje również zautomatyzowane testy systemowe i inne kodowane testy, których zwykle nie uruchamiasz na maszynach deweloperskich.

Analizowanie pokrycia kodu z poziomu wiersza polecenia

Aby uruchomić testy z poziomu wiersza polecenia, użyj narzędzia vstest.console.exe . Pokrycie kodu jest opcją narzędzia vstest.console.exe wywoływanego przez /EnableCodeCoverage opcję.

  1. Uruchom wiersz polecenia dla deweloperów dla programu Visual Studio:

    W menu Start systemu Windows wyszukaj Developer Command Prompt for VS i wybierz wynik aplikacji skojarzony z tekstem wyszukiwania.

  2. W wierszu polecenia wpisz następujące polecenie:

    vstest.console.exe MyTestAssembly.dll /EnableCodeCoverage
    

    Napiwek

    W przypadku programu PowerShell dla deweloperów katalog początkowy powłoki to lokalizacja projektu programu Visual Studio. Zastąp MyTestAssembly.dll ścieżką i nazwą pliku testowego. Aby uzyskać więcej informacji, zobacz VSTest.Console.exe opcje wiersza polecenia.

Rozwiązywanie problemów

Jeśli nie widzisz wyników pokrycia kodu, może ci pomóc artykuł Rozwiązywanie problemów z pokryciem kodu.