Search code examples
maventestngsurefire

Excluding TestNG Groups From Maven


I have some slow tests that rely on the database that I don't want run every time I build my project with Maven. I've added the excludedGroups element to my pom file as explained http://maven.apache.org/plugins/maven-surefire-plugin/test-mojo.html#excludedGroups but I can't seem to get it working.

I've created a minimal project. Here is the pom.xml:

<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>test</groupId>
    <artifactId>exclude</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.4.2</version>
                <configuration>
                    <excludedGroups>db</excludedGroups>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>5.14</version>
        </dependency>
    </dependencies>

</project>

And these are the two test classes:

public class NormalTest {

    @Test
    public void fastTest() {
        Assert.assertTrue(true);
    }
}

and

public class DatabaseTest {

    @Test(groups={"db"})
    public void slowTest() {
        Assert.assertTrue(false);
    }
}

However both tests still run. I can't figure out what I'm doing wrong.


Solution

  • I ended up creating external test suits:

    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
    <suite name="tests">
            <test name="standard">
            <groups>
                <run>
                    <exclude name="slow" />
                    <exclude name="external" />
                    <exclude name="db" />
                </run>
            </groups>
            <packages>
                <package name="com.test.*" />
            </packages>
        </test>
    </suite>
    

    and

    <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
    <suite name="tests">
        <test name="full">
            <packages>
                <package name="com.test.*" />
            </packages>
        </test>
    </suite>
    

    and specifyied which to run in a profile:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.11</version>
        <configuration>
            <suiteXmlFiles>
                <suiteXmlFile>src/test/resources/suites/standard.xml</suiteXmlFile>
            </suiteXmlFiles>
         </configuration>
    </plugin>
    

    ...

    <profile>
        <id>fulltest</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                        <suiteXmlFiles>
                            <suiteXmlFile>src/test/resources/suites/full.xml</suiteXmlFile>
                        </suiteXmlFiles>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>