Next we will implement the JUnit unit-testing framework. This will provide us a consistent method to evaluate our code for logic errors as the project grows in complexity.
Download junit from http://www.junit.org/ and place the jar into the
lib directory
Refresh and add the jar to the build path
add this to build.xml
<property
name="dir.build.tests"
value="${dir.build}/tests"/>
<property name="dir.build.tests" value="${dir.build}/tests"/>
<property name="dir.build.tests.classes" value="${dir.build.tests}/classes"/>
<property name="dir.build.tests.reports" value="${dir.build.tests}/reports"/>
<property name="dir.build.tests.reports.raw" value="${dir.build.tests.reports}/raw"/>
<property name="dir.build.tests.reports.html" value="${dir.build.tests.reports}/html"/>
<property name="dir.build.docs" value="${dir.build}/docs"/>
<property name="dir.build.docs.tests" value="${dir.build.docs}/tests"/>
<!-- ==========================================================
junit
Run unit testing with JUnit
========================================================== -->
<target name="junit">
<echo level="info">
***********************************************************************
*
* Running Tests
*
***********************************************************************
</echo>
<delete dir="${dir.build.tests}"/>
<mkdir dir="${dir.build.tests}"/>
<mkdir dir="${dir.build.tests.classes}"/>
<mkdir dir="${dir.build.tests.reports}"/>
<mkdir dir="${dir.build.tests.reports.raw}"/>
<mkdir dir="${dir.build.tests.reports.html}"/>
<!-- copied from compile source -->
<mkdir dir="${dir.build.tests.classes}"/>
<javac srcdir="${dir.src}"
destdir="${dir.build.tests.classes}"
classpathref="classpath"
includes="**/*.java"
>
<compilerarg value="-Xlint:unchecked"/></javac>
<!-- copy resource files -->
<echo level="info">copying files to ${dir.build.source}</echo>
<copy todir="${dir.build.tests.classes}">
<fileset dir="${dir.src}">
<include name="**/*"/>
<exclude name="**/*.java"/>
</fileset>
</copy>
<!-- end copy -->
<junit printsummary="yes" haltonfailure="no" showoutput="yes" fork="yes">
<classpath>
<pathelement path="${dir.build.tests.classes}"/>
<fileset dir="${dir.lib}">
<include name="**/*.jar"/>
</fileset>
</classpath>
<formatter type="xml"/>
<batchtest fork="yes" todir="${dir.build.tests.reports.raw}">
<fileset dir="${dir.build.tests.classes}">
<include name="**/*Test.class"/>
</fileset>
</batchtest>
</junit>
<junitreport todir="${dir.build.tests.reports.html}">
<fileset dir="${dir.build.tests.reports.raw}">
<include name="*.xml"/>
</fileset>
<report format="frames" todir="${dir.build.tests.reports.html}"/>
</junitreport>
<delete dir="${dir.build.docs.tests}"/>
<mkdir dir="${dir.build.docs}"/>
<mkdir dir="${dir.build.docs.tests}"/>
<copy todir="${dir.build.docs.tests}">
<fileset dir="${dir.build.tests.reports.html}">
<include name="**/*"/>
</fileset>
</copy>
</target>
<property name="dir.build.tests" value="${dir.build}/tests"/>
<property name="dir.build.tests.classes" value="${dir.build.tests}/classes"/>
<property name="dir.build.tests.reports" value="${dir.build.tests}/reports"/>
<property name="dir.build.tests.reports.raw" value="${dir.build.tests.reports}/raw"/>
<property name="dir.build.tests.reports.html" value="${dir.build.tests.reports}/html"/>
<property name="dir.build.docs" value="${dir.build}/docs"/>
<property name="dir.build.docs.tests" value="${dir.build.docs}/tests"/>
<!-- ==========================================================
junit
Run unit testing with JUnit
========================================================== -->
<target name="junit">
<echo level="info">
***********************************************************************
*
* Running Tests
*
***********************************************************************
</echo>
<delete dir="${dir.build.tests}"/>
<mkdir dir="${dir.build.tests}"/>
<mkdir dir="${dir.build.tests.classes}"/>
<mkdir dir="${dir.build.tests.reports}"/>
<mkdir dir="${dir.build.tests.reports.raw}"/>
<mkdir dir="${dir.build.tests.reports.html}"/>
<!-- copied from compile source -->
<mkdir dir="${dir.build.tests.classes}"/>
<javac srcdir="${dir.src}"
destdir="${dir.build.tests.classes}"
classpathref="classpath"
includes="**/*.java"
>
<compilerarg value="-Xlint:unchecked"/></javac>
<!-- copy resource files -->
<echo level="info">copying files to ${dir.build.source}</echo>
<copy todir="${dir.build.tests.classes}">
<fileset dir="${dir.src}">
<include name="**/*"/>
<exclude name="**/*.java"/>
</fileset>
</copy>
<!-- end copy -->
<junit printsummary="yes" haltonfailure="no" showoutput="yes" fork="yes">
<classpath>
<pathelement path="${dir.build.tests.classes}"/>
<fileset dir="${dir.lib}">
<include name="**/*.jar"/>
</fileset>
</classpath>
<formatter type="xml"/>
<batchtest fork="yes" todir="${dir.build.tests.reports.raw}">
<fileset dir="${dir.build.tests.classes}">
<include name="**/*Test.class"/>
</fileset>
</batchtest>
</junit>
<junitreport todir="${dir.build.tests.reports.html}">
<fileset dir="${dir.build.tests.reports.raw}">
<include name="*.xml"/>
</fileset>
<report format="frames" todir="${dir.build.tests.reports.html}"/>
</junitreport>
<delete dir="${dir.build.docs.tests}"/>
<mkdir dir="${dir.build.docs}"/>
<mkdir dir="${dir.build.docs.tests}"/>
<copy todir="${dir.build.docs.tests}">
<fileset dir="${dir.build.tests.reports.html}">
<include name="**/*"/>
</fileset>
</copy>
</target>
> ant junit
Build should be sucessful and build\docs\tests should have an index.html file (along with others) that show no tests were run Now add these lines to the 'clean' ant target
<delete
dir="${dir.build.docs}"/>
<delete dir="${dir.build.tests}"/>
<delete dir="${dir.build.tests}"/>
> ant clean
Create a file JPUserTest.java in the same package as the JPUser
package
net.wsor.osterman.javapersistence.om;
import static org.junit.Assert.*;
import org.junit.Test;
import net.wsor.utils.logging.Logger;
public class JPUserTest {
static Logger log = new Logger(JPUserTest.class, Logger.LOG_LEVEL.TRACE);
@Test
public final void testGetUsername() {
JPUser jpu = new JPUser();
jpu.setUsername("test");
jpu.setPassword("password");
assertEquals("test", jpu.getUsername());
}
@Test
public final void testSetUsername() {
JPUser jpu = new JPUser();
assertNull(jpu.getUsername());
jpu.setUsername("test");
assertEquals("test", jpu.getUsername());
}
@Test
public final void testGetPassword() {
JPUser jpu = new JPUser();
jpu.setUsername("test");
jpu.setPassword("password");
assertEquals("password", jpu.getPassword());
}
@Test
public final void testSetPassword() {
JPUser jpu = new JPUser();
assertNull(jpu.getPassword());
jpu.setPassword("password");
assertEquals("password", jpu.getPassword());
}
}
import static org.junit.Assert.*;
import org.junit.Test;
import net.wsor.utils.logging.Logger;
public class JPUserTest {
static Logger log = new Logger(JPUserTest.class, Logger.LOG_LEVEL.TRACE);
@Test
public final void testGetUsername() {
JPUser jpu = new JPUser();
jpu.setUsername("test");
jpu.setPassword("password");
assertEquals("test", jpu.getUsername());
}
@Test
public final void testSetUsername() {
JPUser jpu = new JPUser();
assertNull(jpu.getUsername());
jpu.setUsername("test");
assertEquals("test", jpu.getUsername());
}
@Test
public final void testGetPassword() {
JPUser jpu = new JPUser();
jpu.setUsername("test");
jpu.setPassword("password");
assertEquals("password", jpu.getPassword());
}
@Test
public final void testSetPassword() {
JPUser jpu = new JPUser();
assertNull(jpu.getPassword());
jpu.setPassword("password");
assertEquals("password", jpu.getPassword());
}
}
> ant junit
Look at the html reports and see that you've passed 4/4 tests!
> ant svn
commit
Unit Testing