Víťa Plšek - Zápisky Java / Script vývojáře

← Zpět na úvodní stranu

Využití JUnit Rule v Selenium testu

8. června 2016

Nedávno jsem při psaní E2E end testů v JUnit pomocí Selenia řešil, jak před testy spustit a po testech zastavit WebDriver.

První řešení, které zřejmě většinu z Vás napadne může vypadat takto:

public class StackOverflowTest {

  private WebDriver driver;

  @Before
  public void setUp() {
    driver = new ChromeDriver();
  }

  @After
  public void tearDown() {
    driver.quit();
  }

  @Test
  public void stackOverflowShouldWork() throws Exception {
    driver.get("http://www.stackoverflow.com");

    assertThat(driver.getTitle()).isEqualTo("Stack Overflow");
  }
}

Pokud ale takovýchto testovacích tříd bude víc, co většinou uděláte? Smíříte se s duplicitou? To si pravděpodobně rozmyslíte hned jakmile budete chtít použít nějaký driver manager, konfigurovat spouštěný browser, nebo řešit vzádlené spuštění. Jak to tedy můžete řešit? Zapouzdření do pomocné třídy? Využití dědičnosti? To určitě fungovat bude, ale zakrývá to skutečnou podstatu problému. A tou je, potřeba učinit obsah @Before a @After do znovupoužitelným.

K tomu Vám v JUnit pomůže Rule. Přesněji, abstraktní třída ExternalResource, která po zdědění umožní určit, co se má vykonat před či po testu či testovací třídě. Teorii okolo konceptu Rule si přečtete v dokumentaci, já Vám to zatím ukážu v kódu, jste přece programátoři.

Následující kód tedy ukazuje třídu WebDriverRule, která zapouzdří vytvoření, ukončení a možnost získat Webdriver.

public class WebDriverRule extends ExternalResource{

  private WebDriver driver;

  @Override
  protected void before() throws Throwable {
     ChromeDriverManager.getInstance().setup();
     driver = new ChromeDriver();
  }

  @Override
  protected void after() {
    driver.quit();
  }

  public WebDriver getDriver() {
    return driver;
  }
}

Pokud by Vás zajímalo co je ten ChromeDriverManager, podívejte se tady.

Použití WebDriverRule v testu pak vypadá takto

@Rule
public WebDriverRule webDriverRule = new WebDriverRule();
private WebDriver driver;

@Before
public void setUp() throws Exception {
  driver = webDriverRule.getDriver();
}

V metodě setUp zůstává jen získání driveru, o jeho vytvoření před každým testem a ukončení po každém testu řeší Rule.

Pokud byste preferovali spíše spuštění prohlížeče pro celou třídu, stačí nahradit anotaci @Rule anotací @ClassRule.



Pokud Vás článek zaujal, dejte o něm vědět ostatním



© Víťa Plšek