【问题标题】:Spring MVC - Cleaning the database between tests using FlywaySpring MVC - 使用 Flyway 在测试之间清理数据库
【发布时间】:2017-06-15 04:45:20
【问题描述】:

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

我在我的 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 世界中的最佳实践是什么。

我不知道从哪里真正开始实施上述内容,因此感谢任何指导。

谢谢!

【问题讨论】:

    标签: java spring spring-mvc junit flyway


    【解决方案1】:

    首先,您可以像这样在每次测试之前清理数据库:

    @Autowired
    Flyway flyway;
    
    @Before
    public 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 指示事务测试方法的事务是否应在测试方法完成后回滚。如果为真,则事务回滚;否则,事务被提交(另见@Commit)。 Spring TestContext Framework 中集成测试的回滚语义默认为 true,即使 @Rollback 没有显式声明。

    【讨论】:

    • 我发现第一个选项是手动清理迁移最可靠和防弹。解决了每次测试前数据库没有恢复到原始状态,测试会互相影响的问题。
    【解决方案2】:

    我的团队使用 SpringBoot。它内置了 Flyway 集成。接下来的一切都不一定依赖于 SpringBoot,但使用 SpringBoot 确实使其中一些变得更容易。

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

    如果您真的想上床睡觉,可以使用 Flyway / Spring Test annotation library,可以说,在您的集成测试中使用 Flyway。

    【讨论】:

    • @FlywayTest 注释对于清理每个测试之间的数据库状态不是很好,因为它必须(当前)显式添加到需要从一个干净的石板开始的每个测试中。将它添加到测试类只会运行一次,大概是在第一次测试之前。那么,stackoverflow.com/a/41929329/854151 似乎是此类用例的更好解决方案。
    猜你喜欢
    • 2018-11-27
    • 2013-04-25
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 2021-09-09
    相关资源
    最近更新 更多