在 Maven/Junit/DBUnit 项目的集成测试之前/之后创建/删除数据库的最佳方法?

Posted

技术标签:

【中文标题】在 Maven/Junit/DBUnit 项目的集成测试之前/之后创建/删除数据库的最佳方法?【英文标题】:Best way to create / drop a database before / after integration testing on a Maven/Junit/DBUnit project? 【发布时间】:2011-02-27 13:37:46 【问题描述】:

我看到有些人使用 maven-sql-plugin 来执行此操作。但这似乎是一个更适合 DBUnit 的任务......也许在整个测试套件的开头。

这里的最佳做法是什么?

【问题讨论】:

【参考方案1】:

我使用Maven SQL Plugin

最好使用它并确保在测试之前创建和填充,然后在测试之后删除。如果测试失败并离开数据库处于某种不一致的状态。

【讨论】:

你能举一个DB不一致状态的例子吗?无论如何,它将在下一次测试运行或清理步骤中被丢弃。此外,如果您在构建脚本中使用创建数据库,您将无法从 IDE(至少是 Eclipse)运行一项特定测试,因为您需要手动创建测试数据库。【参考方案2】:

花了一些时间摆弄,但我让它为 H2 和 mysql 删除、创建和创建模式。仍然需要为 Oracle 和 SQL*Server 2008 完成它。我将确切的 DROP 和 CREATE 命令放入属性中,并且在某些情况下(例如 H2)需要完全跳过创建数据库。这是它的样子:

  <plugin>
    <!-- Used to automatically drop (if any) and create a database prior to running integration test cases. -->
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>sql-maven-plugin</artifactId>
    <dependencies>
      <dependency>
        <!-- Adds the correct JDBC driver as a dependency of this plugin -->
        <groupId>$database.groupId</groupId>
        <artifactId>$database.artifactId</artifactId>
        <version>$database.version</version>
      </dependency>
    </dependencies>
    <configuration>
      <!-- common configuration shared by all executions -->
      <driver>$database.class</driver>
      <username>$database.username</username>
      <password>$database.password</password>
      <url>$database.url</url>
    </configuration>
    <executions>
      <execution>
        <!-- Start by dropping the database (we'll leave it intact when finished) -->
        <id>drop-db</id>
        <phase>pre-integration-test</phase>
        <goals>
          <goal>execute</goal>
        </goals>
        <configuration>
          <!-- Can't use regular URL in case database doesn't exist -->
          <url>$database.url.alternate</url>
          <skip>$database.sqlDrop.skip</skip>
          <autocommit>true</autocommit>
          <sqlCommand>$database.sqlDrop;</sqlCommand>
          <onError>continue</onError>
        </configuration>
      </execution>
      <execution>
        <!-- then create a new database -->
        <id>create-db</id>
        <phase>pre-integration-test</phase>
        <goals>
          <goal>execute</goal>
        </goals>
        <configuration>
          <!-- Can't use regular URL in case database doesn't exist -->
          <url>$database.url.alternate</url>
          <skip>$database.sqlCreate.skip</skip>
          <autocommit>true</autocommit>
          <sqlCommand>$database.sqlCreate;</sqlCommand>
          <onError>continue</onError>
        </configuration>
      </execution>
      <execution>
        <!-- and finally run the schema creation script we just made with the hibernate3-maven-plugin -->
        <id>create-schema</id>
        <phase>pre-integration-test</phase>
        <goals>
          <goal>execute</goal>
        </goals>
        <configuration>
          <skip>$database.sqlSchema.skip</skip>
          <autocommit>true</autocommit>
          <srcFiles>
            <srcFile>target/hibernate3/sql/create-$database.vendor-schema.sql</srcFile>
          </srcFiles>
          <onError>continue</onError>
        </configuration>
      </execution>
    </executions>
  </plugin>  

【讨论】:

以上是关于在 Maven/Junit/DBUnit 项目的集成测试之前/之后创建/删除数据库的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

使用 TF-IDF 测试和训练具有不同数量特征的集

今年支付宝的集福字就靠这个了,天天不重样

MSP项目群管理介绍

Swift 学习- 05 -- 集合类型

人工智能数学基础11:集合函数及相关概念补充

Swift-2.4集合类型