如何使用testng并行运行我的硒测试方法 [英] how to run my selenium test methods in parallel using testng
问题描述
我正在尝试使用testng并行运行自动化测试(Selenium Webdriver).这是我正在运行的节点:
I am trying to run my automated tests(Selenium webdriver) in parallel using testng. this is the node which I am running:
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
这是我的测试课:
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时,我使两个浏览器实例第一次运行,然后它们递增,50%的测试都失败了,您可以看到我试图在每个方法中实例化驱动程序,尽管这不是我的框架如何工作,但是我试图解决此问题的瓶颈.任何帮助将不胜感激预先感谢
when I run the XML, I expect to have my tests to be running on two browsers in two threads at a time, however when I run the XML I get two browser instances running at the first time and then they are incremented and 50% of the tests are failing, as you can see I am trying to instantiate the driver in each of my methods, although it's not how my framework is working, but I am trying to get to the bottleneck of this issue. Any help would be very appreciated Thanks in advance
推荐答案
以下是在TestNG中执行此操作的一些方法.您基本上可以通过 @BeforeMethod
和 @AfterMethod
配置方法来管理webdriver实例化和清理.因此,您需要确定如何与您的 @Test
方法共享创建的webdriver实例.为此,您有三个选择:
Here are some ways of doing this in TestNG. You basically manage your webdriver instantiation and cleanup via a @BeforeMethod
and a @AfterMethod
config methods. So then you would need to decide how would you want to share the created webdriver instance with your @Test
method. For that you have three options:
- 您使用了
ThreadLocal
变体,因为TestNG向您保证它将执行@BeforeMethod
,@Test
和@AfterMethod
都在同一线程中.
- You make use of a
ThreadLocal
variant, because TestNG guarantees to you that it will execute@BeforeMethod
,@Test
and@AfterMethod
all in the same thread.
下面是一个示例,向您展示了此操作
Here's a sample that shows you this in action
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.stackoverflow.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实例.这是一个示例,显示了实际操作.
- You can share the webdriver instance via the
ITestResult
object. Here's a sample that shows that in action.
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.stackoverflow.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中所示),您可以在我的
- You extract out the webdriver instantiation and cleanup into a TestNG listener (one that implements a
org.testng.IInvokedMethodListener
which sets the created webdriver into theITestResult
(as shown in option 2) or into aThreadLocal
(as shown in option 1). You can find more details about this option along with code snippets in my blog post.
这篇关于如何使用testng并行运行我的硒测试方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!