在 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 项目的集成测试之前/之后创建/删除数据库的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章