Ant and TestNG Task example
In this tutorial, we will show you how to run a TestNG test in Ant build.
1. Run by Classes
build.xml
<taskdef name="testng" classname="org.testng.TestNGAntTask">
<classpath location="lib/testng-6.8.14.jar" />
</taskdef>
<target name="testng" depends="compile">
<!-- Assume test.path contains the project library dependencies -->
<testng classpathref="test.path"
outputDir="${report.dir}"
haltOnFailure="true">
<!-- Extra project classpath, which is not included in above "test.path" -->
<!-- Tell Ant where is the project and test classes -->
<classpath location="${test.classes.dir}" />
<classpath location="${src.classes.dir}" />
<!-- Tell Ant what test classes need to run -->
<classfileset dir="${test.classes.dir}" includes="**/*Test*.class" />
</testng>
</target>
2. Run by XML
${resources.dir}/testng.xml
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="TestAll">
<test name="anyname">
<classes>
<class name="com.mkyong.test.TestMessage" />
</classes>
</test>
</suite>
build.xml
<taskdef name="testng" classname="org.testng.TestNGAntTask">
<classpath location="lib/testng-6.8.14.jar" />
</taskdef>
<target name="testng" depends="compile">
<testng classpathref="test.path"
outputDir="${report.dir}"
haltOnFailure="true">
<classpath location="${test.classes.dir}" />
<!-- Tell Ant where is testng.xml -->
<xmlfileset dir="${resources.dir}" includes="testng.xml"/>
</testng>
</target>
3. Example
A web application example to show you how to run a set of TestNG tests.
3.1 Return a message
MessageGenerator.java
package com.mkyong.message;
import org.springframework.stereotype.Component;
@Component
public class MessageGenerator {
public String getWelcomeMessage() {
return "welcome";
}
}
3.2 Two TestNG tests.
TestMessage.java
package com.mkyong.test;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.mkyong.message.MessageGenerator;
public class TestMessage {
@Test
public void test_welcome_message() {
MessageGenerator obj = new MessageGenerator();
Assert.assertEquals(obj.getWelcomeMessage(), "welcome");
}
}
TestMessage2.java
package com.mkyong.test;
import org.testng.Assert;
import org.testng.annotations.Test;
import com.mkyong.message.MessageGenerator;
public class TestMessage2 {
@Test
public void test_welcome_message_2() {
MessageGenerator obj = new MessageGenerator();
Assert.assertEquals(obj.getWelcomeMessage(), "welcome");
}
}
3.3 Use ivy to get the project dependencies, and declares the project scope.
ivy.xml
<ivy-module version="2.0">
<info organisation="org.apache" module="WebProject" />
<configurations>
<conf name="compile" description="Required to compile application"/>
<conf name="runtime" description="Additional run-time dependencies" extends="compile"/>
<conf name="test" description="Required for test only" extends="runtime"/>
</configurations>
<dependencies>
<dependency org="org.testng" name="testng" rev="6.8.14" conf="test->default" />
</dependencies>
</ivy-module>
3.4 Run unit test
build.xml
<project xmlns:ivy="antlib:org.apache.ivy.ant"
name="HelloProject" default="main" basedir=".">
<description>
Running TestNG Test
</description>
<!-- Project Structure -->
<property name="jdk.version" value="1.7" />
<property name="projectName" value="WebProject" />
<property name="src.dir" location="src" />
<property name="test.dir" location="src" />
<property name="report.dir" location="report" />
<property name="web.dir" value="war" />
<property name="web.classes.dir" location="${web.dir}/WEB-INF/classes" />
<!-- ivy start -->
<target name="resolve" description="retrieve dependencies with ivy">
<echo message="Getting dependencies..." />
<ivy:retrieve />
<ivy:cachepath pathid="compile.path" conf="compile" />
<ivy:cachepath pathid="runtime.path" conf="runtime" />
<ivy:cachepath pathid="test.path" conf="test" />
</target>
<!-- Compile Java source from ${src.dir} and output it to ${web.classes.dir} -->
<target name="compile" depends="init, resolve" description="compile source code">
<mkdir dir="${web.classes.dir}" />
<javac destdir="${web.classes.dir}" source="${jdk.version}"
target="${jdk.version}" debug="true" includeantruntime="false" classpathref="compile.path">
<src path="${src.dir}" />
</javac>
</target>
<!-- Run TestNG -->
<target name="testng" depends="compile">
<testng classpathref="test.path"
outputDir="${report.dir}"
haltOnFailure="true">
<classpath location="${web.classes.dir}" />
<xmlfileset dir="${resources.dir}" includes="testng.xml"/>
<!--
<classfileset dir="${web.classes.dir}" includes="**/*Test*.class" />
-->
</testng>
</target>
<!-- Create folders -->
<target name="init">
<mkdir dir="${src.dir}" />
<mkdir dir="${web.classes.dir}" />
<mkdir dir="${report.dir}" />
</target>
<!-- Delete folders -->
<target name="clean" description="clean up">
<delete dir="${web.classes.dir}" />
<delete dir="${report.dir}" />
</target>
<target name="main" depends="testng" />
</project>
${resources.dir}/testng.xml
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="TestAll">
<test name="example1">
<classes>
<class name="com.mkyong.test.TestMessage" />
<class name="com.mkyong.test.TestMessage2" />
</classes>
</test>
</suite>
Run it
$ ant testng
Output
testng:
[testng] [TestNG] Running:
[testng] /Users/mkyong/Documents/workspace/AntSpringMVC/resources/testng.xml
[testng]
[testng]
[testng] ===============================================
[testng] TestAll
[testng] Total tests run: 2, Failures: 0, Skips: 0
[testng] ===============================================
[testng]
BUILD SUCCESSFUL
Total time: 3 seconds
Done.
Download Source Code
Download It – AntSpringMVC-TestNG-Example (90 KB)
There is no tutorial here!
very good example . Thanks
Hi, Thanks for the nice information.
I have a build.xml file written to trigger the testng.xml (java + testng + selenium) . Ant was able to launch the tests which doesn’t have the “@BeforeSuite(…)” annotation. But, the tests with “@BeforeSuite(..)” or any other annotations are not getting triggered. Any idea, what is happening here?
Thanks,
Dinesh