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

时间:2017-03-17 10:23:54

标签: spring spring-boot junit integration-testing

我正在开发一个代码库,该代码库有大约300多个Spring集成测试,继承自这个类

@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初始化和迁移应该保持原样,剩下的东西应该在测试执行时回滚。

2 个答案:

答案 0 :(得分:2)

你是什么意思"剩余的东西应该在测试执行时回滚" ?

正常的方法是不要使用DirtiesContext而只需要SpringBootTest,并使测试成为事务性的,以便在每次测试结束时回滚任何添加的数据。参见:

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

答案 1 :(得分:2)

Yeeh,@ DirtiesContext用于懒惰:P - 当初始化时间和/或测试用例数量增加时,它会抓住你。

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

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

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

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