Roman Hesteric / 16. 07. 2008, 00:00
Google webdriver - v Jave testujeme webové aplikácie. Programujeme vlastné testovacie kroky. Testujeme využitím JUnit-u. Záver série.
Ako ukážku testovania webovej aplikácie použijeme predtým vytvorenú triedu Steps.java. Testovací scenár bude nasledovný:
Triedu nazveme „Test_JUnit1.java“.
package com.googlecode.webdriver.example;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.googlecode.webdriver.WebDriver;
import com.googlecode.webdriver.firefox.FirefoxDriver;
public class Test_JUnit1 {
private WebDriver driver;
@Before
public void setUp() {
System.setProperty("webdriver.firefox.useExisting", "true");
driver = new FirefoxDriver();
}
@After
public void tearDown() {
driver.close();
}
@Test
public void Test() {
try {
System.out.println("Starting Test ...");
Steps step = new Steps(driver);
step.invoke("http://www.zoznam.sk");
assertThat(driver.getTitle(), is("Zoznam slovenskeho internetu"));
step.clickLink("Reality");
assertThat(driver.getTitle(),
is("Reality, realitné kancelárie | Zoznam.sk"));
System.out.println("Test OK");
} catch (Exception e){
e.printStackTrace();
}
}
}
Downloadneme si poslednú verziu [junit-4.4.jar], pridáme jar do classpath, skompilujeme a spustíme.
Test dobehol bez chýb.
Na konzole môžeme vidieť naše výpisy.
Teraz zmeníme jeden riadok kódu, tým spôsobíme zlyhanie testu.
assertThat(driver.getTitle(),
is("Reality, realitné kancelárie | Zoznam.cz"));
Zlyhanie testu sa po skomplilovaní a spustení prejaví nasledovne.
... a chybou na konzole.
java.lang.AssertionError:
Expected: is "Reality, realitné kancelárie | Zoznam.cz"
got: "Reality, realitné kancelárie | Zoznam.sk"
at org.junit.Assert.assertThat(Assert.java:502)
at org.junit.Assert.assertThat(Assert.java:492)
Počas písania článkov o Google webdriver som sa stretol s prezentáciou Michaela Tamma na konferencii JAX08. Využijúc jeho prezentáciu som vytvoril novú, kustomizavanú triedu "StepsForJUnit".
package com.googlecode.webdriver.example;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.junit.After;
import org.junit.Before;
import org.junit.matchers.TypeSafeMatcher;
import com.googlecode.webdriver.By;
import com.googlecode.webdriver.NoSuchElementException;
import com.googlecode.webdriver.WebDriver;
import com.googlecode.webdriver.WebElement;
import com.googlecode.webdriver.firefox.FirefoxDriver;
public class StepsForJUnit{
protected WebDriver driver;
@Before
public void setUp() {
System.setProperty("webdriver.firefox.useExisting", "true");
driver = new FirefoxDriver();
}
@After
public void tearDown() {
driver.close();
}
protected void clickOn(WebElement webElement) {
webElement.click();
}
protected void goTo(String entryPage) {
driver.get(entryPage);
}
protected void enter(String value, WebElement inputField) {
inputField.sendKeys(value);
}
protected WebElement button(String label) {
try {
return driver.findElement(
By.xpath("//input[@type = 'submit' and @value = '" + label + "']"));
} catch (NoSuchElementException e) {
for (WebElement button : driver.findElements(By.xpath("//button"))) {
if (button.getText().equals(label)) {
return button;
}
}
throw e;
}
}
protected WebElement inputField(String name) {
return driver.findElement(By.xpath(name));
}
protected WebElement into(WebElement inputField) {
return inputField;
}
protected Matcher<WebDriver> containsText(final String expectedText) {
return new TypeSafeMatcher<WebDriver>() {
public boolean matchesSafely(WebDriver _driver) {
return _driver.findElement(By.xpath("/html/body")).
getText().
contains(expectedText);
}
public void describeTo(Description description) {
description.appendText("a page containing "" + expectedText + """);
}
};
}
protected WebDriver currentPage() {
return driver;
}
}
Využite triedy "StepsForJUnit.java" sa dá veľmi dobre prezentovať v triede "Test_JUnit2". Všimnite si dve metódy, ktoré táto trieda obsahuje. searchForRomanHesteric1() a searchForRomanHesteric2() obsahujú rovnaký testovací scenár. Na prvý pohľad je však však zrejmé, že metóda searchForRomanHesteric2() je človeku zrozumiteľná a ľahko čitateľná.
package com.googlecode.webdriver.example;
import static org.junit.Assert.assertThat;
import static org.junit.matchers.JUnitMatchers.containsString;
import org.junit.Test;
import com.googlecode.webdriver.By;
import com.googlecode.webdriver.WebElement;
public class Test_JUnit2 extends StepsForJUnit{
// Test na google.com, hladam string - kontrolujem text
// Povodny google webdriver
@Test
public void searchForRomanHesteric1() {
driver.get("http://www.google.com/ncr");
driver.findElement(By.xpath("//input[@name = 'q']")).
sendKeys("Roman Hesteric");
driver.findElement(
By.xpath("//input[@type = 'submit' and @value = 'Google Search']")).
click();
WebElement body = driver.findElement(By.xpath("/html/body"));
assertThat(body.getText(), containsString("inet.sk"));
}
// Test na google.com, hladam string - kontrolujem text
// Moj "super custiomized" kod
@Test
public void searchForRomanHesteric2() {
goTo("http://www.google.com/ncr");
enter("Roman Hesteric", into(inputField("//input[@name = 'q']")));
clickOn(button("Google Search"));
assertThat(currentPage(), containsText("inet.sk"));
}
}
Testovací scenár [searchForRomanHestericX] preložený do ľudskej reči:
Myslím si, že už prvý pohľad na metódu searchForRomanHesteric2() poteší oko každého, kto sa aspoň troška venuje programovaniu. Pôvodná metóda searchForRomanHesteric1() vykonáva presne tie isté kroky ako tá druhá, jej zrozumiteľnosť je však oveľa horšia.
O to viac nás môže tešiť, že takto zrozumiteľný kód sme si naprogramovali sami. Týmto sme vytvorili vlastného testovacieho robota - anoncovaného vo všetkých titulkoch tejto série článkov. Od teraz je teda na nás ako ho využijeme v praxi na testovanie našich excelentných webov.
Pre úplnosť ešte uvádzam prezentáciu Simona Stewarta, šéfa projektu google webdriver:
Autor pracuje ako developer vo firme www.together.sk
Copyright © 2002 - 2013 inet.sk, s. r. o. | Všetky práva vyhradené | Neprešlo jazykovou úpravou | ISSN 1336-1899
Využívame kvalitný webhosting za rozumnú cenu od Inet.sk