如何在maven项目上分离单元测试和集成测试

Kay*_*ser 10 junit integration-testing unit-testing maven jenkins

我有一个maven项目,里面有很多junit类.我用Eclipse开发.我想分离功能测试类和集成测试类.

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

通过詹金斯,他们两个都应该被执行.

我应该遵循哪种方法?

Nic*_*tti 13

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

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

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

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

  • 应区分聚合器和父级:聚合器是需要一起构建的模块的容器; 父项目是一种在项目之间共享设置的方法.在我的例子中,`application`是一个包含`project`模块的聚合器; `applicationTestEnvX`是另一个包含`projectTest`和`projectTestEnvX`模块的聚合器.您可以为单元测试创​​建第三个聚合器,但我认为不需要它; 如果测试很快,它们可以保留在主项目中,否则将它们移动到集成项目中. (2认同)

MaD*_*aDa 8

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

组织测试,使其命名模式符合建议的配置:**/*Test.java单元测试和**/*IT.java集成.默认情况下运行Surefire,对于Failsafe,您需要在POM中提供额外的摘录 - 示例和此答案中的更多信息.

然后它归结为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>
Run Code Online (Sandbox Code Playgroud)

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