Java TestNg运行多次运行的多个套件

Java TestNg运行多次运行的多个套件,java,testng,Java,Testng,我有一个高级XML文件: testsng.xml <suite name="allSuites"> <suite-files> <suite-file path="tests.run1.xml" /> </suite-files> </suite> 我不确定这是否应该被视为TestNG中的一个bug,或者这是否应该被视为按设计工作 问题是您显式地调用解析逻辑来构造列表,然后将其传递到TestNG中。但是由于您创建的Xm

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

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

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

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

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

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

  • 确保您使用的是TestNG v6.11或更高版本
  • 构建一个实现
    org.TestNG.IAlterSuiteListener
    的TestNG侦听器,并在其
    alter()
    方法中,遍历
    列表
    并添加扩展逻辑
  • 现在,您可以通过
    标记(或)通过
    @Listeners
    注释(或)通过服务加载器注入此侦听器。你可以参考更多关于它的信息
我已经在TestNG中记录了这个bug。有关错误详细信息,请参阅


您可以参考我关于StackOverflow的回答,了解如何使用
IAlterSuiteListener

如何触发您的测试?我不确定是否理解您的问题。testng.run()将运行测试用例感谢您的反馈!我没有意识到解析器代码与TestNG对象紧密耦合。我认为它实际上只是一个解析器。然后,您可以修改结构,并在准备就绪时将其传递给TestNg。让我看看你的建议。如果有帮助,请接受答案。另一方面,这个问题在TestNG的最新快照版本中得到了修复,从TestNG 6.13开始,您应该能够按原样使用原始代码。
  Parser parser = new Parser(inputXml);
  parser.setLoadClasses(false);
  Collection<XmlSuite> suites = parser.parse();
  XmlSuite parentSuite = suites.iterator().next();   
  TestNG testng = new TestNG();
  List<XmlSuite> suitesList = new ArrayList<XmlSuite>();
  suitesList.add(parentSuite);
  testng.setXmlSuites(suitesList);
  testng.run();
[TestNG] Running:
tests.run1.xml
...
[TestNG] Running:
tests.run1.xml
...
[TestNG] Running:
testsng.xml