5

我加入了一个项目,该项目有很多带有 SQL 语句的文件,用于创建用于集成测试的数据库。

I'm wondering how I can use these files to create a database for unit testing (using java and maven).

I can create a HSQL in-memory database for each unit test, or even use the spring jdbc embedded-database feature, but there's so many SQL statements to execute in the test setup that this is not scalable.

So I'd like to create a temporary database (that loads the SQL statements) at the start of the maven test phase, have the unit tests access this temporary database and perform various operations, then delete the temporary database at the end of the maven test phase.

我查看了允许我执行测试阶段的 sql-maven-plugin,但我不确定如何配置一个可用于所有单元测试的临时数据库。没有要连接的服务器,内存数据库无法跨多个单元测试工作(我假设)。

一种选择是使用唯一的临时文件,例如将 JDBC 驱动程序 URL 指定为 jdbc:hsqldb:file:/path/to/temporary/file,但我不确定如何在 maven 中生成唯一的临时文件。

关于如何做到这一点的任何建议,或者是否有更好的方法可以采取?

更新:我决定使用在 target/db 目录中创建的基于文件的数据库。我使用 maven clean 插件在运行测试之前删除 target/db 目录,并使用 maven sql 插件从脚本创建数据库。

4

2 回答 2

3

对于这种情况,我创建了derby-maven-plugin。它可从 Maven Central 获得,因此您无需添加任何额外的存储库或任何东西。

你可以像这样使用它:

    <project ...>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.carlspring.maven</groupId>
                    <artifactId>derby-maven-plugin</artifactId>
                    <version>1.8</version>
                    <configuration>
                        <basedir>${project.build.directory}/derby</basedir>
                        <port>1527</port>
                    </configuration>
                    <executions>
                        <execution>
                            <id>start-derby</id>
                            <phase>pre-integration-test</phase>
                            <goals>
                                <goal>start</goal>
                            </goals>
                        </execution>
                        <execution>
                            <id>stop-derby</id>
                            <phase>post-integration-test</phase>
                            <goals>
                                <goal>stop</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>

有关更多信息,您还可以查看USAGE

于 2013-02-26T12:22:06.820 回答
0
  1. 为什么不创建一个磁盘 H2 数据库,并让每个测试访问它?只要测试不并行运行或相互交互,您就不需要服务器。

  2. 更重要的是:只需在@Before 中创建内存数据库并在@After 中删除它们。你确定这太慢了吗?

  3. 在 pre-integration-test 中,您可以启动 H2(或 derby)服务器,并在 post-integration-test 中将其关闭。

  4. 您可以编写一个使用会话状态来跟踪嵌入式数据库服务的 maven 插件,但这与 (3) 大致相同。

于 2013-02-06T14:23:12.500 回答