测试调用:如何设置所有测试套件的通用

时间:2011-11-28 22:40:34

标签: java junit4

如果Class是由Test-Suite发起的,有没有办法知道JUnit 4测试类? 我想在所有测试之前运行全局事物(关于内存数据库),所以我认为在测试套件中这样做。但是,我仍然希望能够在没有测试套件的情况下一次启动一个测试,所以我需要知道是否需要在测试的@Before部分初始化全局事物...是否有人知道如果它是可能的 ?

3 个答案:

答案 0 :(得分:6)

有几种方法可以实现这一目标。最简单和最简单的方法是在套件的开头和结尾运行“测试”,设置数据库,然后设置全局标志。在@Before和@After测试中,您检查此标志,如有必要,请进行设置/拆卸。

@RunWith(Suite.class)
@SuiteClasses({SetupTest.class, RealTest.class, TeardownTest.class});

这是最简单的解决方案,但它不是很好,所以更简洁的解决方案是使用TestRule。看看扩展ExternalResource。这实现了之前和之后在围绕您的测试方法的逻辑之后。这将允许您分解@Before和@After方法,在任何地方重用相同的代码。

然后,对于您的套件,您还需要在逻辑之前/之后实现。遗憾的是,使用@RunWith(Suite.class)注释的类实际上并未实例化,因此您无法使用该类的构造函数,但可以扩展Suite。根据你将如何运行它,你将需要实现一个构造函数,使用@RunWith作为例子:

public class MySuite extends Suite {
    /**
     * Called reflectively on classes annotated with <code>@RunWith(Suite.class)</code>
     * 
     * @param klass the root class
     * @param builder builds runners for classes in the suite
     * @throws InitializationError
     */
    public MySuite(Class<?> klass, RunnerBuilder builder) throws InitializationError {
        this(builder, klass, getAnnotatedClasses(klass));
        // put your global setup here
        // set global variable
    }
}

然后使用

运行测试套件
@RunWith(MySuite.class)

有几种构造函数在不同情况下使用,请查看每个构造函数旁边的注释以了解具体细节。您仍然需要使用全局变量,以便规则不会重新执行设置代码。如果您只想执行设置代码,执行拆卸代码更难,但上述操作可以完成。如果您需要,请告诉我: - )

如果您想要更多灵活性(比如仅针对特定方法执行设置代码),请参阅我对How to define JUnit method rule in a suite?的回答。

答案 1 :(得分:2)

我会使用JUnit的@BeforeClass@AfterClass注释来指明执行此类工作的方法。

来自@BeforeClass Javadoc:

  

有时,多个测试需要共享计算成本高昂的设置   (比如登录数据库)。虽然这可以妥协   测试的独立性,有时候是必要的优化。   使用@BeforeClass注释public static void no-arg方法会导致   它在类中的任何测试方法之前运行一次。该   超级类的@BeforeClass方法将在那些之前运行   现在的课程。

答案 2 :(得分:0)

您可以在每个测试套件中放置一些@BeforeClass代码,该代理委托给执行常规设置的辅助类。辅助类可以有一个static boolean来记录设置是否已经完成。如果它已经完成,辅助类将什么都不做。