Stryker Mutator i Testy Mutacyjne w .NET. Szybki start.

Na początek krótkie wprowadzenie.

Testy mutacyjne to pewna koncepcja testowania, gdzie podczas testu zmieniany jest kod aplikacji, aby sprawdzić czy testy jednostkowe wychwyciły tę zmianę.

Jeśli testy jednostkowe „przeszły” (na takim zmienionym kodzie), to znaczy, że nie są odpowiednio szczegółowe. Ot cała filozofia.

Mutacje jakim może być poddany nasz kod, są przeróżne. Np. zmiany operatorów binarnych, zmiany operatorów logicznych, a zmiany te nazywane są mutantami. Stąd nazwa tego rodzaju testów. Mutation testing.

Dlaczego ten temat?

Zająłem się tym tematem w ramach nauki w kursie Arkademy od Arkency.

W module 4 zaczynamy temat testów mutacyjnych. Kurs jest pisany, co prawda w Ruby, ale po kilku modułach stwierdzam, że jest dla każdego.

Piszę w C# i jako stary .NETowiec zacząłem szukać biblioteki która w tych testach mutacyjnych mi pomoże, co z kolei okazało się nie takie proste jak mogło by się wydawać na początku.

Znalazłem

  • NinjaTurtlesMutation – Patrząc na daty ostatnich commitów. Biblioteka ta nie jest już rozwijana.
  • Microsoft Docs – Na stronie MS Docs można znaleźć poradnik dot. testów mutacyjnych. Niestety, jak widać, trzeba ich obsługę napisać sobie samemu – BLE.
  • VisualMutator – Znalazłem to wrzucam. Zewnętrzne narzędzie. Nie próbowałem. Nie tego szukałem.
  • Stryker Mutator – Mój wybór.

Dlaczego Stryker Mutator?

Jest kilka przyczyn. Po pierwsze jest ciągle rozwijany – GitHub. Ma całkiem niezłą dokumentację którą znajdziecie Tutaj. Ponad to, Strykera poleca specjalistka od testów Ola Kunysz, zatem więcej nie trzeba.

Bierzemy się do pracy

Pierwsze co robimy to instalujemy Strykera globalnie jako .NET tool.

dotnet tool install -g dotnet-stryker

Potem, będąc w katalogu z plikiem *.csproj projetku z testami, należy wywołać komendę…

dotnet stryker

Stryker w tym momencie robi kilka rzeczy

  • Skanuje folder z podanej ścieżki lub lokalny w poszuiwaniu pliku konfiguracyjnego stryker-config.json. Jeśli nie istnieje, to pliku *.csproj
  • „Bierze” projekt który jest testowany w testach jednostkowych.
  • Buduje go i zlicza testy.
  • Sprawdza projekt pod kontem możliwych mutacji.
  • Dla każdej mutacji uruchamia testy jednostkowe i raportuje czy mutanty przetrwały czy zostały ubite, czy były jakieś timeouty lub błędy kompilacji.

Rezultat

Tak wygląda rezultat testów u mnie…

Stryker tworzy katalog z raportem z testów w pliku html, a także z logami z każdego z testów/mutacji.

Przyznam, że uruchomienie i odpalenie testów za pomocą tej biblioteki było banalnie proste! Wręcz przyjemne! Więc, skoro idzie nam tak dobrze, może jeszcze zerkniemy na konfigurację, której w pierwszym teście nie mieliśmy?

Konfiguracja

Oczywiście nie będę opisywał ustawień jakich można dokonać w konfiguracji i co one zmieniają bo, znajdziecie to w dokumentacji Strykera.

Wrzucam przykładowy plik z konfiguracją (trzeba go wrzucić do katalogu z projektem testów):

{
  "stryker-config":
  {
    "reporters": [
      "progress",
      "html"
    ],
    "log-level": "info",
    "log-file":true,
    "timeout-ms": 10000,
    "project-file": "ExampleProject.csproj",
    "max-concurrent-test-runners": 4,
    "threshold-high": 80,
    "threshold-low": 70,
    "threshold-break": 60,
    "mutation-level": "Standard",
    "mutate": [
      "!ExampleClass.cs",
      "!Migrations/*.*",
      "!ExampleDirectory\\ExampleClass2.cs"
    ],
    "excluded-mutations": [
      "string",
      "Logical operators"
    ],
    "ignore-methods": [
      "*Log*",
      "ToString",
      "*HashCode*"
    ],
    "dashboard-compare": true,
    "baseline-storage-location": "AzureFileStorage",
    "azure-storage-url": "https://storageaccount.file.core.windows.net/sharename",
    "azure-storage-sas": "<SAS>"
  }
}

Plik ten, jak pisałem wcześniej, jest przez Strykera czytany podczas uruchamiania testów i potem biblioteka „działa” wedle ustawień w tym pliku. Inaczej przyjmuje wartości domyślne.

Szybki start stop

To wszystko. Więcej nie trzeba, aby zacząć robić testy mutacyjne na platformie .NET/dotnetcore.

Zaskoczyło mnie jak łatwo było zacząć, uruchomić i wdrożyć testy mutacyjne dzięki bibliotece Stryker.

To było bardzo dobre doświadczenie. Na tyle, że zamierzam wdrażać takie testy w swoich pet-projects.

A Ty?

Jak zwykle namawiam do zostawienia komentarza. Możesz mnie też złapać na instagramie lub zwyczajnie posłać mail.

Photo by Photoholgic on Unsplash



Add comment

Newsletter



Społecznościowe

Historycznie

Tagi