**Updates** * Project 3 neither reads from standard input nor writes gradeable text to standard output, so the mechanism below to redirect these two streams to files is not necessary for this project. Instead, your JUnit test routines can just call ''main'' directly with different versions of the ''String[] args'' array to indicate different input test files. * For command-line testing in the UNIX/Linux environment, see the new section [[#Command-Line JUnit Testing in UNIX|below]]. ====== Testing Your Project ====== //Test early, test often.// Use a [[http://www.junit.org|JUnit]] test case. JUnit is a Java package that facilitates "unit testing": creation, execution, and evaluation of repeatable tests on your code. It is designed to support incremental testing ([[http://en.wikipedia.org/wiki/Test-driven_development|test-driven development]]), but can also be used in a variety of ways including "whole program" testing. Both DrJava and Eclipse include JUnit support. ([[http://www.drjava.org/userdocs/junit.html|Chapter 7]] in the DrJava help documentation has details.) ====== Testing Programs that Read from Standard In and Write to Standard Out ====== For projects that take input from the command line (or redirected from a file) and produce gradable results to standard out, automated testing requires that these streams be redirected in the JUnit test class. This section explains how to do that. To use JUnit to test your main method with different input streams, you need to make a minor structural change. The idea is this: Use the main method to gather parameters and setup input and output streams, then call a second main method, ''mainWork(...)'', to do the actual work of your program. This arrangement allows you to programmatically set up for and call ''mainWork(...)'' from your JUnit test class. Your ''MainClass'' methods looks like this... public static void main(String[] args) { mainWork(new Scanner(System.in), System.out); } static void mainWork(Scanner stdin, PrintStream stdout) { ... original main method, using stdin for input and stdout for output... } Your ''MainClassTester'' class includes a number of methods. By default, JUnit runs all those starting with ''test'' each time you do a test run. Here is a sample test method that sets up specific files for reading and writing, then calls the ''mainWork(...)'' method. public final void testFile() { String prefix = "input1000"; String fileIn = prefix + ".txt"; String fileOut = prefix + ".out"; try { Scanner stdin = new Scanner(new File(fileIn)); PrintStream stdout = new PrintStream(new FileOutputStream(fileOut)); MainClass.mainWork(stdin, stdout); } catch (FileNotFoundException e) { fail("file '" + fileIn + "' not found"); } } In DrJava, using the "Test Project" button (bound to Ctrl-T) runs all your unit tests. The "Run" button (bound to F2) continues to run your main method (prompting you for manual input in the Interactions window). Of course, you can generalize the ''testFile()'' method to ''testFiles()'' and call a helper method that allows testing of several input files. Also, you can open and read the generated output to see if it is correct by comparing it to the contents of a known correct file. For Project 2B, you'll need to parse ''args[0]'' to get the number of threads and pass that as another parameter to ''mainWork(...)''. ====== Imports ====== You'll need imports to get access to a number of these symbols. The input/output ones are in ''java.io.*'', or you can import them explicitly. Here's a set that works in the test class... import junit.framework.TestCase; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintStream; import java.util.Scanner; ====== Command-Line JUnit Testing in UNIX ====== Here is a minimalist way to do command-line JUnit testing in the UNIX/Linux environment. - Download the latest JUnit jar file from http://www.junit.org (as of this writing, ''junit-4.5.jar''). - Put this jar file into the same directory as your test class and other project files. - Compile your test class, adding junit-4.5.jar to your classpath (either using the ''-cp'' option to ''javac'' or with the sample script below). - Run your test class using the text-based JUnit runner, ''junit.textui.TestRunner''. Here is a script, named ''javat'', that compiles and runs a test class given as the command line argument. #!/bin/sh CLASSPATH=".:junit-4.5.jar"; export CLASSPATH javac $1.java java junit.textui.TestRunner $1 If your test class is named, say, ''SpellCheckerTester'', you would type... $ ./tester SpellCheckerTester For more general-purpose use, put the ''jar'' file in your ''~/lib'' directory, add the correct ''CLASSPATH'' variable to your startup file (e.g., to ''~/.bashrc'') or edit it into the tester script, and move the ''tester'' script to your personal ''~/bin'' directory (adding that directory to your ''PATH'', if necessary).