【问题标题】:TestNg running multiple suites running multiple times运行多个套件的 TestNg 多次运行
【发布时间】:2026-02-20 18:55:02
【问题描述】:

我有一个高级 XML 文件: 测试.xml

<suite name="allSuites">
  <suite-files>
    <suite-file path="tests.run1.xml" />
  </suite-files>
</suite>

我的意图是使用 org.testng.xml.Parser 解析这个 XML 文件,并为其添加一些信息。

  Parser parser = new Parser(inputXml);
  parser.setLoadClasses(false);
  Collection<XmlSuite> suites = parser.parse();
  XmlSuite parentSuite = suites.iterator().next();   

然后,一旦结构具有所有必要的测试/类,将其传递回 TestNG:

  TestNG testng = new TestNG();
  List<XmlSuite> suitesList = new ArrayList<XmlSuite>();
  suitesList.add(parentSuite);
  testng.setXmlSuites(suitesList);
  testng.run();

我看到的问题是 tests.run1.xml 运行了两次(我只希望它运行一次),甚至没有让第一次运行完成:

[TestNG] Running:
tests.run1.xml
...
[TestNG] Running:
tests.run1.xml
...
[TestNG] Running:
testsng.xml

【问题讨论】:

  • 你是如何触发你的测试的?
  • 我不确定我是否理解您的问题。 testng.run() 将运行测试用例

标签: java testng


【解决方案1】:

我不确定这是否应该被视为 TestNG 中的错误,或者是否应该被视为按设计工作

问题是您正在显式调用解析逻辑来构造List&lt;XmlSuite&gt;,然后将其传递给TestNG。但是由于您创建的 XmlSuite 列表是通过 TestNG 解析器解析的,因此它会将套件文件名的详细信息添加到其中。

现在,当您将此 XmlSuite 插入 TestNG 时,TestNG 会在内部再次对其进行解析,从而再次创建您的子测试套件。这就解释了您的子套件运行两次。

如果您只想丰富/修改套件文件的内容,那么这里有一种更简洁的方法。

  • 确保您使用的是 TestNG v6.11 或更高版本。
  • 构建一个实现 org.testng.IAlterSuiteListener 的 TestNG 侦听器,并在其 alter() 方法中迭代 List&lt;XmlSuite&gt; 并添加丰富逻辑。
  • 您现在可以通过&lt;listeners&gt; 标记(或)通过@Listeners 注释(或)通过服务加载程序注入此侦听器。你可以参考here

我已将此记录为 TestNG 中的错误。错误详情请查看here

您可以参考我在 * 上的回答 here,以获取有关如何使用 IAlterSuiteListener 的示例

【讨论】:

  • 感谢您的反馈!我没有意识到 Parser 代码与 TestNG 对象紧密耦合。我认为它实际上只是一个解析器。然后,您可以修改结构并在准备好时将其传递给 TestNg。让我看看你的建议。
  • 如果有帮助,请接受答案。附带说明一下,这个问题在 TestNG 的最新快照版本中得到了解决,从 TestNG 6.13 开始,您应该能够按原样使用您的原始代码。