Google webdriver – vytvorte si vlastného testovacieho robota, časť IV.

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.

Google webdriver - Testujeme web pomocou JUnit

 

Ako ukážku testovania webovej aplikácie použijeme predtým vytvorenú triedu Steps.java. Testovací scenár bude nasledovný:

  1. Navigujeme sa na www.zoznam.sk
  2. Skontrolujeme <title>
  3. Klikneme na linku Reality
  4. Skontrolujeme <title>

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)

 

Google webdriver - Kustomizácia testovacieho kódu

 

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:

  1. Naviguj na anglickú verziu Google.
  2. Zadaj reťazec pre vyhĺadávanie: "Roman Hesteric".
  3. Klikni na button "Google Search".
  4. Skontroluj, že výsledná stránka obsahuje reťazec "inet.sk".

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

Neprehliadnite: