我的目标是在每个测试方法之后清除()我的 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);
}
}
在数据提供者“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。但是,它会在 testA
和 testB
的第二次运行(或第二个测试实例)之前从 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 文件中标记的“preserve-order”属性明确指定它。
更新
作为替代方案,您可以使用自己的 TestListiner .您可以实现 onTestStart()方法,如果有必要,它将进行清理。 AFAIU,调用的测试方法在部分填充的 ITestResult 中可用。顺便说一句,小心 - 这可能会导致由隐式测试逻辑引起的问题(测试代码中看不到清除)。
关于java - TestNG:确定下一步是哪些测试方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4720715/