使用Maven进行集成testing的最佳实践?
我有一个使用Hibernate(和Spring)从数据库中检索数据的Maven构build的项目。
我在我的项目中对DAO的“testing”扩展了Spring的AbstractTransactionalDataSourceSpringContextTests
以便DataSource可以连接到我的类下,以便能够实际运行查询/ Hibernate逻辑,获取数据等。
在其他几个项目中,我使用这些types的testing与HSQL数据库(内存中或指向文件)配合使用,以便能够高效地testing实际的数据库查询逻辑而不依赖于外部数据库。 这样做效果很好,因为它避免了任何外部依赖和数据库在运行testing之前的状态(每个testing都被包装在一个回退的事务中)。
我很好奇最好的方式来组织这些testing,这实际上是一个松散的集成testing的味道,与Maven。 将这些testing保存在src/test/java
感觉有点肮脏,但是从我读过的内容来看,似乎没有一个一致的策略或者用Maven组织集成testing的做法。
从我目前阅读的内容来看,似乎我可以使用Failsafe插件 (或Surefire的第二个实例)并将其绑定到integration-test
阶段,并且还可以绑定自定义启动或closures逻辑(例如至于启动/停止HSQL实例)进行pre-integration-test
或post-integration-test
。 但是,这真的是最好的方法吗?
所以我的问题基本上是 – 在Maven中组织这个最普遍的做法是什么? 我无法在文档中find任何一致的答案。
我想要的是:
- 从集成testing分开unit testing,所以在
test
阶段只运行unit testing - 将自定义启动/closures逻辑绑定到
pre-integration-test
和post-integration-test
- 将集成testing的报告合并/提交给unit testingSurefire报告
有这个codehaus页面的一些指导方针。 我发现这个故障安全插件有点破解,并且使Eclipse中的unit testing运行起来非常复杂。 我广泛地描述你所描述的。
在src / itest / java中定义集成testing在集成前testing阶段:
- 清除目标/testing类
- 使用build-helper-maven-plugin的add-test-source目标来添加最新的源位置
- 使用自定义的Mojo从configuration中删除src / test / java,这样unit testing不会再被编译(我不太喜欢这个,但是需要保持单元和集成testing的分离)。
- 使用编译器插件编译集成testing
然后在集成testing阶段,使用surefire-plugin运行testing。
最后,将任何整理好的目标绑定到整合后testing阶段(尽pipe通常他们不是必需的,因为您可以使用testingteardown()来整理)。
在报告阶段过去之前,我还没有find合并testing结果的方法,但是我倾向于将集成testing视为额外的奖励,只要他们通过报告并不重要。
更新:我认为值得指出的是,您可以在集成testing中运行Jetty,而不是使用docker目标。 这样可以更好地控制testing。 你可以从这个答案和引用的博客中获得更多的细节。
这样做的一个非常简单的方法是使用JUnit类别。
然后您可以在testing阶段轻松地运行一些testing,而在整合testing阶段则可以轻松运行一些testing。
它需要几分钟,只需要3个步骤。
- 定义一个标记界面
- 注释你想分裂的类
- configurationMaven插件。
这里给出一个完整的例子。 https://stackoverflow.com/a/10381662/1365383
这个好博客提出了三个select。
1)用于集成testing的独立模块
2)不同的源目录
3)不同的文件名称模式
我还没有尝试所有三个,所以不能提供我赞成的意见。
我更喜欢第二个选项,不同的源代码目录,但是我发现很烦人的是必须以IT结束集成testing或排除软件包。
为了避免这种情况,我已经结束了这个configuration:
<properties> <testSource>src/test/java</testSource> <testSourceResource>src/test/resources</testSourceResource> </properties> <build> <testSourceDirectory>${testSource}</testSourceDirectory> <testResources> <testResource> <directory>${testSourceResource}</directory> </testResource> </testResources> ..... .....
然后我重写不同configuration文件中的两个variables进行集成和验收testing:
<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> ..... ..... .....