2017-01-30 22 views
4

我用迁飞来管理我的Spring MVC应用我的数据库的状态测试之间的数据库。Spring MVC的 - 清洁利用迁飞

我已经在我的servlet上下文XML文件中配置完全相同的their docs

<bean id="flyway" class="org.flywaydb.core.Flyway" init-method="migrate"> 
    <property name="dataSource" ref="..."/> 
    ... 
</bean> 

<!-- The rest of the application (incl. Hibernate) --> 
<!-- Must be run after Flyway to ensure the database is compatible with the code --> 
<bean id="sessionFactory" class="..." depends-on="flyway"> 
    ... 
</bean> 

的建议我想要做的两件事情在我的JUnit测试 -

  1. 一次,前所有测试,删除并重新创建数据库并让其重新迁移。这为每个测试套件创建一个干净的数据库。

  2. 每次测试之前,清理所有的数据库表。在其他框架(例如RSpec/Rails)中,我通过事务性地运行DB语句来完成此操作,以便在测试结束时回滚。不确定Spring MVC世界中的最佳实践。

我不知道从哪里开始实施上述,所以任何指导表示赞赏。

谢谢!

回答

8

首先,你可以前每个测试像下面清理数据库:

@Autowired 
Flyway flyway; 

@Before 
puublic void init(){ 
    flyway.clean(); 
    flyway.migrate(); 
} 

其次,你可以利用JdbcTestUtils的从表中删除所有行。 请在这里找到的文档:JDBC测试支持https://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html

,你还可以使用@Rollback @Commit和运行测试方法事务

@Rollback指示是否交易对于事务性测试方法,应在测试方法完成后回滚。如果为true,则交易回滚;否则,交易被提交(另见@Commit)。即使未明确声明@Rollback,Spring TestContext框架中集成测试的回滚语义也会默认为true。

+0

我发现人工清理迁移最可靠和防弹第一种选择。它解决了如果在每次测试之前数据库没有返回到原始状态,那么测试可能会相互影响的问题。 – alebu

2

我的团队使用SpringBoot。它具有内置的Flyway集成。以下任何内容都不一定依赖于SpringBoot,但使用SpringBoot确实可以使其中一些更容易。

对于使用Flyway进行集成测试,我们使用Spring Test以及内存H2数据库。我们使用Spring Profiles来定义它具有H2 JDBC配置一个“integation测试的个人资料。为每个测试启动容器。因此,每个测试都会得到由Flyway创建的干净架构。因为,它在H2的记忆中都没有清理。也不需要可能影响测试行为的事务欺骗。

有一个Flyway/Spring Test annotation library,如果你真的想跳上床,所以在你的集成测试说话,用迁飞。

+0

@FlywayTest注释对于清除每个测试之间的数据库状态并不好,因为它必须(当前)明确地添加到每个需要以干净的版本开始的测试中。将它添加到测试类将只运行一次,大概在第一次测试之前。看来,那么https://stackoverflow.com/a/41929329/854151将是这种用例的更好解决方案。 –