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

时间:2011-10-20 13:42:55

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

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

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

jenkins应该执行它们。

我应该遵循哪种方法?

5 个答案:

答案 0 :(得分:13)

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

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

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

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

答案 1 :(得分:8)

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

组织测试,使其命名架构与建议的配置一致:**/*Test.java用于单元测试,**/*IT.java用于集成。默认情况下运行Surefire,对于Failsafe,您需要在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(或同时)。

答案 2 :(得分:1)

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

然后运行mvn test将构建&amp;运行你的代码&amp;单元测试,mvn验证也将运行集成测试。

答案 3 :(得分:1)

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

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


当我第一次阅读你的问题时,我倒退了。我以为你想在Eclipse中运行完整的套件,而只是在Jenkins中运行一个子集。我将把我的旧答案留下来,以防你发现这有用的方法:

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

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

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

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

答案 4 :(得分:1)

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