Search code examples
javamaven-3maven-failsafe-plugin

Why are integration tests not executed by default in a maven build (install)?


To my understanding, by default (that means without any explicit configuration of the failsafe plugin), maven should run integration tests when the goal "install" is executed. See https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Lifecycle_Reference.

Anyway, it seems to do not so. So, possibly I am misunderstanding something.

I made up a minimal test project with a JUnit test class org.example.ExampleIT in src/test/java and the following POM:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>mvn-project</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.1</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>

The build (mvn install) is succesful, but failsafe is not executed. See the following log excerpt:

[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ mvn-project ---
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ mvn-project ---
(...)
[INFO] --- maven-install-plugin:2.4:install (default-install) @ mvn-project
(...)
[INFO] BUILD SUCCESS

Solution

  • See https://maven.apache.org/ref/3.2.2/maven-core/default-bindings.html.

    Plugins are bound to lifecycles phases by a "Plugin Binding". Those bindings are specific to the packaging.

    The default bindings are defined in META-INF/plexus/default-bindings.xml in maven core. The default binding for jar packaging does not provide any plugin binding for the integration-test phase (see https://maven.apache.org/ref/3.2.2/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging), for that reason the binding of the failsafe plugin to the integration-test and verify phases must be configured manually (see answer from JF Meier).

    The plugin must not only be bound to the integration-test phase, but to the verify phase, too. Otherwise the tests are executed, but the build does not fail if some integration test fails.