Search code examples
mavenmaven-failsafe-plugin

Maven failsafe is not complaining that an inexistent profile was specified


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>

Solution

  • 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.