我想在使用 @dataprovider 的 TestNg 中并行运行硒测试。理想情况下,测试是按方法并行的(一个测试=一种方法),而不是浏览器的简单套件并行性。我在某处读到一次可以控制大约 5 个 ChromeDriver 实例,所以我认为这应该是可能的。后来我打算搬到grid2。对于开发,我正在使用 IntelliJ Idea 测试运行程序通过右键单击 + 在 XML 配置文件上运行来运行。
我在并行运行测试时遇到了问题(在 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 产品之间循环)。
设置驱动程序、数据提供程序和测试运行程序以在运行测试中实现最佳并行性的最佳方法是什么?