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

2022-08-31 14:38:00

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

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

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

我很好奇组织这些测试的最佳方式,这些测试实际上是Maven的集成测试的松散风格。保持这些测试感觉有点肮脏,但从我所读到的内容来看,似乎没有一个一致的策略或实践来组织与Maven的集成测试。src/test/java

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

所以我的问题基本上是 - 与Maven一起组织这个的普遍接受的最佳实践是什么?我在文档中找到任何一致的答案时遇到了麻烦。

我想要的是:

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

答案 1

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

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

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

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

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


答案 2

有一个带有一些指南的codehaus页面。我发现故障安全插件有点黑客攻击,它使在Eclipse中运行单元测试变得非常复杂。我大致按照你所描述的去做。

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

  • 明确的目标/测试类
  • 使用构建-帮助器-maven-插件的添加-测试-源目标来添加最静态的源位置
  • 使用自定义Mojo从配置中删除src / test / java,这样就不会再次编译单元测试(我真的不喜欢这样,但需要它来保持单元测试和集成测试的分离)。
  • 使用编译器插件编译集成测试

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

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

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

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