并行测试在 TestNG 中失败

问题描述 投票:0回答:1

我正在从事自动化项目,我需要使用 testNG 并行运行测试。当我只运行一个实例时,一切正常,但是当像这样运行时:

@Test(invocationCount = 3, threadPoolSize = 3)

只有一个测试完成所有步骤,其余测试由于找不到可见元素而在第一步中的某个地方失败。

这是我的 DriverFactory 代码:

public class Factory {

    private static ThreadLocal<WebDriver> ThreadDriver = new InheritableThreadLocal<>();

    public static synchronized WebDriver getDriver() {
        WebDriver driver = ThreadDriver.get();


        if (driver==null) {
            FirefoxBinary binary = new FirefoxBinary(new File(
                    "path-to-mozilla"));
            FirefoxOptions options = new FirefoxOptions();
            options.setBinary(binary);
            WebDriverManager.firefoxdriver().setup();
            driver = new FirefoxDriver(options);
            ThreadDriver.set(driver);
        }


        return driver;
    }

    public static synchronized void quitDriver() {
        WebDriver driver = ThreadDriver.get();

        if(driver!=null) {
            driver.quit();
            ThreadDriver.remove();
        }
    }
}

然后它在@BeforeMethod中被初始化:

public class UploadPhotoTest {
    WebDriver driver;
    static String dateName = new SimpleDateFormat("yyyyMMddhhmmss").format(new Date());
    static String extentReportFile = "./src/main/resources/reports/report_" + dateName + ".html";
    public static ExtentReports extent = new ExtentReports(extentReportFile, false);
    public static ExtentTest test;

    @BeforeMethod
    public void setUp() {
        driver = Factory.getDriver();
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }

我尝试通过 testng.xml 运行它,并使用不同名称的测试副本,如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Load Tests" parallel="methods" thread-count="2">
    <test name="Create video Test">
        <classes>
            <class name="UploadPhotoTest">

            </class>
        </classes>
    </test>
</suite>

但是随后一个测试正在执行一些步骤并失败,抛出有关未找到元素的错误,然后第二个测试开始工作。

java automated-tests testng
1个回答
0
投票

问题出在你的测试代码上。

您正在配置方法中执行此操作

@BeforeMethod
public void setUp() {
    driver = Factory.getDriver();
    driver.manage().window().maximize();
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}

此代码在类级别设置一个

WebDriver
实例,这违背了
ThreadLocal
变量的目的。

请进行以下更改

  1. 在配置方法中将
    driver = Factory.getDriver();
    更改为
    WebDriver driver = Factory.getDriver()
    。这将确保您有一个本地变量来引用网络驱动程序,因此您可以轻松设置超时并最大化窗口部分。
  2. 在所有
    @Test
    方法中,直接通过
    Factory.getDriver()
    访问线程本地 webdriver,而不是通过类级别
    WebDriver
    变量引用它。

这应该确保您的代码可以工作。

这个想法是,您仅在所有

WebDriver
方法中直接通过
ThreadLocal
读取
@Test
实例,而不是在测试类中存储对其的引用。

© www.soinside.com 2019 - 2024. All rights reserved.