2014-09-30 42 views
0

我的Java项目中有一个模块,具有多个集成测试。其中两个是UpgradeDatabase.java和CreateDatabase.java,它们在预集成阶段的每次运行中都会执行。 我想安排这些只在一段时间内运行一次(比方说每月),因为它们执行时间太长(很多数据库创建等),我该如何实现这一目标? 我的故障安全插件配置看起来是这样的(注意,该skip.selenium.tests参数为false):Maven集成测试的有条件运行

<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> 
+0

您使用的是JUnit还是TestNG? – luboskrnac 2014-09-30 14:45:07

+0

我正在使用JUnit – misha 2014-10-02 12:42:18

回答

0

如果使用TestNG的,我会建议通过测试组来处理这个问题。

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

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

1

看看Build Profiles

总之。与附上您的配置:

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

     ... your configuration ... 

    </profile> 
</profiles> 

将它添加到您的settings.xml,如果你希望它在默认情况下被激活:

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

或激活它的CMD线:

mvn -P monthly ... 
+0

Gerold,我没有在这里找到你的解决方案。 首先,你想要的是什么settings.xml? 是%USER_HOME%/。m2/settings.xml或%M2_HOME%/ conf/settings.xml – misha 2014-10-02 12:51:20

+0

@misha您是否阅读过我链接到的_complete_章节? Re'settings.xml':如果你想通过cmd行激活配置文件,你不需要'settings.xml'中的这个设置。这是一个额外的信息,以防万一...如果你想使用它,这取决于你是否希望配置可用于所有或只是特定用户在计算机上,请参阅[Maven,设置参考,快速浏览](https://maven.apache.org/settings.html):_“如果两个文件都存在,它们的内容会被合并,而用户特定的settings.xml占据主导地位。”_ – 2014-10-02 13:38:25

+0

但是我只有一个在我的CI环境中构建配置,因此我仍然必须手动激活/禁用配置文件,以便使用新的数据库设置我的环境。我真正需要的是完全自动化,也许使用一些脚本来检查一个月的第一天并触发另一个配置文件的执行(其中包括我的UpgradeDatabase.java和CreateDatabase.java测试) – misha 2014-10-02 14:12:58

0

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

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

+0

仅仅因为我很好奇:为什么你建议迁移到新模块?如果我没有激活一个配置文件,无论配置文件所在的位置如何,它的配置都不会激活。 – 2014-09-30 15:19:00

+0

这只是另一种选择。当插件的配置很复杂时(比如保持XML简单),或者当我想分离那些根本不属于同一模块的东西(比如单元测试和集成测试)时,我更喜欢使用模块。 – 2014-10-01 08:15:07

0

@misha重新您的评论对my previous answer

  1. 纯外部的Maven轮廓激活:

    使常规构建工作参数与参数PROFILE,例如,和一个空参数值(或只是空格字符,如果不支持空值)作为默认值。这个参数添加到您的MVN CMD行:

    mvn ${PROFILE} ...

    这样,一个空的(或空间)值被添加到您的CMD线做什么都没有。

    创建触发规则并注入此参数的-P月值,让你的常规构建的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 ...

    ...使用例如,上面的方法。

+0

我创建了一个覆盖故障安全插件并执行初始化测试的配置文件,但在TeamCity中,我无法根据每月计划激活该配置文件,即我可以触发每月构建,但无法注入该参数-P月。请注意,我正在使用TeamCity 8.1.3 – misha 2014-10-06 09:01:52

+0

@misha对不起。我对TeamCity不熟悉。我认为这值得一个新的问题。 – 2014-10-09 10:32:24

相关问题