2

我的目标是在每个测试方法之后清除()我的 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);
    }
}

entityManager 在 dataProvider "sampleDataProvider" 中使用,通过查询 DB 中的测试数据,然后以这种格式编译: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。但是,它会"some queried entity 2"在第二次运行(或第二次测试实例)之前与 entityManagertestA分离,testB这会导致对"some queried entity 2".

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

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

还有其他建议吗?

4

1 回答 1

0

我不知道有什么简单的方法可以得到下一个测试方法。顺便说一句,您可以使用 @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 或dependOnGroups 参数或testng.xml 文件中标记的“preserve-order”属性明确指定它。

更新

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

于 2011-01-18T05:49:31.870 回答