.NET i Code Coverage w VS Code – Tutorial

Cel

Czasem chcemy wiedzieć jakie mamy pokrycie testami naszego kodu. Znać wskaźnik Code Coverage. O ile jestem przeciwny ślepemu zapatrywaniu się w liczby, bo przecież pokrycie 100% kodu testami nic nie mówi, o tyle podoba mi się idea pokazywania które fragmenty kodu tymi testami są pokryte.

Z życia wzięty case: Otwierasz plik i od razu, za pomocą kolorków i linii widzisz która część kodu jest testami pokryta, a która nie.

Jakość samego testu i tego kodu to inna sprawa. W tej chwili chcemy wiedzieć czy dany kawałek kodu jest „obtestowany”. To jest w tej chwili naszym celem.

Narzędzia

Od kiedy używam linuksa na swojej prywatnej maszynie, używam VS Code. Dlatego na przykładzie tego właśnie środowiska pokażę Ci jak zrealizować ten cel.

Do testowania używam xUnit, ale nie ma problemu aby było to NUnit, albo MSTest.

Dodatkowo przyda się wolne 30 min czasu, jakiś projekt z testami i może coś do picia.

Do dzieła

Code coverage – step 1

To co bedzie potrzebne na samym początku, to ta OpenSource’owa biblioteka: Code Coverlet .

Wystarczy zaciągnąć/dodać paczkę nugetową do naszego projektu z testami.

dotnet add package coverlet.collector

Tyle.

Od tej pory uzyskanie rezultatu w postaci pliku XML będzie wymagało odpalenia testów z parametrem –collect w ten sposób:

dotnet test --collect:"XPlat Code Coverage"

Tak jak pisałem, rezultatem bedzie plik XML, w nowym folderze TestResults w folderze z projektem.

Na tym poprzestanę, bo tak na prawdę ten plik jest potrzebny do integracji Code Coverage z Visual Studio Test Platform. To nie nasz case.

Jeśli chcesz, możesz poczytać o tym więcej TUTAJ

Code coverage – step 2

To co nas w tej chwili interesuje to posiadanie rezultatu testów w formacie pliku .lcov.

Można go uzyskać integrując MSBuild’a z biblioteką Code Coverlet którą przed chwilą dodaliśmy do projektu.

Dokonasz tego poprzez dodanie kolejnej biblioteki do projektu…

dotnet add package coverlet.msbuild

I co dalej?

Teraz tylko wystarczy uruchomić testy z odpowiednimi parametrami…

dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=lcov /p:CoverletOutput=./lcov.info .

Pamiętaj, nie pomiń ścieżki do projektu. Ja uruchamiam tę komenę w miejsu gdzie jest plik .csproj, więc na końcu komendy jest kropeczka 😉

Rezultat uruchomienia takiej komenty w konsoli/temrinalu będzie to…

a także nowy plik lcov.info.

Taki…

Code coverage – step 3

Pora na kolejny krok. Instalacja rozszerzenia do VS Code. Mianowicie chodzi o wtyczkę Code Coverage Gutters, która będzie „konsumować” wygenerowany wcześniej plik.

No więc instalujemy tę wtyczkę. Ona sobie sama znajdzie odpowiedni plik.
Potem już tylko wystarczy nacisnąć przycisk Watch na pasku statusu…na dole…

Od tego momentu wtyczka będzie pokazywać zielone, lub czerwone linie obok numerów linii kodu, w zależności od pokrycia kodu testami.

Code coverage – step 3.5

Jeśli nie chcesz odpalać testów z konsoli/terminala aby wygenerować plik z rezultatem testów możesz dodać kolejny task w pliku tasks.json w folderze .vscode.

Dodatkowy task będzie wyglądał mniej-więcej tak…

    {
        "label": "Coverage Tests",
        "command": "dotnet",
        "type": "process",
        "args": [
            "test",
            "/p:CollectCoverage=true",
            "/p:CoverletOutputFormat=lcov",
            "/p:CoverletOutput=./lcov.info",
            "${workspaceFolder}/csharp.tests/csharp.tests.csproj"
        ],
        "problemMatcher": "$msCompile",
        "group": {
            "kind": "test",
            "isDefault": true
        }
    }
]

Kończąc

And voila!

Wystarczy, że odpalisz testy za pomocą nowego taska – od czasu do czasu – a wtyczka Code Coverage Gutters sama pokaże co i jak z pokryciem interesującego Cię kodu testami.

Dosłownie chwila instalacji, pobierania i konfiguracji dzięki której mamy istotne źródło informacji nt. naszego kodu.

Uwielbiam takie chwile. A Ty?

Daj znać prosze czy tekst był przydatny. Jeśli masz coś do dodania lub znajdujesz błędy – feedback będzie mile widziany.

Photo by Clay Banks on Unsplash



Add comment

Newsletter



Społecznościowe

Historycznie

Tagi