如何使用@BeforeSuite创建一个正确的并行selenium执行,并且每个@Test都在一个单独的TestNG类中?

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

我想用测试NG做一个测试设计。测试NG,我把每个 @测试 在一个单独的类中,并使用一次 @BeforeSuite & @AfterSuite 为所有类,原因是。

  1. 代码很容易维护
  2. 数据驱动的,为了能够选择哪些类要通过 xml 文件。

那么我想的是如何只登录一次,而这个会话可以被后续所有的测试使用,目前我做的是。

基地... 类。

public class Base {
    protected static WebDriver driver;

    @BeforeSuite
    public void setup() {
        System.setProperty("webdriver.chrome.driver", "/Users/.../chromedriver");
        driver = new ChromeDriver();
    }

    @AfterSuite
    public void tearDown() {
        driver.quit();
    }
}

LoginApps 类。

public class LoginApps extends Base{
    @Test(groups= {"logintest"})
    @Parameters({"data"})
    public void loginApps(String data) {
        driver.get("https://TheUrl.com/");
        //some code here
    }
}

案件1 类。

public class Case1 extends Base{
    @Test(dependsOnGroups= {"logintest"})
    @Parameters({"data"})
    public void case1(String data) {
        driver.get("https://TheUrl.com/");
        //some code here
    }
}

: 以上代码在单机运行时可以正常工作。<test> 在套件中。

问题是如果像下面这样并行运行的话 xml 配置。

testng.xml:

<suite name="SuiteTest" parallel="tests" thread-count="2">
    <test name="Test1">
        <parameter name="data" value="data1"></parameter>
        <classes>  
            <class name="com.main.LoginApps"/>
            <class name="com.main.Case1"/>
            .....
            More class
        </classes>
    </test>
    <test name="Test2">
        <parameter name="data" value="data2"></parameter>
        <classes>
            <class name="com.main.LoginApps"/>
            <class name="com.main.Case1"/>
            .....
            More class
        </classes>
    </test>
</suite>

该代码通过创建 driver 实例只需一次,而这两个 <test> 在同一会话中重叠运行。我想这是由于我在声明 driver 作为 static基地 类。但如果我把 static这将使事情变得更糟,仍然会造成 driver 实例只运行一次,代码只运行第一次的 @Test (在这里只是 登录应用),所有后续的测试将得到一个 NullPointerException 异常。

我使用 测试NG v7.0.0与 Maven :

<dependency>
    <groupId>org.testng</groupId>
    <artifactId>testng</artifactId>
    <version>7.0.0</version>
    <scope>compile</scope>
</dependency>

要并行运行我想象中的设计,如何解决?

java selenium selenium-webdriver testng access-modifiers
1个回答
0
投票

创建具有线程安全的驱动,确保两次驱动会话都是唯一的。

public class ThreadLocalDriver {

    private static ThreadLocal<WebDriver> threadLocalDriver = new ThreadLocal<>();

    public synchronized static void setTLDriver(WebDriver driver) {
        threadLocalDriver.set(driver);
    }

    public synchronized static WebDriver getTLDriver() {
        return threadLocalDriver.get();
    }
}

public class BaseClass {
    @BeforeMethod
    public void setup (String deviceName, String platformVersion) throws IOException {
        DesiredCapabilities caps = new DesiredCapabilities();
        // Add caps here    
        ThreadLocalDriver.setTLDriver(new ChromeDriver(caps));
    }

    @AfterMethod
    public synchronized void teardown(){
        ThreadLocalDriver.getTLDriver().quit();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.