JUNIT:对于大量测试类,只需运行一次安装程序

2022-09-01 19:08:11

我有一个类,我用它作为我的单元测试的基础。在此类中,我初始化整个环境以进行测试,设置数据库映射,跨多个表输入多个数据库记录等。该类有一个带有@BeforeClass注释的方法,该注释执行初始化。接下来,我使用具有@Test方法的特定类来扩展该类。

我的问题是,由于所有这些测试类的先前类完全相同,我如何确保它们对所有测试仅运行一次。一个简单的解决方案是,我可以将所有测试保存在一个类中。然而,测试的数量是巨大的,它们也是根据功能头进行分类的。因此,它们位于不同的类中。但是,由于它们需要完全相同的设置,因此它们继承了@BeforeClass。因此,整个设置在每个测试类中至少完成一次,总共花费的时间比我想要的要多得多。

不过,我可以将它们全部放在一个包下的各种子包中,因此,如果有一种方法,我如何为该包中的所有测试运行一次设置,那就太好了。


答案 1

使用JUnit4测试套件,您可以执行如下操作:

@RunWith(Suite.class)
@Suite.SuiteClasses({ Test1IT.class, Test2IT.class })
public class IntegrationTestSuite
{
    @BeforeClass
    public static void setUp()
    {
        System.out.println("Runs before all tests in the annotation above.");
    }

    @AfterClass
    public static void tearDown()
    {
        System.out.println("Runs after all tests in the annotation above.");
    }
}

然后,像运行普通测试类一样运行此类,它将运行所有测试。


答案 2

JUnit 不支持此功能,您必须对单例使用标准的 Java 解决方法:将通用安装代码移动到静态代码块中,然后在此类中调用空方法:

 static {
     ...init code here...
 }

 public static void init() {} // Empty method to trigger the execution of the block above

确保所有测试都调用 ,例如我将其放入方法中。或者将静态代码块放入共享基类中。init()@BeforeClass

或者,使用全局变量:

 private static boolean initialize = true;
 public static void init() {
     if(!initialize) return;
     initialize = false;

     ...init code here...
 }

推荐