Driver behavior executing parallel TestNG selenium tests with dataprovider -
i want run selenium tests in testng in parallel use @dataprovider. ideally tests parallel method (one test = 1 method) , not simple suite parallelism browser. have read somewhere 5 instances of chromedriver can controlled @ time thought should possible. later plan move grid2. developement i'm running things intellij idea test runner right-click + run on xml config file.
i had problems running tests in parallel (on grid2 , locally) created sample of more or less want do.
here test class
package tests; import org.openqa.selenium.by; import org.openqa.selenium.keys; import org.openqa.selenium.webdriver; import org.openqa.selenium.webelement; import org.openqa.selenium.chrome.chromedriver; import org.openqa.selenium.firefox.firefoxdriver; import org.openqa.selenium.interactions.actions; import org.testng.annotations.*; import java.util.concurrent.timeunit; import static org.testng.assert.assertnotnull; public class paralleltest { public static final string search_terms = "search-terms"; private webdriver driver; @beforemethod @parameters({"browser"}) public void beforemethod(@optional("chrome") string browser){ driver = getbrowser(browser); driver.manage().deleteallcookies(); driver.manage().timeouts().implicitlywait(10, timeunit.seconds); } private webdriver getbrowser(string browser) { if(browser.equals("chrome")){ system.setproperty("webdriver.chrome.driver", "webdrivers\\chromedriver.exe"); return new chromedriver(); } return new firefoxdriver(); } @aftermethod public void aftermethod(){ driver.quit(); } @test(description = "check parallel selenium works.", dataprovider = search_terms) public void parallelseleniumtest(string searchterm){ driver.get("http://google.com"); webelement search = driver.findelement(by.id("gbqfq")); new actions(driver) .sendkeys(search, searchterm) .sendkeys(search, keys.enter) .perform(); string firstresult = driver.findelements(by.classname("r")).get(0).gettext(); assertnotnull(firstresult); system.out.println(firstresult); } @dataprovider(name = search_terms, parallel = true) public object[][] getsearchterms(){ return new object[][]{ {"google"}, {"microsoft"}, {"facebook"}, {"amazon"}, {"apple"}, {"oracle"}, {"yahoo"}, {"jetbrains"}, {"intellij idea"}, {"selenium"}, {"java"}, {"testng"}, {"code"} }; } } i threw in native events since use them heavily in test suite.
and here testng xml config file
<?xml version="1.0" encoding="utf-8"?> <!doctype suite system "http://testng.org/testng-1.0.dtd"> <suite thread-count="4" name="vfr6-ui-tests" parallel="methods"> <test name="parallel-test-firefox"> <parameter name="browser" value="firefox"/> <classes> <class name="tests.paralleltest"/> </classes> </test> <test name="parallel-test-chrome"> <parameter name="browser" value="chrome"/> <classes> <class name="tests.paralleltest"/> </classes> </test> </suite> i read instantiating 1 driver per test tends maintainable. problem firefox test runs in serial while chrome test spits out of data points test cases, attempts open trove of browser instances, fails. tests have either 10-25 or 300-500 data points (cycling between either clients or clients x products).
what best way set driver, dataprovider, , test runner achieve best parallelism in running tests?
i had same experience dataprovider. in case used dataprovider's (parallel=true) attribute though. there 2 solutions problem.
use dataprovider , in test class , use factory annotation constructor. in factory annotation's attribute, use dataprovider="your dataprovider's name". in testng.xml, instead of parallel=methods, use parallel=instances.
the drawback of above approach when report; may maven- surefire, testng eclipse report or reportng report, not see parameters passed front. overcome this, can use following approach.
create factory class , instantiate test class in factory method using loop. (start loop 0.) in test class define constructor receives parameter factory class. define dataprovider in test class can use parameter (data-point) received in constructor. define beforemethod or beforeclass can use parameter or data point , test methods should have "dataprovider" attribute pointing desired dataprovider. again, in testng.xml use parallel="instances".
also, use try/catch block instantiating driver object , closing browser. in avoiding skips due failure of setup of teardown method.
Comments
Post a Comment