Chtěl bych navázat na článek Parametrizovaný JUnit test a pokračovat tak v představování vlastností JUnit, o kterých dost programátoru neví, nebo je alespoň denně nepoužívají.

Jsem zastáncem toho, aby jednotlivé testy byly co nejkratší a samozřejmě na sobě nezávislé. Raději napíšu deset testovacích metod s jedním assertem, než jednu metodu s deseti asserty (viz kritizovaný test validátoru rodných čísel). Výhodu spatřuji v tom, že při jediném běhu testu vidíte na jediný pohled všechny vadné případy. A ne že opravíte první assert, spustíte test a padne vám hned druhý assert v pořadí.

Jiné je to v případě integračních testů, například Selenium (WebDriver). Samotná příprava dat je náročná, takže je vhodné asserty sdružovat do větších celků. Ale jak z jediného běhu získat co nejvíce informací, aniž byste museli test znovu a znovu opakovat?

Existuje šikovná implementace rozhraní TestRule, v podobě ErrorCollector, který sbírá vzniklé chyby, ale reportuje je až nakonec.

Ukázka

Následuje ukázka Selenium testu (v Groovy), který ověřuje, zda mají povinná pole formuláře kolem sebe rámeček určité barvy. Jiste nechcete test ukončit po zjištěné nesrovnalosti hned na prvním poli. Zaměřte svou pozornost na řádek číslo 35, kde byste psali jako obvykle nějaký assert, ale tentokrát použijete ErrorCollectorl#checkThat. Díky anotaci @Delegate můžete vynechat referenci na errorCollector a psát pouze checkThat.

import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.ErrorCollector
import org.openqa.selenium.By
import org.openqa.selenium.remote.DesiredCapabilities
import org.openqa.selenium.remote.RemoteWebDriver
import static org.hamcrest.core.Is.*
/**
* @author banterCZ
*/
class SampleIT {
def webDriver
@Rule
@Delegate
public ErrorCollector errorCollector = new ErrorCollector()
@Test
void "use case foo"() {
webDriver.get("http://10.20.30.1/myapp/form-under-test")
checkMandatoryColor("firsname")
checkMandatoryColor("lastname")
//...
//may continue
}
private def checkMandatoryColor(def name) {
def expectedColor = "rgba(180, 49, 4, 1)"
def element = webDriver.findElement(By.name(name))
def actualColor = element.getCssValue("border-bottom-color")
checkThat("Field: $name", actualColor, is(expectedColor))
}
@Before
void setup() {
DesiredCapabilities abilities = DesiredCapabilities.firefox()
webDriver = new RemoteWebDriver(new URL("http://10.20.30.40:4444/wd/hub"), abilities)
}
@After
void tearDown() {
webDriver.quit()
}
}
view raw SampleIT.groovy hosted with ❤ by GitHub

A takhle nějak může vypadat výpis v IntelliJ IDEA

Související