Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade...

Preview:

Citation preview

Writing reliable end to

end tests

End to end browser tests

They take a long time to run. Around

4-12 hours

Long feedback cycles

Tough to read or modify

Flaky

Not part of the development life

cycle

End to End

Integration

Unit Tests

Unit tests are important but they aren’t “tests” they are part of the development

process.

End to end

Integration

Unit tests

Why is end to end

testing important?

Tests whether the flow

of an application is

performing as

designed from start to

finish.

Goal

Simulate what a real

user scenario looks like

from start to finish.

Whit

TLDR;

Reasons

Solutions

Research

Over Engineering

void test() {

driver.get(“google.com”);

WebElement element = driver.findElement(By.name(“q”));

element.sendKeys("testing frameworks”);

element.submit();

}

void google(String query) { driver.get("google.com"); WebElement element = driver.findElement(By.name("q")); element.sendKeys(query); element.submit(); }

void testOne() { google("automated testing"); }

void testTwo() { google(“qcon london”); }

class GoogleHomePage { GoogleHomePage(Webdriver driver) { driver.get("google.com"); this.driver = driver; }

void searchFor(String query) { WebElement element = driver.findElement(By.name("q")); element.sendKeys("testing frameworks"); element.submit(); } }

void testOne() { GoogleHomePage page = new GoogleHomePage(); page.searchFor("testing frameworks") }

void testTwo() { GoogleHomePage page = new GoogleHomePage(); page.searchFor("flying foxes") }

Noise

Not so simple Test

• Page Object Pattern

• Advanced Page Object Pattern

• Facade Design Pattern

• Singleton Design Pattern

• Fluent Page Object Pattern

• IoC Container and Page Object

• Strategy Design Pattern

• Advanced Strategy Design

Pattern

• Observer Design Pattern

• Observer Design Pattern via

Events and Delegate

• Observer Design Pattern via

IObservable and IObserver

Tester’s spend close

to 50% of the time

designing and

maintaining test

frameworks

class GoogleHomePage { GoogleHomePage(Webdriver driver) { driver.get("google.com"); this.driver = driver; }

void searchFor(String query) { WebElement element = driver.findElement(By.name("q")); element.sendKeys("testing frameworks"); element.submit(); } }

void testOne() { GoogleHomePage page = new GoogleHomePage(); page.searchFor("testing frameworks") }

void testTwo() { GoogleHomePage page = new GoogleHomePage(); page.searchFor("flying foxes") }

Not so simple Test

✓ Eliminate design

✓ Think like a user

* Step

## Scenario

# Specification

* Step

## Scenario

# Specification

# Search the internet

## Search Google * Goto “google.com" * Search for “QCon London” * Verify “Qcon London” on the

first page

# Search the internet

## Search Google

* Goto “google.com"* Search for “QCon London”* Verify “Qcon London” is on the first page

## Search Duck

* Goto “duck.com”* Search for “QCon London”* Verify “Qcon London” is on the first page

# Search the internet

## Search Google * Goto “google.com” * Search for “QCon London”

## Search Duck * Goto “duck.com”* Search for “QCon London”

@Step("Goto <site>") public void goto(String site) { driver.get(site); }

@Step(“Search for <query>”) public void goto(String query) { WebElement element = driver .findElement(By.name(“q”)); element.sendKeys(query); element.submit(); }

✓ Single binary install

✓ Customisable reports

✓ Data driven tests

✓ Plugins

✓ Parallel execution

✓ Support for all IDE’s and

languages

✓ Reduced code

✓ Readability

✓ User empathy

✓ Quick feedback

Flakiness

Selectors

Source based

IntrusiveBy.Id(“pressMe”)

By.Name(“pressMe”)

StructuralBy.xpath(“//html/body/button”)

Waits

Explicit wait

ImplicitDriver.findElement(…).click()

wait = new WebDriverWait(driver, 20);

wait.until(…)

Fluent waitnew FluentWait(WebDriver reference)

.withTimeout(timeout, SECONDS)

.pollingEvery(timeout, SECONDS)

Smart Locators

click(“PRESS ME”)

Smart Locators

write(“Qcon”)

Proximity Selectors

click(checkbox(near(“Accept terms and conditions)))

# Search the internet

# Search Google

* Go to "google.com"

* Search for “qcon”

* Verify

step(“Go to <website>”, (website) => {

goto(website):

}); step(“Search for <query>”, (query) => {

write(query);

press(‘Enter’);

});

gauge.org

taiko.gauge.orggocd.org@getgauge

✓ Gauge is not BDD

✓ Non prescriptive syntax

✓ Parallel runs out of the

box

✓ Screenshots on failure

✓ First class IDE Support

✓ Data stores, external data

* Book "2" tickets

* Book "2" tickets

# Book <number> tickets* Pick <number> seats * Login in as "John" * Pay using credit card * Check ticket

# Search for movies * Set location as "Bangalore" ## Search for blockbusters * Search for theatres playing "Avengers"

## Search 2017 Oscar winners * Search for theaters playing "The shape of water"

Concepts Specification

Recommended