在TestNG的一个测试suite中,可能存在多个<test>,那么在不同的<test>标签内部的测试类,其之间如何共享动态中间数据呢?
比如在一个<test>中的一个测试类Producer中,一个测试方法产生了中间数据groupIds;而在后续另一个<test>中的一个测试类Consumer中,一个测试方法要访问这个中间数据。测试套件如下:
<suite>
<test>
<classes>
<class name= "Producer"/>
</classes>
</test>
<test>
<classes>
<class name= "Consumer"/>
</classes>
</test>
</suite>
这个问题在TestNG的文档和JavaDoc中都没有明确的提及。但是在分析TestNG的JavaDoc的过程中,通过查找IAttributes的子接口,ISuite接口映入眼帘。
在TestNG的JavaDoc中,一个ISuite对象就代表一个<suite>标签内的上下文。因而在一个<suite>中的多个<test>标签,可以通过ISuite对象共享数据。
回到TestNG的文档,我们在5.19依赖注入章节中,可以看到一个TestNG标注与可注入参数类型表,如下所示。但是,我强烈怀疑这个表的正确性,其中的XmlTest应该就是ISuite,因为想象不出什么时候会用到XmlTest。
但是无奈,SuiteRunner就是这么规定的,提示信息如下:
Can inject only one of <ITestContext, XmlTest> into a @BeforeClass annotated ...
Can inject only one of <ITestContext, XmlTest> into a @AfterClass annotated ...
幸好有Google,我找到了正解,借助于特立独行的org.testng.Reporter类的静态方法获取当前ISuite对象,然后就顺理成章了。
验证过程如下。
生产数据的测试类Producer,在任何需要设置中间数据的方法中:
...
public static final String SERVER_GROUPS = "SERVER_GROUPS";
ISuite suite = Reporter.getCurrentTestResult().getTestContext().getSuite();
suite.setAttribute(SERVER_GROUPS, groupIds);
...
消费数据的测试类Consumer,在任何需要获取中间数据的方法中:
...
public List<String> groupIds;
ISuite suite = Reporter.getCurrentTestResult().getTestContext().getSuite();
groupIds = (List<String>) suite.getAttribute(attributeName);
...
参考链接:
http://testng.org/doc/documentation-main.html
https://javadoc.jitpack.io/com/github/cbeust/testng/master/javadoc/
https://groups.google.com/forum/#!topic/testng-users/-ERbCt4vd0w