【问题标题】:Parallel Execution in TestNGTestNG 中的并行执行
【发布时间】:2020-08-08 02:11:35
【问题描述】:

我尝试使用 SeleniumTestNG 进行测试设计,我将每个 @Test 放在一个单独的类中,并使用一次 @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 实例来运行,并且两个&lt;test&gt; 在同一个会话中重叠运行。我认为这是因为我在 Base 类中将driver 声明为static 的方式。但是如果我删除static,情况会更糟,仍然只创建一次driver实例,代码只运行第一个@Test(在这种情况下只有LoginApps),所有后续测试都会得到一个NullPointerException异常。

我将 TestNG 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】:

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

    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();
        }
    }
    

    【讨论】:

    • LoginAppsCase1 类,如何访问driver
    • threadLocalDriver.set / get 已经同步。
    猜你喜欢
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 2019-02-01
    • 1970-01-01
    • 2020-03-01
    • 2023-03-31
    相关资源
    最近更新 更多