在maven中有条件地运行集成测试

时间:2014-09-30 14:27:42

标签: maven testing conditional integration teamcity-8.0

我的Java项目中有一个带有多个集成测试的模块。其中两个是UpgradeDatabase.java和CreateDatabase.java,它们在预集成阶段的每次运行中当前执行。 我想安排这些只运行一次(让我们说每月),因为它们执行时间太长(创建了许多数据库等),我怎样才能实现这一目标? 我的故障安全插件配置如下所示(注意,skip.selenium.tests参数为false):

<plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
            <configuration>
                <forkMode>${tests.forkMode}</forkMode>
                <skip>${skip.selenium.tests}</skip>
                <environmentVariables>
                    ...this area skipped...as it's non important
                </environmentVariables>
                <systemPropertyVariables>
                    <!--<rc.count.firefox>${rc.count.firefox}</rc.count.firefox>-->
                    <selenium.browser>firefox</selenium.browser>
                    <user.home>${env.USERPROFILE}</user.home>
                </systemPropertyVariables>
            </configuration>

            <executions>
                <!--before the tests-->
                <execution>
                    <id>upgrade-the-database</id>
                    <configuration>
                        <includes>
                            <include>**/UpgradeDatabase.java</include>
                        </includes>
                    </configuration>
                    <phase>pre-integration-test</phase>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
                <!--before the tests-->
                <execution>
                    <id>recreate-the-database</id>
                    <configuration>
                        <testFailureIgnore>false</testFailureIgnore>
                        <includes>
                            <include>**/CreateDatabase.java</include>
                        </includes>
                    </configuration>
                    <phase>pre-integration-test</phase>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>

            </executions>
        </plugin>

4 个答案:

答案 0 :(得分:1)

查看Build Profiles

简而言之。用以下内容封闭您的配置:

<profiles>
  <profile>
    <id>monthly</id>

      ... your configuration ...

  </profile>
</profiles>

如果您希望默认激活它,请将其添加到settings.xml

<activeProfiles>
    <activeProfile>monthly</activeProfile>
</activeProfiles>

或者在cmd行上激活它:

mvn -P monthly ...

答案 1 :(得分:0)

如果您使用的是TestNG,我建议您通过测试组来处理。

您可以为每个测试指定测试所属的组/组(例如@Test(groups = { "SlowIntegrationTest" }))。与运行maven时相比,您可以指定应执行哪些组(例如clean test -Dgroups=UnitTest,IntegrationTest)。

当然,这涉及开发人员对正确标记测试的纪律。 但是,如果有人忘记标记测试,它将不会被执行,它应该出现在特定模块的覆盖统计中(这可归结为CI过程的质量)。

答案 2 :(得分:0)

您可以将数据库设置/升级代码移动到new module。然后,您可以使用build profiles在标准版本中隐藏此新模块(即,在没有配置文件的情况下调用Maven时)。在CI服务器上,您可以偶尔(可能每晚)使用-P name运行Maven,以启用应包含新模块的配置文件name

请注意,Maven按照您指定的顺序执行模块,除非它们相互依赖。在第二种情况下,Maven将重新排序模块以确保首先构建依赖关系。

答案 3 :(得分:0)

@misha重新发表你对my previous answer的评论:

  1. 纯外部Maven配置文件激活:

    使用参数 PROFILE 创建常规构建作业参数化,并使用空参数值(如果不支持空值,则只是空格字符) )默认情况下。将此参数添加到mvn cmd行:

    mvn ${PROFILE} ...

    这样,一个空的(或空格)值被添加到你的cmd行,不做任何事情。

    创建一个触发常规的月度构建作业,并使用 -P monthly 值注入此参数,以便常规构建的cmd行变为:

    mvn -P monthly ...
  2. 混合外部和POM内部Maven配置文件激活:

    请参阅5.3. Profile ActivationIntroduction to Build Profiles, Details on profile activation

    在您的个人资料中添加激活部分,如:

    <activation>
      <property>
        <name>monthly</name>
      </property>
    </activation>

    ...并为您的常规版本的mvn cmd行提供适当的属性:

    mvn -D monthly ...

    ...例如,使用上述方法1.