【问题标题】:Dropping H2 in memory DB between integeration tests in maven在 Maven 中的整数测试之间将 H2 删除到内存 DB 中
【发布时间】:2012-01-06 14:54:45
【问题描述】:

我有以下情况。 我有一个 Hibernate-Spring 项目,它适用于生产环境的 mySQL,并使用 H2 内存数据库进行集成测试,它是动态创建的。 目前,当我使用 maven 运行整数测试时,会出现错误,因为数据库是在测试之间维护的。这是不可接受的,因为我计划我的测试在一个新的数据库上运行。 如何在测试之间强制删除数据库中的所有数据? 有没有办法告诉 maven 删除模式并为每个测试文件再次生成它?

【问题讨论】:

    标签: spring maven h2


    【解决方案1】:

    我会看看Spring's support for embedded databases。您可以让 Spring 为您创建和设置数据库,并让您以简单的DataSource 访问它。您真正需要做的就是提供创建/填充数据库的 sql 脚本,并且每次运行都会重新创建数据库。

    <jdbc:embedded-database id="dataSource" type="h2">
        <jdbc:script location="classpath:schema.sql"/>
        <jdbc:script location="classpath:test-data.sql"/>
    </jdbc:embedded-database>
    

    不要忘记jdbc 命名空间:

    http://www.springframework.org/schema/jdbc
    http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
    

    【讨论】:

      【解决方案2】:

      您如何运行集成测试? Spring 内置了对transactional 测试的支持。您也可以在每次测试后手动 DROP 并重新创建数据库,这非常简单:

      SCRIPT NOPASSWORDS DROP TO 'file.sql'
      

      然后使用以下命令恢复它:

      RUNSCRIPT FROM 'file.sql'
      

      我猜几乎每个测试框架JUnit/TestNG/Fitensse/Selenium/... 都允许在所有测试之前和之后运行一些自定义代码。

      Here 是我的博客文章,解释了它的工作原理以及ScalaTest 的示例设置。

      【讨论】:

      • 你说得对,实际上我使用的是带有 Spring 上下文的 JUnit 4。我在测试开始之前在数据库中填充参考数据。问题是该引用数据导致错误,因为其他测试的插入语句导致唯一约束错误。我不能执行“如果不存在则插入”,因为 SQL 中没有对此的标准,而且 mySQL 和 H2 的语法不同。所以我只能选择删除整个架构。
      猜你喜欢
      • 2017-03-05
      • 2014-12-20
      • 2012-01-01
      • 2022-11-13
      • 2012-12-12
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      相关资源
      最近更新 更多