Friday, December 3, 2010

Properly defining integration tests in Maven POM

By default, Maven executes all tests during test phase, no matter if the class name ends with 'Test' or 'IntegrationTest'. So, unless integration tests are placed in a separate module (which is not a bad idea at all), some POM crafting is required to make sure that unit tests execute during test phase and integration tests execute during integration-test phase. There are 2 ways to do that:

1. Maven surefire plugin

Maven uses this plugin by default for all test runs. So no special configuration is needed to run unit tests. This is what needs to be added for integration tests:


<build>
    <plugins>
         ...
        <plugin>
             <groupId>org.apache.maven.plugin</groupId>
             <artifactId>maven-surefire-plugin</artifactId>
             <configuration>

                  <!-- at first, all integration tests need to be explicitly excluded 
                         from all test executions, be it test phase 
                         or any other phase where maven-surefire-plugin is invoked 
                         on a custom basis.
                     -->
                  <excludes>
                      <exclude>**/*IntegrationTest.java</exclude>
                  </excludes>

              </configuration>
              <executions>
                  <execution>
                      <id>integration-test</id>
                      <goals>
                          <goal>test</goal>
                      </goals>
                      <phase>integration-test</phase>
                      <configuration>

                          <!-- Here integration tests are included 
                                 at the integration-test phase separately.
                              -->
                          <includes>
                              <include>**/*IntegrationTest.java</include>
                          </includes>
                          <!-- a parameter called 'skipIntegration' is
                                 the same as 'skipTests' except only
                                 for integration tests -->
                          <skipTests>${skipIntegration}</skipTests>
                      </configuration>
                  </execution>
              </executions>
           </plugin>
           ...
      </plugins>
</build>

2. Maven failsafe plugin

This maven plugin includes integration test classes whose names fit '*IT' or '*ITCase' patterns and executes them during integration-test phase. If classes are named that way, then it's enough to simply throw in default maven-failsafe-plugin configuration. However, if classes are named using '*IntegrationTest' pattern, then they have to be excluded from test phase in maven-surefire-plugin configuration, and that pattern has to be defined in maven-failsafe-plugin configuration:

<build>
    <plugins>
         ...
        <plugin>
             <groupId>org.apache.maven.plugin</groupId>
             <artifactId>maven-surefire-plugin</artifactId>
             <configuration>
                  <excludes>
                      <exclude>**/*IntegrationTest.java</exclude>
                  </excludes>
             </configuration>
         </plugin>

         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-failsafe-plugin</artifactId>
             <configuration>
                 <includes>
                     <include>**/*IntegrationTest.java</include>
                  </includes>

                  <skipTests>${skipIntegration}</skipTests>  
              </configuration>
              <executions>
                  <execution>
                      <id>integration-test</id>
                      <phase>integration-test</phase>
                      <goals>
                          <goal>integration-test</goal>
                      </goals>
                  </execution>
                  <execution>
                      <id>verify</id>
                      <phase>verify</phase>
                      <goals>
                          <goal>verify</goal>
                      </goals>
                  </execution>
              </executions> 
          </plugin>    
         ...
     </plugins>
</build>

No comments:

Post a Comment