【问题标题】:Integration test before others在其他人之前进行集成测试
【发布时间】:2013-08-30 14:14:55
【问题描述】:

我有一堆集成测试需要在运行之前填充数据库。此任务大约需要 30 分钟,因此在每次测试之前运行它是不可行的。

我正在使用 junit,我希望能够用一些东西来注释这个类,以便它在其他类开始之前运行和完成。这可能吗?

(我发现的大多数注释只适用于方法,例如@Rule)

【问题讨论】:

  • 我认为集成测试不应该测试您的整个填充数据。集成测试通常应该在开始时创建自己的测试数据,并在测试完成后清理它们。响应预填充数据的集成测试很难维护。我认为您只需要构建您的架构,并且每个测试都应该创建自己的小型数据集供自己使用,并在测试完成后清理它们。
  • @KZhang 这是进行测试所需的最小数据集,由于各种原因无法按照您所说的进行(我会按照您所说的进行)可能...确实看到我为 Scala 固定装置所做的 akka-patterns 贡献)。

标签: java junit integration-testing


【解决方案1】:

我过去通过向各个测试类添加设置和拆卸函数来完成此操作,并使用@BeforeClass@AfterClass 进行注释。

@BeforeClass
public static void setupBeforeClass() {
    DatabasePopulater.populate();
}

@AfterClass
public static void tearDownAfterClass() {
    DatabasePopulater.dePopulate();
}

如果多个测试类需要进行相同的设置,设置函数可以进行一种引用计数,以确保它们只在第一次调用时才完成工作:

public class DatabasePopulater {
    AtomicInteger invocations = new AtomicInteger();
    ....

    public static void populate() {
        if (0 == ivocations.getAndIncrement()) {
            // Actually populate DB
        }
    }

    public static void dePopulate() {
        if (0 == ivocations.decrementAndGet()) {
            // Actually clear DB
        }
    }

【讨论】:

  • 这就是我目前正在做的事情(来自所有集成测试都继承自的抽象类)...我正在寻找不涉及并发管理的更简洁的东西。
【解决方案2】:

如果您使用 ant/gradle 之类的工具来执行测试套件,您可以将 db 填充分离到一个独立的 java 程序中,然后在 junit 任务上使用depends="populateDB"。

【讨论】:

  • 谢谢。该解决方案必须在 IntelliJ、Eclipse 和高度定制的企业 ant 框架(我无法控制)中运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-12
  • 2020-01-02
  • 2013-11-15
相关资源
最近更新 更多