Running Cargo from Maven
Yesterday, I integrated Cargo into our application so we could start/stop Tomcat before running our jWebUnit tests. I use Cargo in AppFuse and Equinox - which are both Ant-based. Since we're using Maven on our project, I had to do a bit of futzing to get Cargo integrated into Maven. I prefer to use the Ant tasks from Cargo than the programmatic API because it's nice to run your tests when you start Tomcat manually. If you use the programmatic API, and start/stop Tomcat in setUp()/tearDown() methods - your test will fail if Tomcat is already running.
Below is what I added to maven.xml. With this, we can run "maven test-web" to test our UI with Tomcat running or "maven test-tomcat" to start/stop Tomcat before running our tests. Now I just need to figure out the best way to configure the proper port in my jWebUnit test. I'll probably put it into project.properties and the read the value as part of my test. I've also included a "deploy" goal in this example to demonstrate an easy way to deploy to Tomcat.
<property environment="env"/> <property name="maven.tomcat.home" value="${env.CATALINA_HOME}"/> <!-- deploy the directory created by war:webapp to tomcat/webapps --> <goal name="deploy" prereqs="war:webapp"> <copy todir="${maven.tomcat.home}/webapps"> <fileset dir="${maven.build.dir}"> <include name="${pom.artifactId}/**"/> </fileset> </copy> </goal> <goal name="test-tomcat" prereqs="war:war" description="Starts Tomcat, runs jWebUnit tests, stops Tomcat"> <taskdef resource="cargo.tasks" classpathref="maven.dependency.classpath"/> <cargo-tomcat5x homeDir="${maven.tomcat.home}" output="${maven.test.dest}/cargo.log" action="start" > <war warFile="${maven.war.build.dir}/${maven.war.final.name}"/> <configuration dir="${maven.test.dest}/tomcat5x"> <property name="cargo.logging" value="high"/> <property name="cargo.servlet.port" value="8280"/> </configuration> </cargo-tomcat5x> <attainGoal name="test-web"/> <cargo-tomcat5x homeDir="${maven.tomcat.home}" action="stop"/> </goal> <goal name="test-web" prereqs="test:compile" description="Runs JUnit tests"> <taskdef name="junit" classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask"/> <mkdir dir="${maven.test.reportsDirectory}"/> <junit printsummary="no" errorProperty="test.failed" failureProperty="test.failed"> <classpath> <pathelement location="${maven.test.dest}"/> <pathelement location="${maven.build.dest}"/> <path refid="maven.dependency.classpath"/> <path location="web"/> </classpath> <formatter type="xml"/> <formatter type="brief" usefile="false"/> <batchtest todir="${maven.test.reportsDirectory}" if="testcase"> <fileset dir="${maven.test.dest}"> <include name="**/*${testcase}*"/> <exclude name="**/*TestCase.class"/> <exclude name="**/*$*.class"/> </fileset> </batchtest> <batchtest todir="${maven.test.reportsDirectory}" unless="testcase"> <fileset dir="${maven.test.dest}"> <include name="**/*WebTest.class"/> </fileset> </batchtest> </junit> <fail if="test.failed"> Unit tests failed. For error messages, check the log files in ${maven.test.reportsDirectory}.</fail> </goal>
Posted by Amit on December 19, 2008 at 08:11 PM MST #
Posted by Matt Raible on December 19, 2008 at 08:24 PM MST #