0

下面是我的 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 后变为静态。

任何修复?

4

1 回答 1

0

使用本地 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
    }

配置线程数

<suite name='Automation' threadCount="5" - 这不适用于DaraProvider并行性。

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

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

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

参考

使用 DataProvider 的 TestNG 并行执行

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

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

于 2022-02-03T06:56:47.723 回答