Nástroje pro Unit Testy
Tento článek byl napsán v roce 2021. Vývojářské technologie se neustále inovují a článek již nemusí popisovat aktuální stav technologie, ideální řešení a můj současný pohled na dané téma.
Pro psaní Unit Testů vznikla historicky celá řada nástrojů. V tomto článku nástroje rozdělím do několika kategorií a stručně doporučím vhodné zástupce každé kategorie. K článku zároveň přikládám přednášku, ve které jdu více pod povrch a dozvíte se k tomuto tématu další podrobnosti včetně ukázek.
Začínáte-li s testováním, doporučuji nejprve pročíst článek Jak začít psát unit testy, ve kterém shrnuji základní koncept testování na platformě .NET 5. Níže zmíněné nástroje Vám budou fungovat jak na nových verzích .NET Core / .NET 5, tak i na starším .NET Frameworku.
Testovací framework
Při založení testovacího frameworku budete muset zvolit vhodný testovací framework. Dnes se setkáte s možnostmi xUnit, NUnit nebo MSTest. Jejich srovnání se věnuje mnoho článků a z větší části jsou si tyto frameworky funkčně rovnocenné. Mají též podporu ve všech moderních IDE a tak volba leží čistě na tom, jaký zápis vám vyhovuje. Já pokládám za nejsofistikovanější xUnit, jehož syntaxe více ladí s mou představou o čistém kódu a zároveň je komunitně nejrozšířenější a tudíž pro něj existuje řada rozšíření.
Test Runner
Kromě NUnit frameworku (má svůj vlastní a nikterak pěkný runner) nenabízí žádný framework specifické GUI pro spouštění testů. Testy budete spouštět ve svém oblíbeném vývojářském prostředí, nebo skrze příkazovou řádku nástrojem dotnet test. Nemáte-li Visual Studio v nejvyšší enterprise edici, budete o mnoho funkcí ochuzeni a nabízí se tak buď cesta použít Visual Studio s ReSharperem nebo samostatné vývojářské prostředí Rider. Za sebe a za všechny spokojené vývojáře na platformě macOS doporučuji právě Rider od Jetbrains. Podporuje všechny výše uvedené frameworky a nabízí plno funkcí, o kterých si může nechat VS jenom zdát. Podrobnější článek o Rideru připravuji.
Assertions API
Aby byly testy srozumitelné, je vhodné zapojit některou z assertions knihoven. Tyto knihovny jsou založené na tzv. fluent API, díky kterému dokážete psát assert fázi testu mnohem čitelněji. Mezi nejčastější assertions knihovny na projektech patří Fluent Assertions a Shouldly. Za sebe používám Fluent Assertions, které vynikají kvalitní čistou code base. Chybu neuděláte ani druhou zmíněnou.
Mock framework
V praxi si budete chtít usnadnit práci s fakeováním tříd a sáhnete tudíž po mockovacím frameworku. V posledním roce jsem neviděl na českých projektech nic jiného než můj oblíbený Moq. Jedná se o nejrozšířenější řešení pro mockování, najdete pro něj nejvíce návodů a díky velké komunitě i rozšíření. Jedním z mých oblíbených je Moq.EntityFrameworkCore pro mockování DbSetů v EF Core.
Dependency Injection
Dále si můžete zjednodušit život při testování použitím dependency injection. S největší pravděpodobností budete chtít použít stejný container, který máte ve vaší testované aplikaci. Za sebe se držím výchozího MS Dependency Injection, který vyniká vysokou rychlostí, byť nenabízí žádné pokročilé funkce. Občas si proto pomáhám balíčkem Scrutor, který mi alespoň urychlí registraci služeb do DI.
Generování testovacích dat
Když si budete chtít vygenerovat testovací data, můžete pro tento účel použít různé knihovny. Ty obsahuji řadu fluent API, s jejichž pomocí vygenerujete jméno, přijmení, město, adresu, měny, čísla a hromadu dalších věcí. Mezi dvě nejčastějí se řadí Bogus a AutoFixture. Nemám zde jasnou preferenci, protože každý balíček má jiná rozšíření pro různé účely a zároveň ne vždy potřebuji data generovat. Přesto na projektech asi z lenosti historicky používám Bogus, který má užitečné rozšíření AutoBogus včetně podpory Moq. Bogus má poslední dobou v zahraničí vyšší popularitu a komunita kolem něj stále roste.
Benchmarky
Chcete-li si změřit čas v rámci jednotkových testů, nabízí se knihovna NBench. Je to aktuálně nejrozšířenější knihovna pro účely měření rychlosti testů a nemá konkurenci. Hledáte-li nástroj pro měření kódu mimo jednotkové testy, pak spíše sáhněte po BenchmarkDotNet.
Integrační testy
A na konec pro účely integračních testů využívám přirozenou třídu WebApplicationFactory, kterou Microsoft pro tyto účely zpřístupnil. Umožňuje spustit samostatný proces s webovou službou a vrátí HttpClient, kterým lze aplikaci testovat. Více o integračních testech jsem napsal v samostatném článku:
Závěrem nezbývá než doporučit vyzkoušet i jiné než mnou preferované nástroje. Třeba nakonec zjistíte, že Vám vyhovuje něco jiného a nebo objevíte zcela nový nástroj, který unikl mé pozornosti. Nechcete-li ale experimentovat a hledáte osvědčenou kombinaci nástrojů, sáhněte po mnou preferovaných a vyzkošuených. Je to kombinace, se kterou se setkávám na projektech nejčastěji.
Shrnutí doporučených nástrojů
- Testovací framework: xUnit
- Test runner a IDE: Rider, dotnet test
- Assertions API: Fluent Assertions
- Mock Framework: Moq
- Dependency Injection: MS Dependency Injection, Scrutor
- Generování testovacích dat: Bogus, AutoBogus
- Benchmarky: NBench, BenchmarkDotNet
- Integrační testy: WebApplicationFactory