我在并行运行我的测试时遇到了问题(在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产品之间循环)。
如何设置驱动程序、数据提供程序和测试运行器以实现最佳的测试并发性?