1 package junit.textui; 2 3 4 import java.io.PrintStream; 5 6 import junit.framework.*; 7 import junit.runner.*; 8 9 /** 10 * A command line based tool to run tests. 11 * <pre> 12 * java junit.textui.TestRunner [-wait] TestCaseClass 13 * </pre> 14 * TestRunner expects the name of a TestCase class as argument. 15 * If this class defines a static <code>suite</code> method it 16 * will be invoked and the returned test is run. Otherwise all 17 * the methods starting with "test" having no arguments are run. 18 * <p> 19 * When the wait command line argument is given TestRunner 20 * waits until the users types RETURN. 21 * <p> 22 * TestRunner prints a trace as the tests are executed followed by a 23 * summary at the end. 24 */ 25 public class TestRunner extends BaseTestRunner { 26 private ResultPrinter fPrinter; 27 28 public static final int SUCCESS_EXIT= 0; 29 public static final int FAILURE_EXIT= 1; 30 public static final int EXCEPTION_EXIT= 2; 31 32 /** 33 * Constructs a TestRunner. 34 */ TestRunner()35 public TestRunner() { 36 this(System.out); 37 } 38 39 /** 40 * Constructs a TestRunner using the given stream for all the output 41 */ TestRunner(PrintStream writer)42 public TestRunner(PrintStream writer) { 43 this(new ResultPrinter(writer)); 44 } 45 46 /** 47 * Constructs a TestRunner using the given ResultPrinter all the output 48 */ TestRunner(ResultPrinter printer)49 public TestRunner(ResultPrinter printer) { 50 fPrinter= printer; 51 } 52 53 /** 54 * Runs a suite extracted from a TestCase subclass. 55 */ run(Class testClass)56 static public void run(Class testClass) { 57 run(new TestSuite(testClass)); 58 } 59 60 /** 61 * Runs a single test and collects its results. 62 * This method can be used to start a test run 63 * from your program. 64 * <pre> 65 * public static void main (String[] args) { 66 * test.textui.TestRunner.run(suite()); 67 * } 68 * </pre> 69 */ run(Test test)70 static public TestResult run(Test test) { 71 TestRunner runner= new TestRunner(); 72 return runner.doRun(test); 73 } 74 75 /** 76 * Runs a single test and waits until the user 77 * types RETURN. 78 */ runAndWait(Test suite)79 static public void runAndWait(Test suite) { 80 TestRunner aTestRunner= new TestRunner(); 81 aTestRunner.doRun(suite, true); 82 } 83 84 /** 85 * Always use the StandardTestSuiteLoader. Overridden from 86 * BaseTestRunner. 87 */ getLoader()88 public TestSuiteLoader getLoader() { 89 return new StandardTestSuiteLoader(); 90 } 91 testFailed(int status, Test test, Throwable t)92 public void testFailed(int status, Test test, Throwable t) { 93 } 94 testStarted(String testName)95 public void testStarted(String testName) { 96 } 97 testEnded(String testName)98 public void testEnded(String testName) { 99 } 100 101 /** 102 * Creates the TestResult to be used for the test run. 103 */ createTestResult()104 protected TestResult createTestResult() { 105 return new TestResult(); 106 } 107 doRun(Test test)108 public TestResult doRun(Test test) { 109 return doRun(test, false); 110 } 111 doRun(Test suite, boolean wait)112 public TestResult doRun(Test suite, boolean wait) { 113 TestResult result= createTestResult(); 114 result.addListener(fPrinter); 115 long startTime= System.currentTimeMillis(); 116 suite.run(result); 117 long endTime= System.currentTimeMillis(); 118 long runTime= endTime-startTime; 119 fPrinter.print(result, runTime); 120 121 pause(wait); 122 return result; 123 } 124 pause(boolean wait)125 protected void pause(boolean wait) { 126 if (!wait) return; 127 fPrinter.printWaitPrompt(); 128 try { 129 System.in.read(); 130 } 131 catch(Exception e) { 132 } 133 } 134 main(String args[])135 public static void main(String args[]) { 136 TestRunner aTestRunner= new TestRunner(); 137 try { 138 TestResult r= aTestRunner.start(args); 139 if (!r.wasSuccessful()) 140 System.exit(FAILURE_EXIT); 141 System.exit(SUCCESS_EXIT); 142 } catch(Exception e) { 143 System.err.println(e.getMessage()); 144 System.exit(EXCEPTION_EXIT); 145 } 146 } 147 148 /** 149 * Starts a test run. Analyzes the command line arguments 150 * and runs the given test suite. 151 */ start(String args[])152 protected TestResult start(String args[]) throws Exception { 153 String testCase= ""; 154 boolean wait= false; 155 156 for (int i= 0; i < args.length; i++) { 157 if (args[i].equals("-wait")) 158 wait= true; 159 else if (args[i].equals("-c")) 160 testCase= extractClassName(args[++i]); 161 else if (args[i].equals("-v")) 162 System.err.println("JUnit "+Version.id()+" by Kent Beck and Erich Gamma"); 163 else 164 testCase= args[i]; 165 } 166 167 if (testCase.equals("")) 168 throw new Exception("Usage: TestRunner [-wait] testCaseName, where name is the name of the TestCase class"); 169 170 try { 171 Test suite= getTest(testCase); 172 return doRun(suite, wait); 173 } 174 catch(Exception e) { 175 throw new Exception("Could not create and run test suite: "+e); 176 } 177 } 178 runFailed(String message)179 protected void runFailed(String message) { 180 System.err.println(message); 181 System.exit(FAILURE_EXIT); 182 } 183 setPrinter(ResultPrinter printer)184 public void setPrinter(ResultPrinter printer) { 185 fPrinter= printer; 186 } 187 188 189 } 190