Why doesn't "mvn verify" run my integration tests?

Daniel Kaplan picture Daniel Kaplan · Nov 25, 2015 · Viewed 16.2k times · Source

I have a multi-module project and I have failsafe defined in the root pom like this:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.19</version>
    <configuration>
        <includes>
            <include>**/*IntegrationTest.java</include>
            <include>**/*JourneyTest.java</include>
            <include>**/*CucumberFeatureTest.java</include>
        </includes>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.19</version>
    <configuration>
        <excludes>
            <exclude>**/*IntegrationTest.java</exclude>
            <exclude>**/*JourneyTest.java</exclude>
            <exclude>**/*CucumberFeatureTest.java</exclude>
        </excludes>
    </configuration>
</plugin>

Failsafe is not defined anywhere else in my other poms. If I run mvn verify, it skips integration tests (it runs unit tests). But if I run mvn test-compile failsafe:integration-test, it runs integration tests.

I'm under the assumption that failsafe is supposed to run in both of these situations. So why doesn't it run when I type mvn verify?

UPDATE: Just noticed that this was wrapped around these tags:

<build>
    <pluginManagement> <!-- oops -->
        <plugins>
            <plugin>

I feel like this explains the cause, but I'm not sure why unit tests still run like you'd expect with mvn verify and mvn test. Why does surefire work differently from failsafe in this respect?

Answer

JJF picture JJF · Nov 25, 2015

You need to bind failsafe's integration test goal to maven's integration-test and verify phases. By default the failsafe-plugin isn't included in a vanilla maven project. You need to add it. So even though there is an integration-test lifecycle, by default it is not included (well, at least doesn't run the maven-failsafe-plugin). You add it to the integration-test and verify phases (it needs both, it will fail the build at the verify phase only [if the preceding integration-tests failed], so that the post-integration lifecycle phase still has a chance to run and cleanup resources, hence the name "fail safe").

   <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-failsafe-plugin</artifactId>
       <version>2.19</version>
       <configuration>
           <includes>
               <include>**/*IntegrationTest.java</include>
               <include>**/*JourneyTest.java</include>
               <include>**/*CucumberFeatureTest.java</include>
           </includes>
       </configuration>
       <executions>
          <execution>
            <goals>
              <goal>integration-test</goal>
              <goal>verify</goal>
            </goals>
          </execution>
        </executions>
   </plugin>