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 🙂
Thomas Wabner 10:09 am Dienstag, 31. Januar 2012 Permalink | Zum Antworten anmelden
Short info … the current 2.11 version of the surefire plugin contains a bug with the „excludeGroups“ rule … you need to wait for 2.12 or just use 2.10.