2009-08-04 40 views
64

我有我使用Maven构建一个项目,该项目使用Hibernate(和Spring)从数据库中检索数据等使用Maven进行集成测试的最佳做法?

我的“测试”为我的项目中的DAO扩展Spring的AbstractTransactionalDataSourceSpringContextTests,这样一个数据源可以被连接到我测试的类中,以便能够实际运行查询/休眠逻辑,获取数据等。

在其他几个项目中,我使用这些类型的测试与HSQL数据库 - 内存或指向文件)能够高效地测试实际的数据库查询逻辑而不依赖于外部数据库。这很好,因为它避免了任何外部依赖和运行测试之前数据库的“状态”(每个测试都被包装在一个回退的事务中)。

我很好奇,但有关组织这些测试,这是真正的集成测试松散的味道,与Maven的最佳途径。将这些测试保存在src/test/java中感觉有点肮脏,但从我读过的内容来看,这似乎没有一个与Maven一起组织集成测试的一致策略或实践。

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

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

我想是:从集成测试

  • 独立的单元测试,所以只有单元测试在test阶段
  • 自定义开机/关机逻辑结合pre-integration-test的能力运行, post-integration-test
  • 已经从集成的测试报告合并/带有单元测试神火报告
+2

移动集成测试中一个单独的项目并将单元测试与源代码保持在同一项目中。 – 2014-02-06 13:59:03

回答

20

有一些指导原则codehaus page。我发现这个故障安全插件有点破解,它让Eclipse中的单元测试运行起来非常复杂。我广泛地描述你所描述的内容。

在SRC定义集成测试/ ITEST/JAVA 在预集成测试阶段:

  • 清除目标/测试类
  • 使用build-helper-maven-plugin的附加测试源目标添加ITEST源位置
  • 使用自定义的Mojo从配置再次删除的src/test/java下这样的单元测试不编译(我真的不喜欢这样,但它需要保持单元和集成的分离测试)。
  • 使用编译器插件编译集成测试

然后在集成测试阶段,使用神火-插件来运行测试。

最后,将任何整理好的目标绑定到整合后测试阶段(尽管通常它们不是必需的,因为您可以使用test teardown()来整理)。

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

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

+2

你真的需要删除单元测试吗?当然,在集成测试时再次运行它们并不是一个坏主意。 – 2009-08-05 09:29:03

+1

一般而言,你是对的。再次运行单元测试并没有什么坏处,但是我已经在服务器上安装了100多个项目,并且必须做一些优化来管理可用硬件中的负载。 – 2009-08-05 09:32:33

+0

够公平的,你有一个相当重要的特例:-) – 2009-08-06 00:45:28

6

This good blog post建议三个选项;

1)集成测试单独的模块

2)不同的源目录

3)不同的文件名模式

我还没有尝试所有这三个,所以不能提供意见我赞成。

25

这样做的一个非常简单的方法是使用JUnit类别。

然后,您可以在测试阶段轻松地运行一些测试,而在整合测试阶段则可以轻松地运行一些测试。

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

  1. 定义标记接口
  2. 注释要拆分
  3. 配置Maven插件的类。

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

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