【问题标题】:Conditional run of integration tests in maven在 Maven 中条件运行集成测试
【发布时间】:2014-11-25 05:28:45
【问题描述】:

我的 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>

【问题讨论】:

  • 你使用的是 JUnit 还是 TestNG?

标签: maven testing conditional integration teamcity-8.0


【解决方案1】:

看看Build Profiles

简而言之。附上您的配置:

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

      ... your configuration ...

  </profile>
</profiles>

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

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

或者在命令行激活它:

mvn -P monthly ...

【讨论】:

  • Gerold,我这里没有你的解决方案。首先,您要引用什么 settings.xml?是 %USER_HOME%/.m2/settings.xml 还是 %M2_HOME%/conf/settings.xml
  • @misha 你读过我链接到的完整章节吗?回复settings.xml:如果您只想通过 cmd 行激活配置文件,则不需要在settings.xml 中进行此设置。这是一个额外的信息,以防万一......如果您想使用它,这取决于您是否希望该配置对机器上的所有用户或特定用户可用,请参阅Maven, Settings Reference, Quick Overview“如果两个文件都存在,它们的内容将被合并,用户特定的 settings.xml 占主导地位。”
  • 但是我的 CI 环境中只有一个构建配置,所以我仍然需要手动激活/停用配置文件才能使用新数据库设置我的环境。我真正需要的是完全自动化这个,也许使用一些脚本来检查一个月的第一天并触发另一个配置文件的执行(包括我的 UpgradeDatabase.java 和 CreateDatabase.java 测试)
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 只是因为我很好奇:您为什么建议迁移到新模块?如果我不激活配置文件,则无论配置引用的对象位于何处,它的配置都不会激活。
    • 这只是另一种选择。当插件的配置很复杂时(即保持 XML 简单)或者当我想分离根本不属于同一个模块的东西(如单元测试和集成测试)时,我更喜欢模块。
    【解决方案4】:

    @misha 回复您对my previous answer 的评论:

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

      例如,使用参数 PROFILE 和空参数值(如果不支持空值,则仅使用空格字符)使常规构建作业 参数化 ) 作为默认值。将此参数添加到您的 mvn cmd 行:

      mvn ${PROFILE} ...

      这样,一个空(或空格)值被添加到您的 cmd 行中......什么都不做。

      创建一个触发常规的月构建作业,并注入这个值为-P 月度的参数,这样你的常规构建的命令行就变成了:

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

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

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

        
          每月属性>
      激活>

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

      mvn -D 每月 ...

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

    【讨论】:

    • 我创建了一个配置文件,它覆盖故障安全插件并另外执行初始化测试,但在 TeamCity 中,我无法根据每月计划激活该配置文件,即我可以触发每月构建但可以不要每月注入该参数-P。请注意,我使用的是 TeamCity 8.1.3
    • @misha 对不起。我不熟悉 TeamCity。我认为这值得提出一个新问题。
    猜你喜欢
    • 1970-01-01
    • 2013-04-07
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多