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 报告合并/呈现
4

4 回答 4

26

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

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

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

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

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

于 2011-07-04T14:42:23.003 回答
21

这个codehaus 页面有一些指导方针。我发现故障安全插件有点小技巧,它使在 Eclipse 中运行单元测试变得异常复杂。我大致按照您的描述进行。

在 src/itest/java 中定义集成测试 pre-integration-test 阶段:

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

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

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

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

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

于 2009-08-04T18:44:06.303 回答
7

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

1) 集成测试的独立模块

2)不同的源目录

3) 不同的文件名模式

我还没有尝试所有三个,所以不能提供我喜欢的意见。

于 2010-07-19T10:12:11.937 回答
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>
.....
.....
.....
于 2013-09-06T10:15:35.523 回答