【问题标题】:How to separate unit testing and integration testing on a maven project如何在 Maven 项目中分离单元测试和集成测试
【发布时间】:2011-12-11 19:38:02
【问题描述】:

我有一个 maven 项目和很多 junit 类。我用 Eclipse 开发。我想将功能测试类和集成测试类分开。

当我在 Eclipse 中构建项目时,我只想执行功能测试类。

jenkins 应该执行他们两个。

我应该遵循哪种方法?

【问题讨论】:

    标签: unit-testing maven junit integration-testing jenkins


    【解决方案1】:

    我发现将集成测试放在单独的项目中更方便,然后依靠 Maven 的默认生命周期像单元测试一样运行它们。由于我必须针对不同的环境运行测试,因此这种方法可以更轻松地管理特定于环境的测试。

    假设我有一个应用程序,由 application Maven 聚合器项目表示,其中包含一个名为 project 的 jar 模块。我将单元测试保存在 project 本身内,以便在我构建应用程序时执行它们。这也是詹金斯每晚建造的;理想情况下,成功的构建应该自动部署到一个或多个测试环境,用于手动和自动测试。目前这是手工完成的。

    对于我需要运行集成测试的每个环境,我都有一个applicationTestEnvX Maven 聚合器项目。这至少包含一个projectTest 模块,我在其中保留了那些与环境无关的集成测试,以及任何测试支持代码。我的project 模块特定于环境X 的测试保存在projectTestEnvX 模块中。对于每个applicationTestEnvX 项目,我都有一个 Jenkins 工作,它每晚运行我的测试。理想情况下,这些应该针对应用程序构建的结果运行,但我还没有。

    我的项目在 Subversion 和我的 Eclipse 工作区中的存储方式也有直接对应关系,但这是另一回事 ;-)

    【讨论】:

    • 您提到的方法确实很有趣。但是詹金斯怎么样。他们怎么能互相交流。我的意思是。我是否应该在 jenkins 上为每个项目创建三个项目(Ori-Project、UnitProject、IntegrationProject)?能不能说的详细一点..?
    • 在这种情况下,我将拥有三个模块(Parentmodule:MyProject,Child1Module:UnitTestProject,Child2Module:IntegrationtestProject)。对吧??
    • Aggregator 和 parent 应该区分开来:aggregator 是需要一起构建的模块的容器;父项目是在项目之间共享设置的一种方式。在我的示例中,application 是一个包含 project 模块的聚合器; applicationTestEnvX 是另一个聚合器,包含 projectTestprojectTestEnvX 模块。您可能会为单元测试创​​建第三个聚合器,但我认为没有必要;如果测试很快,它们可以保留在主项目中,否则将它们移到集成项目中。
    • 就我而言,我必须将集成测试和单元测试分开(组织原因)。这意味着:根据您的解释,我需要四个项目。 - Aggregatorproject - Myproject - IntegrationProject - UnitTestProject
    • 如果您的应用程序适合单个 Maven 项目,则您不需要聚合器,否则我希望您有一个用于源项目的聚合器,一个用于单元测试项目,另一个用于您的集成项目。
    【解决方案2】:

    看看两个 Maven 插件:Surefire(用于单元测试)和 Failsafe(用于集成测试)。它们彼此非常相似,Failsafe 是 Surefire 的克隆。

    组织您的测试,使其命名架构与建议的配置一致:**/*Test.java 用于单元测试,**/*IT.java 用于集成。 Surefire 默认运行,对于故障安全,您需要 POM 中的额外摘录 - 示例和更多信息 in this answer

    然后是mvn testmvn integration-test

    如果您只想在特定环境 (Jenkins) 中运行集成测试,您可以让 Failsafe 仅在配置文件中执行,例如:

    <profiles>
        <profile>
            <id>env-itest</id>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-failsafe-plugin</artifactId>
                     <executions>
                        <execution>
                            <id>integration-test</id>
                            <goals><goal>integration-test</goal></goals>
                        </execution>
                        <!-- other executions, if needed -->
                     </executions>
                </plugin>
            </plugins>
        </profile>
    </profiles>
    

    然后,在 Jenkins 上运行 mvn clean install -P env-itest,而在本地环境中只运行 mvn clean install(或类似的)。

    【讨论】:

    • 实际上,功能测试是单元测试,不需要任何其他类或系统。在我的情况下,集成测试还包括与其他系统的通信等。目标是仅在持续集成服务器(即 jenkins)上进行这些测试。
    • @Kayser 查看我的扩展答案。
    • failsafe 如何知道它只执行以 IT 结尾的测试?
    • 如果我将构建部分添加到配置文件中,我会在 Pom 中收到此错误。

      cvc-complex-type.2.4.a:发现以元素“groupId”开头的无效内容。 '{"http://maven.apache.org/POM/4.0.0":plugin}' 之一是预期的。
    • @Kayser 1. 有关详细信息,请参阅故障安全文档 (maven.apache.org/plugins/maven-failsafe-plugin);它只是内置在插件中,但您可以更改它。 2. 你说得对,我粘贴了太多代码。现已修复。
    【解决方案3】:

    查看有关集成测试阶段的 maven 文档 - 您可以使用不同的插件来控制运行哪些测试,只需适当地命名测试即可。

    然后运行 ​​mvn test 将构建并运行您的代码和单元测试,其中 mvn verify 也将运行您的集成测试。

    【讨论】:

      【解决方案4】:

      您可以将您的单元测试和集成测试分开到单独的包中(或者甚至可能是单独的源文件夹,但是您必须更新您的 Maven 配置以识别您有两个单独的源文件夹用于测试)。

      为了利用这一点,在 Eclipse 的运行配置 (Run > Run Configurations) 中,创建一个新的 JUnit 运行配置“在选定的项目、包或源文件夹中运行所有测试:”,选择包/source 文件夹仅包含您要运行的测试。


      当我第一次阅读你的问题时,我把它倒过来了。我以为你想在 Eclipse 中运行整个套件,而在 Jenkins 中只运行一个子集。我将保留我的旧答案,以防您觉得这很有用:

      我以前这样做的方式是通过 JUnit 测试用例的命名约定。

      我将所有单元测试测试用例命名为...UnitTest(例如RegistrationManagerUnitTest)和集成测试测试用例,我将命名为...IntegrationTest(例如RegistrationDaoIntegrationTest)。

      然后在 Maven 中,您可以将其配置为运行类以 ...UnitTest 结尾的所有测试用例(默认情况下,它会查找名称以 ...Test 结尾的类。类似于以下内容:

      <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <configuration>
              <!-- Run only tests whose name end with "UnitTest" -->
              <includes>
                  <include>**/*UnitTest.java</include>
              </includes>
          </configuration>
      </plugin>
      

      【讨论】:

      • 使用以下后缀是否是一种好的/最佳做法:*UnitTest 和 *IntegrationTest。我觉得这可以通过在组中使用分类功能来克服。我认为 testNG 和 junit 都支持分组。
      【解决方案5】:

      仅供参考,使用TestNG,您只需使用组,例如@Test(groups = "integration") 和 @Test(groups = "unit")。然后,您只需根据需要运行不同的组。

      【讨论】:

      • 嗨塞德里克·比斯特。 TestNG的大师。我必须说TestNG给我留下了非常深刻的印象。 TestNG 的唯一问题是 Eclipse 和 Netbeans 的插件。他们还不够成熟。因此我们选择在我公司使用 JUnit。
      • 现在可以对 junit 类别做同样的事情
      猜你喜欢
      • 2016-01-23
      • 2013-10-23
      • 2014-11-15
      • 2016-10-03
      • 1970-01-01
      • 1970-01-01
      • 2020-02-21
      • 1970-01-01
      • 2012-05-05
      相关资源
      最近更新 更多