We have already demonstrated how to run JUnit using Ant, back in
Chapter 3. In order to run tests from a script or
in an IDE, include
junit.jar in your classpath
and then use the
junit.textui.TestRunner class to
run your tests in text mode. Use
to run the tests in a Swing
JUnit can run tests in text or graphical mode. Text mode is faster, and is excellent for running tests as part of an automated build process. Graphical tests are more interesting to run, and can make it easier to analyze output from a large number of tests.
java junit.textui.TestRunner com.oreilly.javaxp.junit.TestPerson .F.F Time: 0.02 There were 2 failures: 1) testGetFullName(com.oreilly.javaxp.junit.TestPerson)junit.framework. AssertionFailedError: expected:<Aidan Burke> but was:<AidanBurke> at com.oreilly.javaxp.junit.TestPerson.testGetFullName(C:/cvsdata/java_xp_ cookbook/examples/src/com/oreilly/javaxp/junit/TestPerson.java:24) 2) testNullsInName(com.oreilly.javaxp.junit.TestPerson)junit.framework. AssertionFailedError: expected:<? Burke> but was:<?Burke> at com.oreilly.javaxp.junit.TestPerson.testNullsInName(C:/cvsdata/java_xp_ cookbook/examples/src/com/oreilly/javaxp/junit/TestPerson.java:29) FAILURES!!! Tests run: 2, Failures: 2, Errors: 0
JUnit displays the cumulative time (in seconds), followed by a summary report of failures and errors. Both unit tests failed. The expected text didn’t match the existing text:
expected:<Aidan Burke> but was:<AidanBurke>
Either our test is incorrect, or the
failed to insert a space between the first and last names.
It’s the latter.. The final line shows cumulative
totals from the unit tests:
Tests run: 2, Failures: 2, Errors: 0
This indicates that a total of two tests ran, and both had failures. No tests had errors.
After fixing the
Person class, we can run the
tests again. We see the following output:
java junit.textui.TestRunner com.oreilly.javaxp.junit.TestPerson .. Time: 0.01 OK (2 tests)
While text-mode testing is great for automated testing, it can be more interesting to watch your tests graphically, as in Figure 4-1. Here is the command to run the GUI:
java junit.swingui.TestRunner com.oreilly.javaxp.junit.TestPerson
The black-and-white figure does not illustrate the fact that the progress bar near the top of the screen is red, indicating one or more errors or failures. As the tests run, the progress bar fills from left to right.
The output is essentially the same as JUnit’s text
UI; however, you can click on lines to see the message associated
with each problem. This is a particular advantage of the graphical
TestRunner when you have to sift through large
numbers of problems.
Figure 4-2 shows the Test Hierarchy tab. This tab allows you to see which of the unit tests passed or failed, and allows you to re-run individual tests.
Figure 4-3 shows the output once all bugs are fixed and every test passes. You cannot tell, but the progress bar is now green.
On a final
note, the JUnit GUI provides a
checkbox allowing you to “Reload classes every
run.” When checked, the JUnit
ClassLoader reads the latest
.class files for your tests each time they are
run. This allows you to leave the GUI up while you recompile your
source code. The new classes are loaded the next time you click the
Most Java IDEs are integrated with JUnit. Read your IDE documentation to learn how to run tests directly within the IDE. See Recipe 4.4 to learn how to provide more descriptive error messages. Chapter 3 shows how to run JUnit using Ant.
for an older, AWT-based test runner.