【问题标题】:How to keep Maven integration tests isolated from each other?如何保持 Maven 集成测试彼此隔离?
【发布时间】:2019-06-10 21:18:11
【问题描述】:

我有多个 Maven 集成测试正在更新数据库的状态,这可能会在这些测试之间产生冲突。我想知道是否有办法通过利用 Maven 阶段或任何其他方法来隔离这些集成测试?理想情况下,我希望有一种方法可以在每个集成测试课程之前运行数据库迁移。我使用 Flyway 作为我的 PostgreSQL 数据库的迁移工具,我使用的是 JUnit 4.12。我正在运行的迁移基本上是创建并使用数据填充表以进行测试。

【问题讨论】:

    标签: java database maven integration-testing


    【解决方案1】:

    Junit 有@Before@After 注释,让它在每个测试类之前和之后调用方法。

    然后,这些方法负责在每次测试之前使数据库进入已知状态。

    【讨论】:

    • 使用@Before@After 注释确保运行数据库迁移脚本的最佳方法是什么
    • 在我看来,数据库迁移脚本应该在集成测试开始之前发生(您使用的是框架,对吗?),并且 java 方法应该只负责将表重置为已知状态。跨度>
    • 我明白了,是的,在使用 Maven 开始集成测试之前,我正在使用 Flyway 运行迁移。您是否建议也使用 Flyway 工具从 java 方法中重置表?
    • 我对 flyway 不够熟悉,无法回答这个问题。您可能需要一些可以删除所有行并插入已知测试数据的东西。
    【解决方案2】:

    Maven的职责是在integration-tests阶段一个一个地运行测试,在verify阶段检查结果。它还能够准备/关闭环境。检查failsafe plugin

    测试之间的所有隔离都是您使用的测试框架(JUnit、TestNG、Cucumber 等)的责任。

    【讨论】:

    • 这些测试框架是否可以在每个集成测试类之前强制运行数据库迁移以使数据库恢复到已知状态?
    • 是的,每个框架都有@Before。但是从这个问题中并不清楚你究竟使用什么测试框架以及你想要运行哪种迁移,我只能说这不是 maven 的责任。我建议您针对您的情况提出另一个更详细的问题。
    • 抱歉,我在问题中添加了更多详细信息。我正在使用 Flyway 和 JUnit 4.12。我正在运行的迁移基本上是创建并使用数据填充表以进行测试。
    【解决方案3】:

    我可以使用flyway-core 解决这个问题。基本上,我最终在每个测试类中执行了以下操作:

    @BeforeClass
    public static void migrateDB(){
        Flyway flyway = Flyway.configure().dataSource(url, user, password).load();
        flyway.clean();
        flyway.migrate();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-04
      • 2019-05-06
      • 2016-01-23
      • 2019-08-24
      • 2011-12-11
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多