TestNG:确定接下来的测试方法

我的目标是在每个测试方法之后清除()我的javax.persistence.EntityManager。

以下是测试类的示例:

public class Example { @Test(dataProvider = "sampleDataProvider") public void testA(String parameter) { System.out.println(parameter); } @Test(dataProvider = "sampleDataProvider") public void testB(String parameter) { System.out.println(parameter); } } 

通过向DB查询测试数据,然后使用以下格式编译,在dataProvider“sampleDataProvider”中使用entityManager: new Object[2][1] 。 请记住,在实际运行测试方法(使用@DataProvider注释)之前完成数据的查询和编译,并且我们实际上是在查询实体而不仅仅是字符串。

上面的测试类将如下运行:

 testA("some queried entity 1") testA("some queried entity 2") testB("some queried entity 1") testB("some queried entity 2") 

我最初的解决方案是使用@AfterTest注释来清除entityManager。 然而,它会在testAtestB的第二次运行(或第二次测试实例)之前从entityManager中分离"some queried entity 2" ,这会导致对"some queried entity 2"的成员进行读/写操作的问题。

我的目标是在测试方法之后清除entityManager,而不一定在测试方法的每个实例之后清除。

TestNG能否知道接下来要运行哪个测试? 这样,如果下一个测试是新测试,我可以轻松清除entityManager。

还有其他建议吗?

我不知道有什么简单的方法来获得下一个测试方法。 顺便说一下,使用@AfterGroups注释可以获得相同的结果:

 @Test(groups = {"groupA"}) public void testA(...) { ... } @Test(groups = {"groupB"}) public void testB(...) { ... } @AfterGroups(groups = {"groupA"}) public void afterGroupA() { // clear entity manager here } 

注意,TestNG不保证测试开始的顺序,直到您使用@Test批注的dependsOnMethods或dependsOnGroups参数或testng.xml文件中tag的“preserve-order”属性显式指定它。

UPDATE

作为替代方案,您可以使用自己的TestListiner 。 您可以实现onTestStart()方法,如果有必要,将执行清除。 AFAIU,调用的测试方法在部分填充的ITestResult中可用。 顺便说一句,要小心 – 这可能会导致隐式测试逻辑引起的问题(清除将无法从测试代码中看到)。