Ant and TestNG Task example

testng tutorials

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)

References

  1. Ant – TestNG task
  2. Ang and jUnit Task
  3. TestNG – suite test

About the Author

author image
mkyong
Founder of Mkyong.com, love Java and open source stuff. Follow him on Twitter, or befriend him on Facebook or Google Plus. If you like my tutorials, consider make a donation to these charities.

Comments

Leave a Reply

avatar
newest oldest most voted
Stephen Staple
Guest
Stephen Staple

There is no tutorial here!

magooly
Guest
magooly

very good example . Thanks

Dinesh Bhat
Guest
Dinesh Bhat

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