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


68

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

我对项目中DAO的“测试”扩展了Spring的功能,AbstractTransactionalDataSourceSpringContextTests以便可以将DataSource连线到我的被测类中,从而能够实际运行查询/休眠逻辑,获取数据等。

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

不过,我对组织这些测试的最佳方法感到好奇,这实际上是使用Maven进行的集成测试的一种松散风格。保留这些测试有点脏src/test/java,但是据我所读,似乎没有一致的策略或实践来组织与Maven的集成测试。

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

所以我的问题基本上是-与Maven一起组织此活动的公认最佳实践是什么?我在文档中找不到任何一致的答案时遇到麻烦。

我想要的是:

  • 将单元测试与集成测试分开,因此在此test阶段仅运行单元测试
  • 可以将自定义启动/关闭逻辑绑定到pre-integration-testpost-integration-test
  • 将来自集成测试的报告与单元测试Surefire报告合并/提交

2
将集成测试移至单独的项目中,并将单元测试与源代码保留在同一项目中。
托尔比约恩Ravn的安德森

Answers:


21

这里有一些准则的codehaus页面。我发现了故障安全插件有点麻烦,它使在Eclipse中运行单元测试异常复杂。我大致按照您的描述进行。

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

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

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

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

随着报告阶段的过去,我还没有找到一种合并测试结果的方法,但是我倾向于将集成测试视为一项额外的奖励,只要它们通过报告就不那么重要了。

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


2
您是否真的需要删除单元测试?当然,在集成测试时再次运行它们并不是一个坏主意。
Michael Rutherfurd,2009年

1
总的来说你是对的。再次运行单元测试没有什么害处,但是我在服务器上有100多个项目,因此必须进行一些优化以管理可用硬件中的负载。
Rich Seller 2009年

公平地说,您有一个非常重要的特殊情况:-)
Michael Rutherfurd,2009年

5
这个答案在2016年仍然有效吗?看起来mvn failsafe插件是更好的选择。
zengr

26

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

然后,您可以在测试阶段轻松地运行一些测试,而在集成测试阶段则可以轻松地运行其他测试。

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

  1. 定义标记界面
  2. 注释您要拆分的班级
  3. 配置Maven插件。

这里给出一个完整的例子。 https://stackoverflow.com/a/10381662/1365383


或者,如果您使用的是TestNG,则可以指定测试组:例如,单位和集成。
凯莫达


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>
.....
.....
.....
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.