View
10
Download
0
Category
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