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

mat*_*t b 68 java testing integration-testing maven-2

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

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

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

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

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

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

我想要的是:

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

小智 26

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

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

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

  1. 定义标记界面
  2. 注释要分割的类
  3. 配置Maven插件.

这里给出了一个完整的例子. /sf/answers/726716371/


Ric*_*ler 21

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

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

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

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

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

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

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

  • 这个答案在2016年仍然有效吗?看起来mvn failsafe插件是一个更好的方法. (5认同)
  • 你真的需要删除单元测试吗?当然,在集成测试时再次运行它们并不是一个坏主意. (2认同)

Mik*_*ike 7

这篇好博文提出了三个选择;

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

2)不同的源目录

3)不同的文件名模式

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

  • 正确的链接是http://javamoods.blogspot.com/2009/12/unit-and-integration-testing-with-maven.html (3认同)