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

38
Writing reliable end to end tests

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

Page 1: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

Writing reliable end to

end tests

Page 2: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC
Page 3: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

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

Page 4: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

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

Page 5: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

Why is end to end

testing important?

Tests whether the flow

of an application is

performing as

designed from start to

finish.

Page 6: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

Goal

Simulate what a real

user scenario looks like

from start to finish.

Page 7: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC
Page 8: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

Whit

Page 9: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

TLDR;

Reasons

Solutions

Page 10: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC
Page 11: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

Research

Page 12: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

Over Engineering

Page 13: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

void test() {

driver.get(“google.com”);

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

element.sendKeys("testing frameworks”);

element.submit();

}

Page 14: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

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”); }

Page 15: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

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 16: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

• 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

Page 17: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

Tester’s spend close

to 50% of the time

designing and

maintaining test

frameworks

Page 18: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

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

Page 19: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC
Page 20: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

✓ Eliminate design

✓ Think like a user

Page 21: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

* Step

## Scenario

# Specification

Page 22: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

* Step

## Scenario

# Specification

Page 23: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

# Search the internet

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

first page

Page 24: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

# 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

Page 25: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC
Page 26: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

# 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(); }

Page 27: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC
Page 28: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

✓ Single binary install

✓ Customisable reports

✓ Data driven tests

✓ Plugins

✓ Parallel execution

✓ Support for all IDE’s and

languages

Page 29: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

✓ Reduced code

✓ Readability

✓ User empathy

✓ Quick feedback

Page 30: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

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)

Page 31: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

Smart Locators

click(“PRESS ME”)

Page 32: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

Smart Locators

write(“Qcon”)

Page 33: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

Proximity Selectors

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

Page 34: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC
Page 35: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

# 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’);

});

Page 36: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

gauge.org

taiko.gauge.orggocd.org@getgauge

Page 37: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

✓ Gauge is not BDD

✓ Non prescriptive syntax

✓ Parallel runs out of the

box

✓ Screenshots on failure

✓ First class IDE Support

✓ Data stores, external data

Page 38: Qcon reliable end to end tests · •Page Object Pattern •Advanced Page Object Pattern •Facade Design Pattern •Singleton Design Pattern •Fluent Page Object Pattern •IoC

* 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