代码之家  ›  专栏  ›  技术社区  ›  matt b

与Maven集成测试的最佳实践?

  •  68
  • matt b  · 技术社区  · 16 年前

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

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

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

    不过,我很好奇用Maven组织这些测试的最佳方法,这确实是一种松散的集成测试风格。把这些测试放在里面感觉有点脏 src/test/java 但是根据我读到的,似乎没有一个一致的策略或实践来组织与Maven的集成测试。

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

    所以我的问题基本上是-什么是公认的最佳实践组织这与马文?我在文件中找不到任何一致的答案。

    我想要的是:

    • 将单元测试与集成测试分开,因此在 test 阶段
    • 能够将自定义启动/关闭逻辑绑定到 预集成测试 后集成测试
    • 是否将集成测试的报告与单元测试Surefire报告合并/呈现
    4 回复  |  直到 9 年前
        1
  •  21
  •   Community CDub    8 年前

    就是这样 codehaus page 有一些指导方针。我发现这个故障保护插件有点黑客,它使得在Eclipse中运行单元测试极其复杂。我大致按照你的描述做。

    在SRC/ITES/Java中定义集成测试 在预集成测试阶段:

    • 清除目标/测试类
    • 使用 build-helper-maven-plugin 的添加测试源目标以添加ITest源位置
    • 使用自定义的MOJO从配置中删除SRC/Test/Java,这样单元测试就不会被重新编译(我不是真的喜欢这个,但是它需要保持单元和集成测试的分离)。
    • 使用编译器插件编译集成测试

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

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

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

    更新:我认为值得指出的是,您可以从集成测试中运行Jetty,而不是使用Jetty目标。这使您能够更好地控制测试。您可以从 this answer 以及参考的博客。

        2
  •  26
  •   Community CDub    8 年前

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

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

    这需要几分钟,只需要3步。

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

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

        3
  •  7
  •   hendalst    9 年前

    This good blog post 建议三种选择;

    1)单独的集成测试模块

    2)不同的源目录

    3)不同的文件名模式

    我还没试过这三种方法,所以不能提出我赞成的意见。

        4
  •  1
  •   Pablo Gutierrez    11 年前

    我更喜欢第二个选项,不同的源目录,但是我发现非常恼人的是必须以它结束集成测试或排除包。

    为了避免这种情况,我最终得到了这个配置:

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