【问题标题】:Unable to run parallel test via TestNg from DATA provider无法通过 DATA 提供者的 TestNg 运行并行测试
【发布时间】:2022-02-02 20:30:01
【问题描述】:

下面是我的 XML 片段。

<?xml version="1.0" encoding="UTF-8"?>
<suite name='Automation' threadCount="5" parallel="methods">
    <tests>
        <parameter name='clientName' value='Five' />    
         <test name='PA'>

            <classes>
                <class name='TC_INC_1'>
                </class>
            </classes>
        </test> 

所以我正在通过 TestNg 中的 DATA PROVIDER 从 excel 加载所需的数据。 我想要实现的是在不同的线程中运行每一行。 假设我有 5 行数据

1- Go to Google.com
2- Go to Facebook.com
3- Go to Dollarama.com
4- Go to Walmart.com
5- Go to KegSteak.com

说我正在运行两个线程意味着两个浏览器。 我希望两个浏览器以任意顺序并行运行每一行。

线程 1 - 1- 转到 Google.com 线程 2- 2- 转到 Facebook.com 第一次测试完成 - 浏览器关闭并再次打开。

现在它应该选择第 3 行和第 4 行。 线程 1 - 3- 转到 Dollarama.com 线程 2- 4- 转到 Walmart.com

浏览器关闭并再次打开。 线程 1 - 5- 转到 KegSteak.com

[![测试数据][1]][1]

我实际看到的是打开了两个浏览器,其中一个浏览器运行 url,另一个在启动 chrome 后变为静态。

任何修复?

【问题讨论】:

    标签: java multithreading selenium testng parallel-execution


    【解决方案1】:

    使用本地 WebDriver 变量

    确保在测试方法中启动和拆除 WebDriver:

        @Test(dataProvider = "provideUrls")
        public void navigateByUrlTest(String url){
            WebDriver driver = ...
            driver.get(url);
            // do something
            driver.quit();
        }
    
        //I know this implemented to get data from Excel, but just for example..
        @DataProvider(parallel = true)
        public Object[][] provideUrls() {
            return new Object [][] {
                    {"https://google.com"},
                    {"https://facebook.com"},
                    {"https://dollarama.com"},
                    {"https://walmart.com"},
                    {"https://kegSteak.com"}
            };
        }
    

    使用全局线程安全 WebDriver 变量

    WebDriver 配置可移至@BeforeMethod/@AfterMethod 方法。

    注意:在这种情况下,ThreadLocal 包装器应用于 WebDriver 实例。这样可以确保我们为每个线程保留单独的 WebDriver 实例。

    
        protected ThreadLocal<WebDriver> driverThreadSafe = new ThreadLocal<WebDriver>();
    
        @BeforeMethod
        public void launchDriver() {
            driverThreadSafe.set(new ChromeDriver());
        }
    
        @AfterMethod
        public void quitDriver() {
            driverThreadSafe.get().quit();
        }
    
        @Test(dataProvider = "provideUrls")
        public void test(String url){
            WebDriver driver = driverThreadSafe.get();
            driver.get(url);
            // do something, but do not quit the driver
        }
    

    配置线程数

    &lt;suite name='Automation' threadCount="5" - 这不适用于DaraProvider 并行度。

    您必须通过 dataproviderthreadcount testNG 参数和数据提供者的线程数。

    例如以编程方式,将此方法添加到当前类(或父基测试类)

        @BeforeSuite
        public void setDataProviderThreadCount(ITestContext context) {
            context.getCurrentXmlTest().getSuite().setDataProviderThreadCount(5);
        }
    

    参考文献

    TestNG parallel Execution with DataProvider

    https://testng.org/doc/documentation-main.html#running-testng

    https://www.baeldung.com/java-threadlocal

    【讨论】:

      猜你喜欢
      • 2017-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 2016-10-24
      • 1970-01-01
      • 2021-02-20
      • 2019-04-12
      相关资源
      最近更新 更多