Udostępnij za pośrednictwem


Użyj stopnia pokrycia kodu, aby określić, ile kodu jest testowane

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 testów za pomocą 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.

Notatka

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

Analizuj pokrycie kodu

  1. W menu Test wybierz opcję 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 eksploratora testów.

  2. Po uruchomieniu testów, aby zobaczyć, które wiersze zostały wykonane, wybierz "Pokaż kolorowanie pokrycia kodu" w oknie wyników 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, znaczników na lewym marginesie, czy obu elementów.

  3. Aby zmienić kolory lub użyć pogrubienia, wybierz Narzędzia Tools>Options>Environment>Fonts and Colors>Show settings for: Text Editor. W obszarze Wyświetlane elementydostosuj ustawienia dla elementów "Pokrycie", na przykład Pokrycie obszaru niezmienionego.

    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 programistyczne zazwyczaj dążą do osiągnięcia około 80% pokrycia kodu według standardu%. W niektórych sytuacjach dopuszczalne jest niższe pokrycie. Na przykład niższe pokrycie jest akceptowalne, gdy kod jest generowany na podstawie szablonu standardowego.

Napiwek

Aby zoptymalizować pokrycie kodu, wykonaj następujące kroki:

  • 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 uruchomić ponownie analizy 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 w wersji 17.2, możesz włączyć najnowsze funkcje pokrycia kodu, wybierając pozycję narzędzia Tools > Options > Environment > Preview Features, 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 liczony 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 odpowiadają bliżej rozmiarowi fragmentów widocznych w kodzie źródłowym. Długi blok obliczeń będzie liczony jako pojedynczy blok, 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 uruchamia wszystkie bloki kodu w wierszu, jest liczony jako jeden wiersz. Jeśli niektóre, ale nie wszystkie bloki kodu w wierszu są wykonywane, zostaje zaliczony jako wiersz częściowy.

Widoki wyników pokrycia kodu

Okno Wyniki pokrycia kodu zwykle strukturyzuje raport w hierarchii projektu/klasy/metody. Można to zmienić, aby wyświetlić pokrycie na poziomie katalogu/pliku/metody.

  • Aby wyświetlić źródłowy raport, wybierz ikonę Konfiguruj widoki pokrycia kodu w oknie Wyniki pokrycia kodu. Następnie wybierz widok źródłowy z listy rozwijanej Styl raportu.

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ą do porównania, aby udostępnić raport porównawczy.

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

  • Aby wyszukiwać według nazwy (Pokaż tylko te, które pasują do ciągu wyszukiwania w polu wyszukiwania), wprowadź ciąg tekstowy w polu wyszukiwania.
  • Aby Filtruj według typu wprowadź nazwę typu w polu wyszukiwania.
  • Aby pokazać wszystkie, wyczyść pole wyszukiwania.
  • Aby Pokaż 100% w pełni pokryte, wprowadź tekst "Objęte (%Lines)":"100" w polu wyszukiwania.
  • Aby Show (>0% && < 100%) było częściowo pokryte, wprowadź "Częściowo pokryte (%Lines)":"<##", zastępując ## odpowiednim procentem pokrycia.
  • Aby Pokaż 0% objęte, wprowadź ciąg "Nieobjęte (%Lines)":"0" w polu wyszukiwania.

Zarządzanie wynikami pokrycia kodu źródłowego

Okno Wyniki pokrycia kodu zazwyczaj pokazuje wynik ostatniego uruchomienia. Wyniki będą się różnić w przypadku zmiany danych testowych lub uruchomienia tylko niektórych testów za każdym razem.

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

Możesz scalić wyniki kilku przebiegów, na przykład z przebiegów korzystających z różnych danych testowych.

  • Aby wyświetlić poprzedni zestaw wyników, wybierz go z menu rozwijanego. Menu pokazuje listę tymczasową, która zostanie wyczyszczona po otwarciu nowego rozwiązania.

  • Aby wyświetlić wyniki z poprzedniej sesji, wybierz Importuj wyniki, przejdź do folderu TestResults w swoim 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 można było odczytać jako tekst, wybierz pozycję Eksportuj wyniki, wybierz pozycję .xml jako Zapisz jako typ. Spowoduje to wygenerowanie czytelnego pliku .xml, 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 .coverage lub wyeksportowany plik .xml. Następnie mogą zaimportować plik. Jeśli mają tę samą wersję kodu źródłowego, mogą zobaczyć kolorowanie pokrycia.

Scal wyniki z różnych przebiegów

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

Załóżmy na przykład, że po uruchomieniu testu z danymi wejściowymi "2", okaże się, że 50% określonej funkcji zostanie pokryte. Po uruchomieniu testu po raz drugi z danymi wejściowymi "-2" zobaczysz w widoku kolorów pokrycia, że pozostałe 50% funkcji jest pokryte. 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 ikony dla przycisku Scalania w oknie Pokrycia Kodu.scal wyniki, aby to zrobić. Możesz wybrać dowolną kombinację ostatnich przebiegów lub zaimportowanych wyników. Jeśli chcesz połączyć wyeksportowane wyniki, musisz najpierw je zaimportować.

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

Ograniczenia scalania

  • 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, użyj tej samej kompilacji kodu, zmieniając tylko dane testowe.

  • Jeśli scalisz plik wyników, który został wyeksportowany, a następnie zaimportowany, możesz wyświetlać wyniki tylko według wierszy, a nie według bloków. Użyj polecenia Dodaj/Usuń kolumny, aby wyświetlić dane wiersza.

  • Jeśli scalisz wyniki z testów projektu ASP.NET, zostaną wyświetlone wyniki dla oddzielnych testów, ale nie zostaną połączone. To zachowanie dotyczy tylko własnych elementów ASP.NET: wyniki dla innych zestawów zostaną połączone.

Wyklucz elementy z wyników pokrycia kodu

Możesz wykluczyć określone elementy w kodzie z wyników pokrycia, na przykład jeśli kod jest generowany na podstawie szablonu tekstowego. Dodaj atrybut System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute do dowolnego z następujących elementów kodu: class, struct, method, property, 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"FunctionName");

ExcludeSourceFromCodeCoverage( ExclusionName, L"SourceFilePath");

  • ExclusionName jest dowolną unikatową nazwą.

  • FunctionName jest w pełni kwalifikowaną nazwą funkcji. Może 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 zawierać symbole wieloznaczne. Poniższy przykład wyklucza wszystkie pliki w określonym katalogu: \\MyComputer\Source\UnitTests\*.cpp

  • #include <CodeCoverage\CodeCoverage.h>

  • Umieść wywołania makr wykluczeń w globalnej przestrzeni nazw, a nie wewnątrz żadnej przestrzeni nazw ani klasy.

  • Wykluczenia można umieścić w pliku kodu testu jednostkowego lub w pliku kodu aplikacji.

  • Wykluczenia muszą być kompilowane jako kod niezarządzany (natywny), ustawiając opcję kompilatora lub używając #pragma managed(off).

Notatka

Aby wykluczyć funkcje w kodzie C++/CLI, zastosuj atrybut [System::Diagnostics::CodeAnalysis::ExcludeFromCodeCoverage] do funkcji. Jest to takie samo, jak w przypadku języka 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ć zestaw zestawów dołączonych przez pobranie kopii odpowiednich plików .pdb.

Możesz mieć większą kontrolę nad tym, które zestawy i elementy są wybrane do analizy pokrycia kodu, pisząc plik .runsettings. Można na przykład wykluczyć zestawy określonego rodzaju 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 zaewidencjonowaniu kodu, twoje testy są uruchamiane na serwerze kompilacji razem z testami innych członków zespołu. Warto analizować pokrycie kodu w usłudze Azure Pipelines, aby uzyskać najbardziej up-to— data 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. Opcja pokrycia kodu jest częścią narzędzia vstest.console.exe, które jest wywoływane przez /EnableCodeCoverage.

  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 uruchom 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, artykuł Rozwiązywanie problemów z pokryciem kodu może okazać się pomocny.