41
50 20 5 1 0

Building frameworks over Selenium

Embed Size (px)

Citation preview

Page 1: Building frameworks over Selenium

5020510

Page 2: Building frameworks over Selenium

Building frameworks over Selenium

Page 3: Building frameworks over Selenium

Framework = ?Essential supporting structure of a building, vehicle or object

Page 4: Building frameworks over Selenium

Why yes? Why not?

Page 5: Building frameworks over Selenium

public static void main(String[] args) {WebDriver driver = new FirefoxDriver();driver.get("http://www.some-site.com");

System.out.println(“Opened the website!");

Thread.sleep(5);driver.quit();

}

Page 6: Building frameworks over Selenium

#0Record & playAnti-patternsNo design

Page 7: Building frameworks over Selenium

public static void main(String[] args) {

System.out.println(“Opened the website!");

Thread.sleep(5);driver.quit();

}

WebDriver driver = new FirefoxDriver();driver.get("http://www.some-site.com");Utils.openPage();

Page 8: Building frameworks over Selenium

#1 Kickoff stageUtility classesOne big family

Page 9: Building frameworks over Selenium

#1 Kickoff Stage IssuesDebugging time ~ test suite age

Page 10: Building frameworks over Selenium

#1 LessonsLaw of Demeter is awesome

Page 11: Building frameworks over Selenium

#2 – Localization challengeData providersData driven

Page 12: Building frameworks over Selenium

Data driven+ Control behavior from outside+ Recycle existing tests - Tests have to get a bit smarter - Data providers can be complex

Page 13: Building frameworks over Selenium

@DataProvider(name="SearchProvider") public Object[][] makeData(Method m){ if(m.getName().equalsIgnoreCase("testMethodA")){ return new Object[][] { { "Alpha", "Omega" }, { "A", "Z" } };

} else { return new Object[][] { { "A" }, { "B" }, { "D" } }; } }

Page 14: Building frameworks over Selenium

@DataProvider(name="SearchProvider") public Object[][] makeData(ITestContext c){

for (String group : c.getIncludedGroups()) {//...

} }

Page 15: Building frameworks over Selenium

#2 LessonsComplex stuff is made out of simple thingsHardcoded things suxData driven rulz

Page 16: Building frameworks over Selenium

#2 Documentation!

Page 17: Building frameworks over Selenium

#3 Performance TODO listReuse browser sessionsParallel tests

Page 18: Building frameworks over Selenium

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"><suite name="Parallel wall building" parallel="tests" thread-count="2">

<test name="T 1"><!--…-->

</test><test name="T 2">

<!--…..--></test><test name="T 3">

<!--…--></test>

</suite>

Page 19: Building frameworks over Selenium

#3 PerformanceMulti-threaded tests

Page 20: Building frameworks over Selenium

@BeforeMethodpublic void setUp() throws MalformedURLException {

threadDriver = new ThreadLocal<RemoteWebDriver>();

threadDriver.set(new RemoteWebDriver(/*...*/));}

public WebDriver getDriver() {return threadDriver.get();

}

Page 21: Building frameworks over Selenium

#3 Performance pain pointsMultithreads and r/w global variables = no loveLogging is no longer that useful

Page 22: Building frameworks over Selenium

#3 Lessons learnedDesigning is not optional

Page 23: Building frameworks over Selenium

#4 Stability

Page 24: Building frameworks over Selenium

#4 Stability pain pointsFalse-positives rateDebugging $ costsLack of trust

Page 25: Building frameworks over Selenium

#4 Stability – baby steps improvement

1. Culture of stability2. Design patterns3. Make failures cheap

Page 26: Building frameworks over Selenium

Lessons learnedRefactoring is inevitableUnit testing is not optional

Page 27: Building frameworks over Selenium

#5 Harder, better, faster, stronger

Page 28: Building frameworks over Selenium

#5 Trial of firePage objects

Page 29: Building frameworks over Selenium

#5 Page objects

Home page

Shopping cart page

Contact form page

Page interface

Page 30: Building frameworks over Selenium

#5 Trial of firePage objectsSmarter data providers

Page 31: Building frameworks over Selenium

#5 Smart data providersData

provider

Data provider

FACTORY

Home page

Shopping cart page

Contact form page

Page interface

Page 32: Building frameworks over Selenium

#5 Trial of fireSmarter data providersPage objectLoadable component

Page 33: Building frameworks over Selenium

#5 Lessons learnedIncreased complexity must meanbetter documentation

Page 34: Building frameworks over Selenium

#6 Mobile challengeWrite once, run everywhere

Page 35: Building frameworks over Selenium

#6 Mobile challengeSupercharge page object

Page 36: Building frameworks over Selenium

#7 GrowCustomer requests

Page 37: Building frameworks over Selenium

PrinciplesThink ahead, work smarter

Page 38: Building frameworks over Selenium

PrinciplesData driven

Page 39: Building frameworks over Selenium

PrinciplesNothing is bullet proof

Page 40: Building frameworks over Selenium

PrinciplesTest your tests

Page 41: Building frameworks over Selenium

Thank you