Concept to handle minimal and maximal tests in a maven project
In real world applications we have all too often external dependencies in test cases. Sometimes theses third party are not always available (i.e. remote webservices).
For continuous integration I want check a minimal set of tests but for my local development i want check a maximal set of tests. I want run my tests on command line (via maven) and in eclipse (via testng-plugin).
Here is my idea to do that …
My project super pom defines 2 profiles:
- test-min
- active by default
- exclude testng groups (online-tests, thirdparty-tests,…)
- test-max
- run a defined testng suite
- the suite defines a maximal set of test (all testng groups)
<profiles>
<profile>
<id>test-min</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<inherited>true</inherited>
<configuration>
<excludedGroups>${excludedTestGroups}</excludedGroups>
</configuration>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>test-max</id>
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<inherited>true</inherited>
<configuration>
<suiteXmlFiles>
${basedir}/src/test/resources/Testsuite.xml
</suiteXmlFiles>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<properties>
<excludedTestGroups>online,integration,thirdparty</excludedTestGroups>
</properties>
Each subproject must define a testng src/test/resources/Testsuite.xml:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestSuite for Foobar">
<test name="Online Tests">
<packages>
<package name="de.foobar.*" />
</packages>
<groups>
<run>
<include name="online" />
</run>
</groups>
</test>
<test name="Integration Tests">
<packages>
<package name="de.foobar.*" />
</packages>
<groups>
<run>
<include name="integration" />
</run>
</groups>
</test>
<test name="Thirdparty Tests">
<packages>
<package name="de.foobar.*" />
</packages>
<groups>
<run>
<include name="thirdparty" />
</run>
</groups>
</test>
<!-- Each project can define MORE groups: i.e. "interactive" -->
<test name="Other Tests">
<packages>
<package name="de.foobar.*" />
</packages>
<groups>
<run>
<exclude name="online" />
<exclude name="integration" />
<exclude name="thirdparty" />
<!-- Each project can define MORE groups: i.e. "interactive" -->
</run>
</groups>
</test>
</suite>
If the sub project defines more exclude groups (i.e. a additional “interactive” group) then the pom must overwrite the excludedTestGroups property:
<properties> <excludedTestGroups>online,integration,thirdparty,interactive</excludedTestGroups> </properties>
To check the correct configuration of the two profiles we can use help:effective-pom:
mvn -Ptest-min help:effective-pom | less
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<excludedGroups>online,integration,thirdparty,interactive</excludedGroups>
</configuration>
</plugin>
mvn -Ptest-max help:effective-pom | less
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<suiteXmlFiles>
<suiteXmlFile>d:\foobar\src/test/resources/Testsuite.xml</suiteXmlFile>
</suiteXmlFiles>
</configuration>
</plugin>
Now I can run min/max tests for each project which depend on the above super-pom. The test-min is the default profile and would be used on the continuous integration system (i.e. TeamCity).
Try it
