我加入了一个项目,其中包含大量带有SQL语句的文件,用于创建用于集成测试的数据库。
我想知道如何使用这些文件为单元测试创建数据库 (使用java和maven)。
我可以为每个单元测试创建一个HSQL内存数据库,甚至可以使用spring jdbc嵌入式数据库功能,但是在测试设置中要执行的SQL语句太多,这是不可扩展的。
所以我想在maven测试阶段开始时创建一个临时数据库(加载SQL语句),让单元测试访问这个临时数据库并执行各种操作,然后在最后删除临时数据库maven测试阶段。
我看过sql-maven-plugin,它允许我进行测试阶段执行,但我不确定如何配置一个可用于所有单元测试的临时数据库。没有服务器可以连接,并且内存数据库不能在多个单元测试中工作(我假设)。
一种选择可以是使用唯一的临时文件,例如将JDBC驱动程序URL指定为jdbc:hsqldb:file:/ path / to / temporary / file,但我不确定如何在maven中生成唯一的临时文件。
有关如何执行此操作的建议,或者是否有更好的方法?
更新:我决定使用在target / db目录中创建的基于文件的数据库。我使用maven clean插件在运行测试之前删除target / db目录,并使用maven sql插件从脚本创建数据库。
答案 0 :(得分: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。
答案 1 :(得分:0)
为什么不创建磁盘上的H2数据库,并让每个测试访问它?只要测试不并行运行或相互交互,您就不需要服务器。
更重要的是:只需在@Before中创建内存数据库并在@After中删除它们。你确定那太慢了吗?
在预集成测试中,您可以启动H2(或derby)服务器,并在集成后测试中将其关闭。
您可以编写一个使用会话状态来跟踪嵌入式数据库服务的maven插件,但这与(3)非常相似。