Maven failsafe is not complaining that an inexistent profile was specified

血红的双手。 提交于 2021-01-29 12:55:58

问题


I have two profiles in my pom:

 <profiles>
        <profile>
            <id>functional-tests</id>
            <build>
                <plugins>
                    <plugin>
                        <artifactId>maven-failsafe-plugin</artifactId>
                        <configuration>
                            <testSourceDirectory>test/test-functional/java</testSourceDirectory>
                            <includes>
                                <include>**/*FT.java</include>
                            </includes>
                        </configuration>
                        <executions>
                            <execution>
                                <goals>
                                    <goal>integration-test</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>

        <profile>
            <id>it-tests</id>
            <build>
                <plugins>
                    <plugin>
                        <artifactId>maven-failsafe-plugin</artifactId>
                        <configuration>
                            <testSourceDirectory>test/test-it/java</testSourceDirectory>
                            <includes>
                                <include>**/*IT.java</include>
                            </includes>
                        </configuration>
                        <executions>
                            <execution>
                                <goals>
                                    <goal>integration-test</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
        ...

I can trigger each of these two profiles like this:

 mvn failsafe:integration-test -Pfunctional-tests

 mvn failsafe:integration-test -Pit-tests

But when I run this:

 mvn failsafe:integration-test -PrandomWord

It triggers it-tests profile. I was wondering why and if there is a way to have failsafe plugin output something like unrecognised profile.

Thank you for your help


In case it matters, here is my failsafe-plugin:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-failsafe-plugin</artifactId>
        <executions>
            <execution>
                <goals>
                    <goal>integration-test</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

回答1:


Answering your question about why it triggers it-tests. In fact, it does not activate any of the profiles, hence default plugin configuration is used which has **/*IT.java in include list. So, it runs all IT tests by default.

This is weird approach to manage plugin executions by profiles. I doubt there is a reasonable way to validate profile names as you describe. I would recommend another approach here.

Approach 1. Use <id> and cli with @

You could just specify two executions of the plugin with id and then you could do this: How to execute maven plugin execution directly from command line?

 <plugin>
    <artifactId>maven-failsafe-plugin</artifactId>
    <executions>
        <execution>
            <id>it-tests</id>
            <phase>none</phase> <!-- detach this execution from default lifecycle -->
            <configuration>
                <testSourceDirectory>test/test-it/java</testSourceDirectory>
                <includes>
                    <include>**/*IT.java</include>
                </includes>
            </configuration>
        </execution>
        <execution>
            <id>functional-tests</id>
            <phase>none</phase> <!-- detach this execution from default lifecycle -->
            <configuration>
                <testSourceDirectory>test/test-ft/java</testSourceDirectory>
                <includes>
                    <include>**/*FT.java</include>
                </includes>
            </configuration>
        </execution>
    </executions>
</plugin>

Now you could execute it from command line:

mvn failsafe:integration-test@it-tests
mvn failsafe:integration-test@functional-tests

Update: No need to specify goals as it is relevant to lifecycle only, we type it in command line anyway.

Approach 2. Use <skip> and properties

Keep both executions as a part of lifecycle but control execution by providing skip flags. I.e. define two properties e.g. skip.tests.it=true, skip.tests.ft=true and add <skip>${skip.tests.ft}</skip> to relevant configuration sections. Then you could just do

# run with no tests by default
mvn verify 

# run with only FT
mvn verify -Dskip.tests.ft=false 

# run with all tests
mvn verify -Dskip.tests.ft=false -Dskip.tests.it=false

to run full lifecycle together with desired tests.



来源:https://stackoverflow.com/questions/60542472/maven-failsafe-is-not-complaining-that-an-inexistent-profile-was-specified

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!