TestNG:使用多个测试类在套件文件中执行并行测试

时间:2018-10-31 21:35:35

标签: java selenium parallel-processing testng

我正在尝试运行并行测试以配置套件文件。这些测试适用于使用Selenium的Web应用程序。套件文件由多个测试组成。每个测试包含多个测试类。每个测试中的第一个类用于初始化(@BeforeTest)WebDriver并关闭它(@AfterTest)。为了将其传递给其他类,WebDriver是静态的(原因是我们需要从最后一个测试类结束的地方继续进行测试)。

将套件配置为按顺序运行测试时,测试将成功运行。但是,当将该套件配置为并行运行测试时,所有套件测试都仅使用最后加载的Web驱动程序,而每个测试均未在各自​​的浏览器中运行。

你知道我如何克服这种情况吗?

检查以下套件模板:

<suite name="Register and Login functionality" parallel="tests" thread-count="2">
    <test name="Test-1">
        <parameter name="browser" value="chrome" />
        <classes>
            <class name="Init" />
            <class name="Register" />
            <class name="Login" />
        </classes>
    </test>
    <test name="Test-2">
        <parameter name="browser" value="chrome" />
        <classes>
            <class name="Init" />
            <class name="Register" />
            <class name="Login" />
        </classes>
    </test>
</suite>

Init测试类中的模板:

public class Init{

    private static WebDriver driver;

    public WebDriver getWebDriver(){
        return this.driver;
    }

    @BeforeTest
    public void setUp(){
        driver = new ChromeWebDriver();
    }

    @AfterTest
    public void quit(){
        driver.stop();
    }

}

注册测试类中的模板:

public class Register{

    private WebDriver driver;

    @BeforeClass
    public void setUp(){
        driver = Init.getWebDriver();
    }

    @Test
    public void test1(){
        ........
        ........
    }

    @Test
    public void test2(){
        ........    
        ........
    }

}

登录测试类中的模板:

public class Login{

    private WebDriver driver;

    @BeforeClass
    public void setUp(){
        driver = Init.getWebDriver();
    }

    @Test
    public void test1(){
        ........
        ........
    }

    @Test
    public void test2(){
        ........    
        ........
    }

}

2 个答案:

答案 0 :(得分:0)

静态对象对于jvm将是单个的。对于您的情况,可以将它们存储在ThreadLocal对象中。只需更改您的init类。

public static class Init{
    private static ThreadLocal<WebDriver> WEBDRIVER = new ThreadLocal<WebDriver>();

   public static WebDriver getWebDriver(){
      WebDriver driver= WEBDRIVER.get();
      if (driver== null) {
        driver = new ChromeWebDriver();
        WEBDRIVER.set(driver);
      }
      return driver;
   }

   @AfterTest
   public void quit(){
      getWebDriver().quit();
  }
 }

如果您使用init作为基类扩展注册和登录类。然后,您可以简单地避免在套件xml中提及init类

答案 1 :(得分:0)

您在init类中使用静态webdriver,它将确保仅启动一个webdriver实例。

private static WebDriver driver;

正如您提到的那样,每个测试未在各自的浏览器中运行。。您需要更改静态Web驱动程序。删除静态Web驱动程序并为每个测试启动Web驱动程序,这将在新的浏览器中打开每个测试。