我有一个用Maven构建的项目,它使用Hibernate(和Spring)从数据库中检索数据等。
我项目中DAO的“测试”扩展了Spring的AbstractTransactionalDataSourceSpringContextTests
,因此可以将DataSource连接到我的测试类中,以便能够实际运行查询/ Hibernate逻辑,获取数据等。
在其他几个项目中,我使用这些类型的测试与HSQL数据库(内存中或指向文件)一起使用,以便能够有效地测试实际的数据库查询逻辑,而无需依赖外部数据库。这很有用,因为它可以避免任何外部依赖关系,并且在运行测试之前数据库的“状态”(每个都包含在回滚的事务中)都已得到很好的定义。
我很好奇关于组织这些测试的最佳方法,这些测试对于Maven来说实际上是一种松散的集成测试。将这些测试保留在src/test/java
中感觉有点脏,但从我所读到的内容来看,似乎没有一个与Maven组织集成测试的一致策略或实践。
从我到目前为止所看到的,似乎我可以使用Failsafe plugin(或Surefire的第二个实例)并将其绑定到integration-test
阶段,并且我也可以绑定自定义启动或关闭逻辑(例如用于启动/停止HSQL实例)到pre-integration-test
或post-integration-test
。但是,这真的是最好的方法吗?
所以我的问题基本上是 - 用Maven组织这个的普遍接受的最佳做法是什么?我在文档中找不到任何一致的答案。
我想要的是:
test
阶段只运行单元测试pre-integration-test
和post-integration-test
答案 0 :(得分:26)
一种非常简单的方法是使用JUnit类别。
然后,您可以在测试阶段轻松运行一些测试,在集成测试阶段可以轻松运行另一个测试。
这需要几分钟,只需要3个步骤。
这里给出了一个完整的例子。 https://stackoverflow.com/a/10381662/1365383
答案 1 :(得分:21)
这个codehaus page有一些指导方针。我发现故障安全插件有点破解,这使得在Eclipse中运行单元测试变得非常复杂。我广泛地描述你所描述的内容。
在src / itest / java中定义集成测试 在预集成测试阶段:
然后在集成测试阶段,使用surefire-plugin运行测试。
最后,将任何整齐的目标绑定到集成后测试阶段(尽管通常不需要它们,因为您可以使用测试拆解()来整理)。
由于报告阶段已经过去,我还没有找到合并测试结果的方法,但是我 倾向于将集成测试视为额外的奖励,因此只要他们通过报告就不那么重要了。
更新:我认为值得指出的是,您可以在集成测试中运行Jetty,而不是使用jetty目标。这使您可以更好地控制测试。您可以从this answer和引用的博客中获取更多详细信息。
答案 2 :(得分:7)
答案 3 :(得分:1)
我更喜欢第二个选项,不同的源目录,但我发现非常讨厌必须以IT结束集成测试或排除包。
为了避免这种情况,我最终得到了这个配置:
<properties>
<testSource>src/test/java</testSource>
<testSourceResource>src/test/resources</testSourceResource>
</properties>
<build>
<testSourceDirectory>${testSource}</testSourceDirectory>
<testResources>
<testResource>
<directory>${testSourceResource}</directory>
</testResource>
</testResources>
.....
.....
然后我覆盖不同配置文件中的两个变量以进行集成和验收测试:
<profiles>
<profile>
<id>acceptance-tests</id>
<properties>
<testSource>src/acceptance-test/java</testSource>
<testSourceResource>src/acceptance-test/resources</testSourceResource>
</properties>
</profile>
<profile>
<id>integration-tests</id>
<properties>
<testSource>src/integration-test/java</testSource>
<testSourceResource>src/integration-test/resources</testSourceResource>
</properties>
</profile>
.....
.....
.....