避免在 spring 测试套件中重新 运行 迁移

Avoid re-running migrations in spring test suite

我正在开发一个包含大约 300 多个 spring 集成测试的代码库,这些测试继承自此 class

@RunWith(SpringRunner.class)
@DirtiesContext(classMode=DirtiesContext.ClassMode.BEFORE_CLASS) //enable migration if IT ran before
@ActiveProfiles(Constants.SpringProfiles.TEST)
@SpringBootTest
@Transactional
public abstract class BaseTest extends BaseMockitoTest { .... }

此配置当然会重新初始化完整的 spring 应用程序,这在我们的整体集成套件中会花费大量时间。我想了解是否可以将此配置更改为避免重新初始化上下文的配置。

我已经尝试删除@DirtiesContext,但没有帮助。

我想要的是spring初始化和初始化期间的迁移运行应该保持原样,剩下的东西应该在测试执行时回滚。

"remaining stuff should be rolled back upon test execution" 是什么意思?

通常的方法是不使用 DirtiesContext 而只使用 SpringBootTest 并使您的测试具有事务性,以便它们在每次测试结束时回滚任何添加的数据。参见:

http://docs.spring.io/spring/docs/4.3.7.RELEASE/spring-framework-reference/htmlsingle/#testcontext-tx-enabling-transactions

是的,@DirtiesContext 适合懒惰的人:P - 当初始化时间 and/or 测试用例数量增加时,它会抓住你。

我们的数据库迁移是构建链中的一个单独步骤(包括迁移生产数据)。

在我们 运行 测试用例之前,我们使用当前模式设置数据库 - 这也是链中的一个单独步骤。所以我们的集成测试假设模式是正确的。如果模式创建失败,我们不会 运行 测试,因为报告无论如何都没有意义。

我喜欢这种方法,因为我们可以分别管理和分析集成测试和迁移测试,意思是:集成测试可以 运行,即使迁移失败了。它们可以 运行 并行,因此您应该更早地获得反馈。

编辑:除了 Paul 的声明:我们的一些集成测试在单独的事务中执行任务,我们无法断言这些执行的结果 :-/