V tomto článku se dozvíte, jak správně své unit testy pojmenovávat, strukturovat a kde je ve svém projektu udržovat.
POJMENOVÁNÍ TESTŮ
Setkal jsem se s dvěma druhy pojmenovávání testů, které aktivně využívám ve své sadě testů.
GIVENPARAMETERS_WHATTOEXPECT
Pojmenování říká, co do testu vstupuje a co od něj očekávám. Tento název nejvíce využívám pro testování statických metod, které slouží pro kalkulace či jiná zpracovávání primitivních typů. Tyhle názvy si dovolím použít jenom ve třídě s testy, která ve svém názvu obsahuje název SUTu
[Fact]
public void GivenAllParameters_ExpectingResult(){}
[Fact]
public void NotGivenPrice_ExpectingZeroResult(){}
SUT_STATEOFSUT_WHATTOEXPECT
Druhý typ používám častěji, jelikož se jedná o častější případ, kdy chci v názvu testu vyjádřit stav unity, kterou testuji. Druhý typ v sobě obsahuje i název pro System Under Test (SUT). SUT je zkratka pro Unit, kterou daný test testuje. Také se tomu říká Unit Of Work, ale takový název je matoucí, protože je využíván i jinde. Jako UOW vývojáři nejčastěji pochopí Pattern, který využíváme při práci s databázovým Contextem. Proto bych se držel názvu SUT. Jako SUT si můžeme představit jednu metodu, ale také i celý systém metod, který reprezentuje jeden Bussiness Behavior (Process).
[Fact]
public void Order_NotChosenPayment_ShouldShowValidationMessage(){}
POJMENOVÁNÍ TŘÍDY S TESTY
Třídu s testy doporučím pojmenovat jako [ClassUnderTest]Tests.cs nebo [SUT]Tests.cs. Zde velmi záleží na Vaší architektuře bussiness vrstvy. Pokud podobně jako já máte jednu třídu s jednou public metodou, která zpracovává jeden Bussiness Behavior, tak se můžete řídit pojmenováním pomocí názvu takové třídy a pouhým doplněním sufixu “Tests”.
STRUKTURA TESTU
Unit test můžeme rozdělit na tři části.
- 1. Arrange - V tomto bloku připravíte vše potřebné ke spuštění vašeho testu. To znamená vytvoření instancí, proměnných či mocků, které využijete v následném testu.
- 2. Act – V bloku act spouštíme SUT. V 99% se bude jednat o volání metody, kterou chcete otestovat.
- 3. Assert – Assert obsahuje vyhodnocení testu. V této části použijete metody statické třídy Assert, verifikaci mocků aj.
Doporučil bych v každém testu udržovat tyto tři části oddělené od sebe komentářem, viz pseudotest níže.
public void Sut_StateOfSut_WhatToExpect(){
//Arrange
var order = new Order();
order.Payment = null;
var sut = new OrderProcessor();
//Act
var validationMessage = sut.ProcessOrder(order);
//Assert
Assert.Equals(validationMessage, "Vyberte platbu");
}
KDE TESTY UKLÁDAT A UDRŽOVAT?
Testy vašeho projektu by měly být naprosto separované od vašeho produkčního kódu. Kód unit testů nesmí nijak ovlivnit běh vaší aplikace. Proto bych doporučil vytvoření úplně nového projektu do vaší solutiony. Projekt s testy bude obsahovat pouze reference na projekty, které si přejete testovat.
ZÁVĚR
Nepodceňujte pojmenování testu. Dobrý název může říct k čemu test slouží a mnohem rychleji napoví, kde jste nejspíše udělali chybu.