当前位置: 首页 > 知识库问答 >
问题:

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

沈子昂
2023-03-14

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

当套件配置为按顺序运行测试时,测试将成功运行。但是当套件被配置为并行运行测试时,所有套件测试都只使用上次加载的webdriver并且每个测试都不在其各自的浏览器中运行。

你知道我怎样才能克服这种情况吗?

检查下面的套件模板:

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

}

register测试类中的模板:

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个答案

闽念
2023-03-14

您正在init类中使用静态webdriver,这将确保只启动一个webdriver实例

private static WebDriver driver;

正如您在问题中提到的,每个测试都不是在其各自的浏览器中运行的。您需要更改静态web驱动程序。删除静态web驱动程序并为每个测试启动web驱动程序,这将在新浏览器中打开每个测试。

邵昆琦
2023-03-14

静态对象对于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作为基类扩展register和login类。那么您可以简单地避免在suite xml中提及init类

 类似资料:
  • 有4个类包含测试< code>TestClass1、TestClasss2、TestClass3、TestClass4。您需要创建2个测试套件,每个套件将包含2个类,并使用< code>Maven surefire插件并行运行它们。 我创建了两个包含以下内容的xml文件: 和 也添加到: 接下来,我用命令< code>mvn clean test运行项目,项目将要运行,但是测试没有开始。我哪里错了

  • 我设置了Selenium grid2,它与以下并行TestNG测试套件配合得很好: 但是当我在TestNG蚂蚁任务中执行测试时,并行不再工作。 在我将测试套件文件中的并行模式更改为“tests”后,它再次工作,如下所示: 那么,这是否意味着TestNG ant任务不支持“类”并行测试套件?

  • 请让我知道是否可以通过TestNG运行并行套件?

  • 我试图使用XML和TestNG运行一个测试套件,但是我总是同时使用Eclipse和命令行得到相同的消息: 该文件已正确读取,但测试似乎没有运行。 以下是我的testng.xml的内容: 这是我的目录结构在Eclipse中的样子: 此外,这也是我试图通过命令行运行测试套件的方式: 我尝试过通过eclipse清理项目,但似乎没有帮助。我也试过跑步: < code>mvn clean,但它也没有完成工作

  • POM依赖项 测试套件。xml

  • 执行testng xml时,它在套件中只执行1个测试 基本测试- 登录测试-