我有一个maven项目,里面有很多junit类。我用Eclipse开发。我想分离功能测试类和集成测试类。
当我在Eclipse中构建项目时,我只想要执行功能测试类。
jenkins应该执行它们。
我应该遵循哪种方法?
答案 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 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
(或同时)。
答案 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”)。然后根据您的需要简单地运行不同的组。