使用Maven进行集成测试的最佳实践?

时间:2009-08-04 17:00:22

标签: java testing maven-2 integration-testing

我有一个用Maven构建的项目,它使用Hibernate(和Spring)从数据库中检索数据等。

我项目中DAO的“测试”扩展了Spring的AbstractTransactionalDataSourceSpringContextTests,因此可以将DataSource连接到我的测试类中,以便能够实际运行查询/ Hibernate逻辑,获取数据等。

在其他几个项目中,我使用这些类型的测试与HSQL数据库(内存中或指向文件)一起使用,以便能够有效地测试实际的数据库查询逻辑,而无需依赖外部数据库。这很有用,因为它可以避免任何外部依赖关系,并且在运行测试之前数据库的“状态”(每个都包含在回滚的事务中)都已得到很好的定义。

我很好奇关于组织这些测试的最佳方法,这些测试对于Maven来说实际上是一种松散的集成测试。将这些测试保留在src/test/java中感觉有点脏,但从我所读到的内容来看,似乎没有一个与Maven组织集成测试的一致策略或实践。

从我到目前为止所看到的,似乎我可以使用Failsafe plugin(或Surefire的第二个实例)并将其绑定到integration-test阶段,并且我也可以绑定自定义启动或关闭逻辑(例如用于启动/停止HSQL实例)到pre-integration-testpost-integration-test。但是,这真的是最好的方法吗?

所以我的问题基本上是 - 用Maven组织这个的普遍接受的最佳做法是什么?我在文档中找不到任何一致的答案。

我想要的是:

  • 从集成测试中分离单元测试,因此在test阶段只运行单元测试
  • 将自定义启动/关闭逻辑绑定到pre-integration-testpost-integration-test
  • 的功能
  • 将集成测试的报告与单元测试Surefire报告合并/提交

4 个答案:

答案 0 :(得分:26)

一种非常简单的方法是使用JUnit类别。

然后,您可以在测试阶段轻松运行一些测试,在集成测试阶段可以轻松运行另一个测试。

这需要几分钟,只需要3个步骤。

  1. 定义标记界面
  2. 注释要拆分的课程
  3. 配置Maven插件。
  4. 这里给出了一个完整的例子。 https://stackoverflow.com/a/10381662/1365383

答案 1 :(得分:21)

这个codehaus page有一些指导方针。我发现故障安全插件有点破解,这使得在Eclipse中运行单元测试变得非常复杂。我广泛地描述你所描述的内容。

在src / itest / java中定义集成测试 在预集成测试阶段:

  • 清除目标/测试类
  • 使用build-helper-maven-plugin的add-test-source目标添加itest源位置
  • 使用自定义Mojo从配置中删除src / test / java,这样单元测试就不会再次编译了(我真的不喜欢这个,但是需要保持单元测试和集成测试的分离)。
  • 使用compiler-plugin编译集成测试

然后在集成测试阶段,使用surefire-plugin运行测试。

最后,将任何整齐的目标绑定到集成后测试阶段(尽管通常不需要它们,因为您可以使用测试拆解()来整理)。

由于报告阶段已经过去,我还没有找到合并测试结果的方法,但是我 倾向于将集成测试视为额外的奖励,因此只要他们通过报告就不那么重要了。

更新:我认为值得指出的是,您可以在集成测试中运行Jetty,而不是使用jetty目标。这使您可以更好地控制测试。您可以从this answer和引用的博客中获取更多详细信息。

答案 2 :(得分:7)

This good blog post建议三个选项;

1)用于集成测试的单独模块

2)不同的源目录

3)不同的文件名模式

我还没试过这三个,所以不能提出我赞成的意见。

答案 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>
.....
.....
.....