我想在TestNg中使用@dataprovider并行运行selenium测试。理想情况下,测试是按方法并行的(一种测试=一种方法),而不是浏览器的简单套件并行性。我读过某个地方的内容,一次可以控制大约5个ChromeDriver实例,因此我认为应该可以实现。稍后,我计划移至grid2。为了进行开发,我通过右键单击+在XML配置文件上运行,使用IntelliJ Idea测试运行器运行事物。
我在并行(在grid2和本地)上运行测试时遇到了问题,因此我创建了一个或多或少想要执行的示例。
这是我的考试课
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"} }; } }
我抛出了一些本地事件,因为我在测试套件中大量使用了它们。
这是TestNg xml配置文件
<?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>
我读到在每个测试中实例化一个驱动程序往往是最可维护的。问题在于,firefox测试以串行方式运行,而chrome测试将所有数据点作为测试用例吐出,尝试打开大量浏览器实例,然后一切都失败了。我的测试将具有10-25或300-500个数据点(在客户端或客户端x产品之间循环)。
设置驱动程序,数据提供程序和测试运行程序以在运行测试中获得最佳并行性的最佳方法是什么?
我对dataProvider也有相同的经验。在我的情况下,我使用了dataProvider的(parallel = true)属性。您的问题有两种解决方案。
上述方法的缺点是在获取报告时;可能是mavensurefire,testng Eclipse报告或reportNG报告,您看不到预先传递的参数。为了克服这个问题,您可以使用以下方法。
另外,使用try / catch块实例化驱动程序对象并关闭浏览器。这将帮助您避免由于tearDown方法的setUp失败而导致的跳过。