Spring MVC - 使用Flyway清理测试之间的数据库

13

我在我的Spring MVC应用程序中使用Flyway来管理数据库的状态。

我已经按照他们的文档中的建议在我的servlet context 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. 在每次测试之前,清空所有的DB表格。在其他框架(例如RSpec/Rails)中,我通过以事务方式运行DB语句来实现此目的,以便它们在测试结束时回滚。不确定在Spring MVC世界中最佳做法是什么。

我真的不知道如何开始实施上述内容,所以任何指导都将不胜感激。

谢谢!

2个回答

21

首先,您可以在每次测试之前清理数据库,方法如下:

@Autowired
Flyway flyway;

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

其次,你可以利用JdbcTestUtils从表中删除所有行。你可以在此处找到文档:JDBC testing support https://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html

你也可以利用@Rollback@Commit对测试方法进行事务处理。

@Rollback指示是否应该在测试方法完成后回滚事务。如果为true,则回滚事务;否则,提交事务(还请参阅@Commit)。Spring TestContext Framework的集成测试回滚语义默认为true,即使未显式声明@Rollback。


1
我发现手动清理迁移的第一种选项最可靠和牢固。它解决了测试可能会相互影响的问题,如果在每个测试之前不将数据库返回到其原始状态。 - alebu

2

我的团队使用SpringBoot。它内置了Flyway集成。以下内容并不一定依赖于SpringBoot,但使用SpringBoot确实使其中某些部分更容易。

对于与Flyway的集成测试,我们使用Spring Test,以及一个内存中的H2数据库。我们使用Spring Profiles来定义“集成测试”配置文件,该配置文件具有H2 JDBC配置信息。Spring Test类会为每个测试启动容器。因此,每个测试都会获得由Flyway创建的干净模式来运行。由于所有内容都在H2中的内存中,所以不需要清理。也没有必要进行可能影响测试行为的事务把戏。

如果您真的想要在集成测试中深入使用Flyway,则可以使用Flyway/Spring Test注释库


2
@FlywayTest注释并不适用于在每个测试之间清除数据库状态,因为它必须(当前)明确添加到需要以干净的状态启动的每个测试中。将其添加到测试类中只会运行一次,可能是在第一个测试之前。因此,似乎https://dev59.com/_FgQ5IYBdhLWcg3w-o1w#41929329将是更好的解决方案。 - Anders Rabo Thorbeck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接