Login | Register   
LinkedIn
Google+
Twitter
RSS Feed
Download our iPhone app
TODAY'S HEADLINES  |   ARTICLE ARCHIVE  |   FORUMS  |   TIP BANK
Browse DevX
Sign up for e-mail newsletters from DevX


advertisement
 

How to Run the JUnit Testing Framework Using Apache Ant

Learn more about how Ant, in collaboration with JUnit, helps developers to follow the test-driven development approach.


advertisement

This article will discuss the build tool Apache Ant and the unit testing framework JUnit. Both of these have become an integral part of Java development and are widely used in the Java world because many customers like to see the unit test log before exposing the code for system testing and functional testing.

Introduction

Apache Ant is a generic build tool. The name Ant is abbreviation for 'Another Neat Tool'. This tool is similar to the 'Make' utility in UNIX but is implemented using Java. It is primarily used for building the binaries of a Java-based source code and deploying the generated binary to an application server which is pre-defined. It can also be used to generate Javadocs for a code base and to execute the unit test suite for the whole codebase. Ant in collaboration with JUnit helps developers to follow the test-driven development approach.

Ant requires a Java compiler to be installed with the environment variable JAVA_HOME set with its adequate value. Ant uses an XML file to define the build procedure. The default name of this file is build.xml. Some developers also use a properties file, namely build.properties, to define some properties - including the build version number and other environmental parameters that are required to change from time to time based on need.

Installation on Different Operating Systems

Fedora– On RHEL, Ant can be installed using the command – yum install Ant or it can be installed using the rpm – i command. In this case you should download the Ant package first.



Debian– On Ubuntu, Ant can be installed using the command – apt-get install ant.

Windows- On a Windows environment we need to download the ant_<VERSION_NO>.zip file. This zip bundle should be extracted in a folder. This folder should be defined as an environment variable ANT_HOME. A sample build.xml file is shown below:

LISTING 1: Sample build.xml file

<?xml version="1.0"?>
<project name="Ant-Test" default="main" basedir=".">
  <!-- Sets variables which can later be used. -->
  <!-- The value of a property is accessed via ${} -->
  <property name="src.dir" location="src" />
  <property name="build.dir" location="bin" />
  <property name="dist.dir" location="dist" />
  <property name="docs.dir" location="docs" />

  <!-- Deletes the existing docs, build and dist directory-->
  <target name="clean">
    <delete dir="${build.dir}" />
    <delete dir="${docs.dir}" />
    <delete dir="${dist.dir}" />
  </target>

  <!-- Creates the docs, build and dist directory-->
  <target name="makedir">
    <mkdir dir="${build.dir}" />
    <mkdir dir="${docs.dir}" />
    <mkdir dir="${dist.dir}" />
  </target>

  <!-- Compiles the java code (including the usage of library for JUnit -->
  <target name="compile" depends="clean, makedir">
    <javac srcdir="${src.dir}" destdir="${build.dir}">
    </javac>

  </target>

  <!-- Creates Javadoc -->
  <target name="docs" depends="compile">
    <javadoc packagenames="src" sourcepath="${src.dir}" destdir="${docs.dir}">
      <!-- Define which files / directory should get included, we include all -->
       <fileset dir="${src.dir}">
                <include name="**" />
           </fileset>
    </javadoc>
  </target>

  <!--Creates the deployable jar file  -->
  <target name="jar" depends="compile">
    <jar destfile="${dist.dir}\in.kolkalta.build.test.ant.jar" basedir="${build.dir}">
      <manifest>
        <attribute name="Main-Class" value="test.Main" />
      </manifest>
    </jar>
  </target>

  <target name="main" depends="compile, jar, docs">
    <description>Main target</description>
  </target>

</project>

Ant with JUnit

Ant provides a great help to Java developers who use the test-driven development approach. As we know in the test-driven development methodology JUnit is compulsory, it is always an added advantage if we have an automated script that runs all the JUnit test cases in one go. Not only that, but this script can also be used if we have a continuous integration tool like Hudson. Our following sample code illustrates how to use Ant with JUnit.

LISTING 2: A Sample Java file

package com.home.junit;

public class SampleAdd {
	
	public int add(int x, int y) {
		return x + y;
	}

}

LISTING 3: The corresponding JUnit file

package com.home.junit;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class SampleAddTest  {
	
	private SampleAdd sampleClass;
	
	@Before
	public void setUp() {
		sampleClass = new SampleAdd();
	}
	
	@Test
	public void testAdd() {
		Assert.assertEquals(5, sampleClass.add(3, 2));
	}
	
	@After 
	public void settleDown() {
		sampleClass = null;
	}
	

}

LISTING 4: The Ant script to compile and run the JUnit test

<?xml version="1.0"?>
<project name="JUNIT" default="main" basedir="..">
	<!-- Sets variables which can later be used. -->
	<!-- The value of a property is accessed via ${} -->
	<property name="src.dir" location="src" />
	<property name="test.dir" location="tests" />

	<property name="build.dir" location="bin" />
	<property name="build.test.dir" location="bin/tests" />

	<!-- Variables used for JUnit testin -->

	<property name="test.report.dir" location="testreport" />

	<!-- Define the classpath which includes the junit.jar and the classes after compiling-->
	<path id="junit.class.path">
		<pathelement location="lib/junit-4.11.jar" />
		<pathelement location="lib/hamcrest-core-1.3.jar" />
		<pathelement location="${build.dir}" />
	</path>


	<!-- Deletes the existing build, docs and dist directory-->
	<target name="clean">
		<delete dir="${build.dir}" />
		<delete dir="${test.report.dir}" />
	</target>

	<!-- Creates the  build, docs and dist directory-->
	<target name="makedir">
		<mkdir dir="${build.dir}" />
		<mkdir dir="${build.test.dir}" />
		<mkdir dir="${test.report.dir}" />
	</target>

	<!-- Compiles the java code (including the usage of library for JUnit -->
	<target name="compile" depends="clean, makedir">
		<javac srcdir="${src.dir}" destdir="${build.dir}">
			<classpath refid="junit.class.path" />
		</javac>

		<javac srcdir="${test.dir}" destdir="${build.test.dir}">
			<classpath refid="junit.class.path" />
		</javac>

	</target>

	<!-- Run the JUnit Tests -->
	<!-- Output is XML, could also be plain-->
	<target name="junit" depends="compile">
		<junit printsummary="on" fork="true" haltonfailure="yes">
			<classpath refid="junit.class.path" />
			<classpath>
			    <pathelement location="${build.test.dir}"/>
			  </classpath>
			<formatter type="xml" />
			<batchtest todir="${test.report.dir}">
				<fileset dir="${test.dir}">
					<include name="**/*Test*.java" />
				</fileset>
			</batchtest>
		</junit>
	</target>

	<target name="main" depends="compile, junit">
		<description>Main target</description>
	</target>

</project>

When we run this script, it first compiles the code base and then runs the JUnit tests on the compiled code and finally generates a test report. The test report can be generated in any format. For convenience we have generated this in XML format.

LISTING 5: The Generated test report in XML format

<?xml version="1.0" encoding="UTF-8"?> -<testsuite timestamp="2013-10-26T18:52:45" time="0.077" tests="1" name="com.home.junit.SampleAddTest" hostname="INDTAPPL132-001" failures="0" errors="0">-<properties><property name="java.vendor" value="Oracle Corporation"/><property name="sun.java.launcher" value="SUN_STANDARD"/><property name="eclipse.pdebuild.templates" value="/F:/Utpal/Softs/Softs/eclipse-java-indigo-win32/eclipse/plugins/org.eclipse.pde.build_3.7.0.v20110512-1320/templates/"/><property name="sun.management.compiler" value="HotSpot Client Compiler"/><property name="os.name" value="Windows 7"/><property name="sun.boot.class.path" value="C:\Program Files\Java\jre7\lib\resources.jar;C:\Program Files\Java\jre7\lib\rt.jar;C:\Program Files\Java\jre7\lib\sunrsasign.jar;C:\Program Files\Java\jre7\lib\jsse.jar;C:\Program Files\Java\jre7\lib\jce.jar;C:\Program Files\Java\jre7\lib\charsets.jar;C:\Program Files\Java\jre7\lib\jfr.jar;C:\Program Files\Java\jre7\classes"/><property name="sun.desktop" value="windows"/><property name="java.vm.specification.vendor" value="Oracle Corporation"/><property name="ant.home" value="F:\Utpal\Softs\Softs\eclipse-java-indigo-win32\eclipse\plugins\org.apache.ant_1.8.2.v20110505-1300"/><property name="java.runtime.version" value="1.7.0_45-b18"/><property name="user.name" value="utpalb"/><property name="build.dir" value="F:\Work\RnDSpace\Junit\bin"/><property name="user.language" value="en"/><property name="test.report.dir" value="F:\Work\RnDSpace\Junit\testreport"/><property name="sun.boot.library.path" value="C:\Program Files\Java\jre7\bin"/><property name="ant.project.default-target" value="main"/><property name="ant.project.name" value="JUNIT"/><property name="java.version" value="1.7.0_45"/><property name="user.timezone" value=""/><property name="sun.arch.data.model" value="32"/><property name="java.endorsed.dirs" value="C:\Program Files\Java\jre7\lib\endorsed"/><property name="sun.cpu.isalist" value="pentium_pro+mmx pentium_pro pentium+mmx pentium i486 i386 i86"/><property name="sun.jnu.encoding" value="Cp1252"/><property name="file.encoding.pkg" value="sun.io"/><property name="file.separator" value="\"/><property name="java.specification.name" value="Java Platform API Specification"/><property name="java.class.version" value="51.0"/><property name="user.country" value="US"/><property name="java.home" value="C:\Program Files\Java\jre7"/><property name="java.vm.info" value="mixed mode, sharing"/><property name="ant.file" value="F:\Work\RnDSpace\Junit\build\build.xml"/><property name="os.version" value="6.1"/><property name="path.separator" value=";"/><property name="java.vm.version" value="24.45-b08"/><property name="user.variant" value=""/><property name="ant.library.dir" value="F:\Utpal\Softs\Softs\eclipse-java-indigo-win32\eclipse\plugins\org.apache.ant_1.8.2.v20110505-1300\lib"/><property name="java.awt.printerjob" value="sun.awt.windows.WPrinterJob"/><property name="sun.io.unicode.encoding" value="UnicodeLittle"/><property name="ant.file.type.JUNIT" value="file"/><property name="awt.toolkit" value="sun.awt.windows.WToolkit"/><property name="user.script" value=""/><property name="ant.file.JUNIT" value="F:\Work\RnDSpace\Junit\build\build.xml"/><property name="eclipse.pdebuild.scripts" value="/F:/Utpal/Softs/Softs/eclipse-java-indigo-win32/eclipse/plugins/org.eclipse.pde.build_3.7.0.v20110512-1320/scripts/"/><property name="user.home" value="C:\Users\utpalb"/><property name="java.specification.vendor" value="Oracle Corporation"/><property name="test.dir" value="F:\Work\RnDSpace\Junit\tests"/><property name="java.library.path" value="C:\Program Files\Java\jre7\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:/Program Files/Java/jre7/bin/client;C:/Program Files/Java/jre7/bin;C:/Program Files/Java/jre7/lib/i386;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Java\jdk1.6.0_10\bin;E:\apache-ant-1.8.2-bin\apache-ant-1.8.2\bin;C:\Program Files\Liquid Technologies\Liquid XML Studio 2011\XmlDataBinder9\Redist9\cpp\win32\bin;C:\Program Files\TortoiseSVN\bin;E:\Program Files\Android\android-sdk\platform-tools;E:\Program Files\Android\android-sdk\tools;C:\Program Files\QuickTime\QTSystem\;D:\Sun\AppServer\bin;9;F:\Utpal\Softs\Softs\eclipse-java-indigo-win32\eclipse;;."/><property name="java.vendor.url" value="http://java.oracle.com/"/><property name="java.vm.vendor" value="Oracle Corporation"/><property name="java.runtime.name" value="Java(TM) SE Runtime Environment"/><property name="sun.java.command" value="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner com.home.junit.SampleAddTest filtertrace=true haltOnError=false haltOnFailure=true formatter=org.apache.tools.ant.taskdefs.optional.junit.SummaryJUnitResultFormatter showoutput=false outputtoformatters=true logfailedtests=true logtestlistenerevents=false formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,F:\Work\RnDSpace\Junit\testreport\TEST-com.home.junit.SampleAddTest.xml crashfile=F:\Work\RnDSpace\Junit\junitvmwatcher6288340937110531134.properties propsfile=F:\Work\RnDSpace\Junit\junit7583515827572177542.properties"/><property name="java.class.path" value="F:\Work\RnDSpace\Junit\lib\junit-4.11.jar;F:\Work\RnDSpace\Junit\lib\hamcrest-core-1.3.jar;F:\Work\RnDSpace\Junit\bin;F:\Work\RnDSpace\Junit\bin\tests;F:\Work\RnDSpace\Junit;C:\Program Files\Java\jdk1.6.0_10\jre\lib\rt.jar;F:\Utpal\Softs\Softs\eclipse-java-indigo-win32\eclipse\plugins\org.apache.ant_1.8.2.v20110505-1300\lib\ant-launcher.jar;F:\Utpal\Softs\Softs\eclipse-java-indigo-win32\eclipse\plugins\org.apache.ant_1.8.2.v20110505-1300\lib\ant.jar;F:\Utpal\Softs\Softs\eclipse-java-indigo-win32\eclipse\plugins\org.apache.ant_1.8.2.v20110505-1300\lib\ant-junit.jar;F:\Utpal\Softs\Softs\eclipse-java-indigo-win32\eclipse\plugins\org.apache.ant_1.8.2.v20110505-1300\lib\ant-junit4.jar"/><property name="ant.version" value="Apache Ant(TM) version 1.8.2 compiled on December 20 2010"/><property name="java.vm.specification.name" value="Java Virtual Machine Specification"/><property name="java.vm.specification.version" value="1.7"/><property name="sun.cpu.endian" value="little"/><property name="sun.os.patch.level" value="Service Pack 1"/><property name="eclipse.pdebuild.home" value="/F:/Utpal/Softs/Softs/eclipse-java-indigo-win32/eclipse/plugins/org.eclipse.pde.build_3.7.0.v20110512-1320/./"/><property name="java.io.tmpdir" value="C:\Users\utpalb\AppData\Local\Temp\"/><property name="java.vendor.url.bug" value="http://bugreport.sun.com/bugreport/"/><property name="os.arch" value="x86"/><property name="java.awt.graphicsenv" value="sun.awt.Win32GraphicsEnvironment"/><property name="java.ext.dirs" value="C:\Program Files\Java\jre7\lib\ext;C:\Windows\Sun\Java\lib\ext"/><property name="user.dir" value="F:\Work\RnDSpace\Junit\build"/><property name="build.test.dir" value="F:\Work\RnDSpace\Junit\bin\tests"/><property name="line.separator" value=" "/><property name="java.vm.name" value="Java HotSpot(TM) Client VM"/><property name="basedir" value="F:\Work\RnDSpace\Junit"/><property name="ant.java.version" value="1.7"/><property name="ant.core.lib" value="F:\Utpal\Softs\Softs\eclipse-java-indigo-win32\eclipse\plugins\org.apache.ant_1.8.2.v20110505-1300\lib\ant.jar"/><property name="file.encoding" value="Cp1252"/><property name="java.specification.version" value="1.7"/><property name="src.dir" value="F:\Work\RnDSpace\Junit\src"/><property name="ant.project.invoked-targets" value="main"/></properties><testcase time="0.003" name="testAdd" classname="com.home.junit.SampleAddTest"/>-<system-out> <![CDATA[]]> </system-out>-<system-err> <![CDATA[]]> </system-err></testsuite>

Conclusion

So after discussing all the above theory and implementation details we can conclude with the following highlights.

  • Apache Ant is a Java based utility used by the Java developers for the following purpose
    • To generate the binaries from the source code
    • To generate Javadocs for the source code
    • To run JUnit test cases on a code base
  • Ant in collaboration with JUnit, helps the Java developers to follow the Test Driven Development methodology

Hope you have enjoyed the article and got a clear understanding about the tool and its implementation. If you have any questions, send me an email.

 

About the Author

Kaushik Pal is a technical architect with 15 years of experience in enterprise application and product development. He has expertise in web technologies, architecture/design, Java/J2EE, Open source and big data technologies. You can find more of his work at www.techalpine.com.



   
Comment and Contribute

 

 

 

 

 


(Maximum characters: 1200). You have 1200 characters left.

 

 

Sitemap