【发布时间】:2011-12-11 19:38:02
【问题描述】:
我有一个 maven 项目和很多 junit 类。我用 Eclipse 开发。我想将功能测试类和集成测试类分开。
当我在 Eclipse 中构建项目时,我只想执行功能测试类。
jenkins 应该执行他们两个。
我应该遵循哪种方法?
【问题讨论】:
标签: unit-testing maven junit integration-testing jenkins
我有一个 maven 项目和很多 junit 类。我用 Eclipse 开发。我想将功能测试类和集成测试类分开。
当我在 Eclipse 中构建项目时,我只想执行功能测试类。
jenkins 应该执行他们两个。
我应该遵循哪种方法?
【问题讨论】:
标签: unit-testing maven junit integration-testing jenkins
我发现将集成测试放在单独的项目中更方便,然后依靠 Maven 的默认生命周期像单元测试一样运行它们。由于我必须针对不同的环境运行测试,因此这种方法可以更轻松地管理特定于环境的测试。
假设我有一个应用程序,由 application Maven 聚合器项目表示,其中包含一个名为 project 的 jar 模块。我将单元测试保存在 project 本身内,以便在我构建应用程序时执行它们。这也是詹金斯每晚建造的;理想情况下,成功的构建应该自动部署到一个或多个测试环境,用于手动和自动测试。目前这是手工完成的。
对于我需要运行集成测试的每个环境,我都有一个applicationTestEnvX Maven 聚合器项目。这至少包含一个projectTest 模块,我在其中保留了那些与环境无关的集成测试,以及任何测试支持代码。我的project 模块特定于环境X 的测试保存在projectTestEnvX 模块中。对于每个applicationTestEnvX 项目,我都有一个 Jenkins 工作,它每晚运行我的测试。理想情况下,这些应该针对应用程序构建的结果运行,但我还没有。
我的项目在 Subversion 和我的 Eclipse 工作区中的存储方式也有直接对应关系,但这是另一回事 ;-)
【讨论】:
application 是一个包含 project 模块的聚合器; applicationTestEnvX 是另一个聚合器,包含 projectTest 和 projectTestEnvX 模块。您可能会为单元测试创建第三个聚合器,但我认为没有必要;如果测试很快,它们可以保留在主项目中,否则将它们移到集成项目中。
看看两个 Maven 插件:Surefire(用于单元测试)和 Failsafe(用于集成测试)。它们彼此非常相似,Failsafe 是 Surefire 的克隆。
组织您的测试,使其命名架构与建议的配置一致:**/*Test.java 用于单元测试,**/*IT.java 用于集成。 Surefire 默认运行,对于故障安全,您需要 POM 中的额外摘录 - 示例和更多信息 in this answer。
然后是mvn test 或mvn 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(或类似的)。
【讨论】:
查看有关集成测试阶段的 maven 文档 - 您可以使用不同的插件来控制运行哪些测试,只需适当地命名测试即可。
然后运行 mvn test 将构建并运行您的代码和单元测试,其中 mvn verify 也将运行您的集成测试。
【讨论】:
您可以将您的单元测试和集成测试分开到单独的包中(或者甚至可能是单独的源文件夹,但是您必须更新您的 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>
【讨论】:
仅供参考,使用TestNG,您只需使用组,例如@Test(groups = "integration") 和 @Test(groups = "unit")。然后,您只需根据需要运行不同的组。
【讨论】: