如何 运行 我的 selenium 测试方法并行使用 testng
how to run my selenium test methods in parallel using testng
我正在尝试 运行 我的自动化测试(Selenium webdriver)使用 testng 并行。这是我所在的节点 运行ning:
java -Dwebdriver.gecko.driver=chromedriver.exe -jar selenium-server-standalone-3.4.0.jar -role node -hub http://localhost:4444/grid/register -browser browserName=chrome,maxInstances=2 -maxSession 2
这是我的测试class:
public class TestParallel {
Login login;
//@BeforeMethod(alwaysRun = true)
public SeleniumDriverCore testSetup() throws FileNotFoundException, IOException{
SeleniumDriverCore driver = new SeleniumDriverCore("config/chromeDriverConfig");
Properties config = new Properties();
config.load(new FileInputStream("config/testConfig"));
this.login = new Login(driver);
driver.browser.open("https://test.test.xyz");
driver.browser.maximize();
driver.waits.waitForPageToLoad();
return driver;
}
@Test(groups={"parallel"})
public void test_one() throws FileNotFoundException, IOException{
SeleniumDriverCore driver=testSetup();
login.navigateToPage(Pages.LOGIN);
login.assertion.verifyLoginPopupAndTitleDisplayed();
testCleanup(driver);
}
@Test(groups={"parallel"})
public void test_two() throws FileNotFoundException, IOException{
SeleniumDriverCore driver=testSetup();
login.navigateToPage(Pages.LOGIN);
login.assertion.verifyLoginPopupAndTitleDisplayed();
testCleanup(driver);
}
@Test(groups={"parallel"})
public void test_three() throws FileNotFoundException, IOException{
SeleniumDriverCore driver=testSetup();
login.navigateToPage(Pages.LOGIN);
login.assertion.verifyLoginPopupAndTitleDisplayed();
testCleanup(driver);
}
@Test(groups={"parallel"})
public void test_four() throws FileNotFoundException, IOException{
SeleniumDriverCore driver=testSetup();
login.navigateToPage(Pages.LOGIN);
login.assertion.verifyLoginPopupAndTitleDisplayed();
testCleanup(driver);
}
public void testCleanup(SeleniumDriverCore driver){
driver.close();
driver.quit();
}
}
这是我的 xml:
<suite name="Ontega - All Tests Mobile" parallel="methods" thread-count="2">
<test name="Ontega - All Tests Mobile">
<groups>
<run>
<include name="parallel"/>
<exclude name="open-defects"/>
</run>
</groups>
<packages>
<package name="tests.*"/>
</packages>
</test>
</suite>
当我 运行 XML 时,我希望我的测试 运行 同时在两个浏览器上以两个线程进行测试,但是当我 运行 XML 我第一次得到两个浏览器实例 运行ning 然后它们递增并且 50% 的测试失败了,正如你所看到的我试图在每个实例中实例化驱动程序我的方法,虽然这不是我的框架的工作方式,但我正在努力解决这个问题的瓶颈。
任何帮助将不胜感激
提前致谢
您似乎为每个测试创建了多个驱动程序。我猜你需要在 testSetup() 方法之外保留一些代码
SeleniumDriverCore driver = new SeleniumDriverCore("config/chromeDriverConfig");
Properties config = new Properties();
config.load(new FileInputStream("config/testConfig"))
我正在分享我用于并行测试的部分代码,这可能对您的情况有所帮助
我的xml
这里有一些在 TestNG 中执行此操作的方法。您基本上通过 @BeforeMethod
和 @AfterMethod
配置方法管理您的 webdriver 实例化和清理。因此,您需要决定如何与 @Test
方法共享创建的 webdriver 实例。为此,您有三个选择:
- 您使用了
ThreadLocal
变体,因为 TestNG 向您保证它将在同一个线程中执行 @BeforeMethod
、@Test
和 @AfterMethod
。
这是一个向您展示实际操作的示例
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.ITestResult;
import org.testng.Reporter;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class TestClassSampleUsingThreadLocal {
private static final ThreadLocal<RemoteWebDriver> drivers = new ThreadLocal<>();
@BeforeMethod
public void instantiateBrowser(ITestResult testResult) {
RemoteWebDriver driver = new ChromeDriver();
drivers.set(driver);
}
@Test(dataProvider = "dp")
public void testMethod(String url) {
Reporter.log("Launching the URL [" + url + "] on Thread [" + Thread.currentThread().getId() + "]", true);
driver().get(url);
Reporter.log("Page Title :" + driver().getTitle(), true);
}
@DataProvider(name = "dp", parallel = true)
public Object[][] getData() {
return new Object[][]{
{"http://www.google.com"}, {"http://www.whosebug.com"}, {"http://facebook.com"}
};
}
@AfterMethod
public void cleanupBrowser() {
RemoteWebDriver driver = driver();
driver.quit();
}
private RemoteWebDriver driver() {
RemoteWebDriver driver = drivers.get();
if (driver == null) {
throw new IllegalStateException("Driver should have not been null.");
}
return driver;
}
}
- 您可以通过
ITestResult
对象共享 webdriver 实例。这是一个示例,显示了实际情况。
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.ITestResult;
import org.testng.Reporter;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class TestClassSample {
private static final String WEBDRIVER = "driver";
@BeforeMethod
public void instantiateBrowser(ITestResult testResult) {
RemoteWebDriver driver = new ChromeDriver();
testResult.setAttribute(WEBDRIVER, driver);
}
@Test(dataProvider = "dp")
public void testMethod(String url) {
Reporter.log("Launching the URL [" + url + "] on Thread [" + Thread.currentThread().getId() + "]", true);
driver().get(url);
Reporter.log("Page Title :" + driver().getTitle(), true);
}
@DataProvider(name = "dp", parallel = true)
public Object[][] getData() {
return new Object[][]{
{"http://www.google.com"},
{"http://www.whosebug.com"},
{"http://facebook.com"}
};
}
@AfterMethod
public void cleanupBrowser(ITestResult testResult) {
RemoteWebDriver driver = driver(testResult);
driver.quit();
}
private RemoteWebDriver driver() {
return driver(Reporter.getCurrentTestResult());
}
private RemoteWebDriver driver(ITestResult testResult) {
if (testResult == null) {
throw new IllegalStateException("testResult should have not been null.");
}
Object driverObject = testResult.getAttribute(WEBDRIVER);
if (driverObject == null) {
throw new IllegalStateException("Driver should have not been null.");
}
if (!(driverObject instanceof RemoteWebDriver)) {
throw new IllegalStateException("Driver is not a valid webdriver object");
}
return (RemoteWebDriver) driverObject;
}
}
- 您将 webdriver 实例化和清理提取到 TestNG 侦听器(实现
org.testng.IInvokedMethodListener
的侦听器,它将创建的 webdriver 设置为 ITestResult
(如选项 2 所示)或 ThreadLocal
(如选项 1 所示)。您可以在我的 blog post. 中找到有关此选项的更多详细信息以及代码片段
我正在尝试 运行 我的自动化测试(Selenium webdriver)使用 testng 并行。这是我所在的节点 运行ning:
java -Dwebdriver.gecko.driver=chromedriver.exe -jar selenium-server-standalone-3.4.0.jar -role node -hub http://localhost:4444/grid/register -browser browserName=chrome,maxInstances=2 -maxSession 2
这是我的测试class:
public class TestParallel {
Login login;
//@BeforeMethod(alwaysRun = true)
public SeleniumDriverCore testSetup() throws FileNotFoundException, IOException{
SeleniumDriverCore driver = new SeleniumDriverCore("config/chromeDriverConfig");
Properties config = new Properties();
config.load(new FileInputStream("config/testConfig"));
this.login = new Login(driver);
driver.browser.open("https://test.test.xyz");
driver.browser.maximize();
driver.waits.waitForPageToLoad();
return driver;
}
@Test(groups={"parallel"})
public void test_one() throws FileNotFoundException, IOException{
SeleniumDriverCore driver=testSetup();
login.navigateToPage(Pages.LOGIN);
login.assertion.verifyLoginPopupAndTitleDisplayed();
testCleanup(driver);
}
@Test(groups={"parallel"})
public void test_two() throws FileNotFoundException, IOException{
SeleniumDriverCore driver=testSetup();
login.navigateToPage(Pages.LOGIN);
login.assertion.verifyLoginPopupAndTitleDisplayed();
testCleanup(driver);
}
@Test(groups={"parallel"})
public void test_three() throws FileNotFoundException, IOException{
SeleniumDriverCore driver=testSetup();
login.navigateToPage(Pages.LOGIN);
login.assertion.verifyLoginPopupAndTitleDisplayed();
testCleanup(driver);
}
@Test(groups={"parallel"})
public void test_four() throws FileNotFoundException, IOException{
SeleniumDriverCore driver=testSetup();
login.navigateToPage(Pages.LOGIN);
login.assertion.verifyLoginPopupAndTitleDisplayed();
testCleanup(driver);
}
public void testCleanup(SeleniumDriverCore driver){
driver.close();
driver.quit();
}
}
这是我的 xml:
<suite name="Ontega - All Tests Mobile" parallel="methods" thread-count="2">
<test name="Ontega - All Tests Mobile">
<groups>
<run>
<include name="parallel"/>
<exclude name="open-defects"/>
</run>
</groups>
<packages>
<package name="tests.*"/>
</packages>
</test>
</suite>
当我 运行 XML 时,我希望我的测试 运行 同时在两个浏览器上以两个线程进行测试,但是当我 运行 XML 我第一次得到两个浏览器实例 运行ning 然后它们递增并且 50% 的测试失败了,正如你所看到的我试图在每个实例中实例化驱动程序我的方法,虽然这不是我的框架的工作方式,但我正在努力解决这个问题的瓶颈。 任何帮助将不胜感激 提前致谢
您似乎为每个测试创建了多个驱动程序。我猜你需要在 testSetup() 方法之外保留一些代码
SeleniumDriverCore driver = new SeleniumDriverCore("config/chromeDriverConfig");
Properties config = new Properties();
config.load(new FileInputStream("config/testConfig"))
我正在分享我用于并行测试的部分代码,这可能对您的情况有所帮助
我的xml
这里有一些在 TestNG 中执行此操作的方法。您基本上通过 @BeforeMethod
和 @AfterMethod
配置方法管理您的 webdriver 实例化和清理。因此,您需要决定如何与 @Test
方法共享创建的 webdriver 实例。为此,您有三个选择:
- 您使用了
ThreadLocal
变体,因为 TestNG 向您保证它将在同一个线程中执行@BeforeMethod
、@Test
和@AfterMethod
。
这是一个向您展示实际操作的示例
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.ITestResult;
import org.testng.Reporter;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class TestClassSampleUsingThreadLocal {
private static final ThreadLocal<RemoteWebDriver> drivers = new ThreadLocal<>();
@BeforeMethod
public void instantiateBrowser(ITestResult testResult) {
RemoteWebDriver driver = new ChromeDriver();
drivers.set(driver);
}
@Test(dataProvider = "dp")
public void testMethod(String url) {
Reporter.log("Launching the URL [" + url + "] on Thread [" + Thread.currentThread().getId() + "]", true);
driver().get(url);
Reporter.log("Page Title :" + driver().getTitle(), true);
}
@DataProvider(name = "dp", parallel = true)
public Object[][] getData() {
return new Object[][]{
{"http://www.google.com"}, {"http://www.whosebug.com"}, {"http://facebook.com"}
};
}
@AfterMethod
public void cleanupBrowser() {
RemoteWebDriver driver = driver();
driver.quit();
}
private RemoteWebDriver driver() {
RemoteWebDriver driver = drivers.get();
if (driver == null) {
throw new IllegalStateException("Driver should have not been null.");
}
return driver;
}
}
- 您可以通过
ITestResult
对象共享 webdriver 实例。这是一个示例,显示了实际情况。
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.ITestResult;
import org.testng.Reporter;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class TestClassSample {
private static final String WEBDRIVER = "driver";
@BeforeMethod
public void instantiateBrowser(ITestResult testResult) {
RemoteWebDriver driver = new ChromeDriver();
testResult.setAttribute(WEBDRIVER, driver);
}
@Test(dataProvider = "dp")
public void testMethod(String url) {
Reporter.log("Launching the URL [" + url + "] on Thread [" + Thread.currentThread().getId() + "]", true);
driver().get(url);
Reporter.log("Page Title :" + driver().getTitle(), true);
}
@DataProvider(name = "dp", parallel = true)
public Object[][] getData() {
return new Object[][]{
{"http://www.google.com"},
{"http://www.whosebug.com"},
{"http://facebook.com"}
};
}
@AfterMethod
public void cleanupBrowser(ITestResult testResult) {
RemoteWebDriver driver = driver(testResult);
driver.quit();
}
private RemoteWebDriver driver() {
return driver(Reporter.getCurrentTestResult());
}
private RemoteWebDriver driver(ITestResult testResult) {
if (testResult == null) {
throw new IllegalStateException("testResult should have not been null.");
}
Object driverObject = testResult.getAttribute(WEBDRIVER);
if (driverObject == null) {
throw new IllegalStateException("Driver should have not been null.");
}
if (!(driverObject instanceof RemoteWebDriver)) {
throw new IllegalStateException("Driver is not a valid webdriver object");
}
return (RemoteWebDriver) driverObject;
}
}
- 您将 webdriver 实例化和清理提取到 TestNG 侦听器(实现
org.testng.IInvokedMethodListener
的侦听器,它将创建的 webdriver 设置为ITestResult
(如选项 2 所示)或ThreadLocal
(如选项 1 所示)。您可以在我的 blog post. 中找到有关此选项的更多详细信息以及代码片段