【问题标题】:Get list of activated profile name during run time in maven java project在 maven java 项目中获取运行时激活的配置文件名称列表
【发布时间】:2016-04-05 12:23:34
【问题描述】:

我需要能够使用在 JUnit 测试运行时激活的配置文件。 我想知道是否有任何方法可以做类似的事情:

String str = System.getProperty("activated.profile[0]");

或任何其他相对方式...

我意识到有一个选项可以使用 ${project.profiles[0].id} bu,但不知何故它不起作用。

有什么想法吗?

【问题讨论】:

  • 为什么在单元测试中需要关于配置文件的信息?
  • 这听起来确实像一个典型的 XY 问题。您在这里真正想要达到什么目的?
  • 我一直在使用不同类别的分析来运行 junit 测试套件。我需要确定运行的套件是否在 Sanity、回归、slowTests 等范围内,而我想通过以下方式从配置文件 id 中获取这个:System.getProperty(profiles).contains("Sanity")。我想避免在 pom 中使用属性,因为它会让我重复一些我不喜欢的行。
  • 我认为没有一种简单而优雅的方法可以做到这一点。如果我在这里尝试有点创意,那么将一个特定文件(属性文件)作为测试资源,该文件将包含一个值(属性),可以在运行测试之前替换(资源替换) .每个配置文件都可以将属性值设置为对您有意义的值,然后您的测试代码可以在目标文件夹中查找此文件并读取此值。
  • 我只是认为有一种简单的方法可以获取当前激活的个人资料的 Id。

标签: java maven unit-testing maven-profiles system-variable


【解决方案1】:

我在 pom 文件中使用的其他情况:

<profiles>
    <profile>
        <id>a-profile-id</id>

        <properties>
            <flag>a-flag-value</flag>
        </properties>
    </profile>
</profiles>

在java中:

String flagValue = System.getenv("flag");

【讨论】:

    【解决方案2】:

    当使用 surefire 运行单元测试时,它通常会生成一个新的 JVM 来运行测试,我们必须将信息传递给新的 JVM。这通常可以使用“systemPropertyVariables”标签来完成。

    我能够使用快速入门 Java 项目来练习这个,我将它添加到 POM:

    我声明了以下配置文件

    <profiles>
        <profile>
            <id>special-profile1</id>
        </profile>
        <profile>
            <id>special-profile2</id>
        </profile>
    </profiles>     
    

    这是确保配置:

    <build>
        <plugins>
            ...
            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-surefire-plugin</artifactId>
               <version>2.19</version>
               <configuration>
                   <systemPropertyVariables>
                       <profileId>${project.activeProfiles[0].id}</profileId>
                   </systemPropertyVariables>
               </configuration>
            </plugin>
            ...
        </plugins>
    </build>  
    

    在我的单元测试中,我添加了这个:

    /**
     * Rigourous Test :-)
     */
    public void testApp()
    {
        System.out.println("Profile ID:  " + System.getProperty("profileId"));
    }
    

    当调用没有配置文件的“测试”命令时(即使用mvn test),我得到了这个:

    -------------------------------------------------- ----- T E S T S -------------------------------------------------- ----- 运行 com.fxs.AppTest 个人资料 ID:开发 测试运行:1,失败:0,错误:0,跳过:0,经过时间:0.003 秒 - 在 com.fxs.AppTest 结果 : 测试运行:1,失败:0,错误:0,跳过:0

    我们使用了mvn -P special-profile2 test,我知道了

    -------------------------------------------------- ----- T E S T S -------------------------------------------------- ----- 运行 com.fxs.AppTest 配置文件 ID:special-profile2 测试运行:1,失败:0,错误:0,跳过:0,经过时间:0.002 秒 - 在 com.fxs.AppTest 结果 : 测试运行:1,失败:0,错误:0,跳过:0

    这将传递第一个活动配置文件的名称。如果我们可能有多个活动配置文件,那么我们可能需要使用更多系统属性。

    注意:我使用 Maven 3.1.1 对此进行了测试

    【讨论】:

    • 这与我正在寻找的非常接近。我可以:/** public void testApp() { System.out.println("Profile ID:" + System.getProperty("project.activeProfile[0].id"));当我尝试这个时,从 intelij 运行它时它给了我一个 null
    • 我认为您不能在单元测试中像这样引用projcect.activeProfile[0].id。当测试执行时,它由一个新的 JVM 运行,该 JVM 由来自 maven 的 Surefire 测试插件启动。这个新的 JVM 看不到运行 maven 的父 JVM 中可见的内容。 (此外,要使用这样的表达式引用数据模型,需要一个表达式求值器,它仅在 maven 中可用)。 AFAIK,将事物传递给子 JVM 的唯一方法是使用 &lt;systemPropertyVariables&gt;
    猜你喜欢
    • 1970-01-01
    • 2013-09-24
    • 2012-04-16
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    相关资源
    最近更新 更多