158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotpackage junit.textui; 258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.io.PrintStream; 558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.Test; 758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.TestResult; 858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.TestSuite; 958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.runner.BaseTestRunner; 1058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.runner.StandardTestSuiteLoader; 1158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.runner.TestSuiteLoader; 1258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.runner.Version; 1358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 1458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot/** 1558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * A command line based tool to run tests. 1658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * <pre> 1758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * java junit.textui.TestRunner [-wait] TestCaseClass 1858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * </pre> 1958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * TestRunner expects the name of a TestCase class as argument. 2058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * If this class defines a static <code>suite</code> method it 2158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * will be invoked and the returned test is run. Otherwise all 2258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * the methods starting with "test" having no arguments are run. 2358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * <p> 2458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * When the wait command line argument is given TestRunner 2558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * waits until the users types RETURN. 2658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * <p> 2758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * TestRunner prints a trace as the tests are executed followed by a 2858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * summary at the end. 2958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot */ 3058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotpublic class TestRunner extends BaseTestRunner { 3158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot private ResultPrinter fPrinter; 3258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 3358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public static final int SUCCESS_EXIT= 0; 3458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public static final int FAILURE_EXIT= 1; 3558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public static final int EXCEPTION_EXIT= 2; 3658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 3758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot /** 3858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * Constructs a TestRunner. 3958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot */ 4058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public TestRunner() { 4158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot this(System.out); 4258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 4358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 4458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot /** 4558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * Constructs a TestRunner using the given stream for all the output 4658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot */ 4758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public TestRunner(PrintStream writer) { 4858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot this(new ResultPrinter(writer)); 4958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 5058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 5158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot /** 5258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * Constructs a TestRunner using the given ResultPrinter all the output 5358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot */ 5458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public TestRunner(ResultPrinter printer) { 5558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot fPrinter= printer; 5658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 5758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 5858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot /** 5958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * Runs a suite extracted from a TestCase subclass. 6058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot */ 6158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot static public void run(Class testClass) { 6258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot run(new TestSuite(testClass)); 6358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 6458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 6558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot /** 6658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * Runs a single test and collects its results. 6758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * This method can be used to start a test run 6858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * from your program. 6958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * <pre> 7058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * public static void main (String[] args) { 7158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * test.textui.TestRunner.run(suite()); 7258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * } 7358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * </pre> 7458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot */ 7558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot static public TestResult run(Test test) { 7658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot TestRunner runner= new TestRunner(); 7758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot return runner.doRun(test); 7858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 7958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 8058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot /** 8158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * Runs a single test and waits until the user 8258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * types RETURN. 8358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot */ 8458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot static public void runAndWait(Test suite) { 8558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot TestRunner aTestRunner= new TestRunner(); 8658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot aTestRunner.doRun(suite, true); 8758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 8858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 8958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot /** 9058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * Always use the StandardTestSuiteLoader. Overridden from 9158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * BaseTestRunner. 9258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot */ 9358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public TestSuiteLoader getLoader() { 9458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot return new StandardTestSuiteLoader(); 9558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 9658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 9758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public void testFailed(int status, Test test, Throwable t) { 9858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 9958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 10058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public void testStarted(String testName) { 10158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 10258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 10358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public void testEnded(String testName) { 10458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 10558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 10658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot /** 10758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * Creates the TestResult to be used for the test run. 10858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot */ 10958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot protected TestResult createTestResult() { 11058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot return new TestResult(); 11158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 11258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 11358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public TestResult doRun(Test test) { 11458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot return doRun(test, false); 11558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 11658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 11758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public TestResult doRun(Test suite, boolean wait) { 11858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot TestResult result= createTestResult(); 11958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot result.addListener(fPrinter); 12058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot long startTime= System.currentTimeMillis(); 12158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot suite.run(result); 12258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot long endTime= System.currentTimeMillis(); 12358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot long runTime= endTime-startTime; 12458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot fPrinter.print(result, runTime); 12558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 12658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot pause(wait); 12758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot return result; 12858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 12958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 13058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot protected void pause(boolean wait) { 13158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot if (!wait) return; 13258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot fPrinter.printWaitPrompt(); 13358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot try { 13458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot System.in.read(); 13558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 13658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot catch(Exception e) { 13758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 13858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 13958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 14058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public static void main(String args[]) { 14158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot TestRunner aTestRunner= new TestRunner(); 14258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot try { 14358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot TestResult r= aTestRunner.start(args); 14458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot if (!r.wasSuccessful()) 14558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot System.exit(FAILURE_EXIT); 14658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot System.exit(SUCCESS_EXIT); 14758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } catch(Exception e) { 14858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot System.err.println(e.getMessage()); 14958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot System.exit(EXCEPTION_EXIT); 15058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 15158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 15258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 15358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot /** 15458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * Starts a test run. Analyzes the command line arguments and runs the given 15558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * test suite. 15658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot */ 15758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public TestResult start(String args[]) throws Exception { 15858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot String testCase= ""; 15958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot String method= ""; 16058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot boolean wait= false; 16158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 16258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot for (int i= 0; i < args.length; i++) { 16358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot if (args[i].equals("-wait")) 16458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot wait= true; 16558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot else if (args[i].equals("-c")) 16658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot testCase= extractClassName(args[++i]); 16758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot else if (args[i].equals("-m")) { 16858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot String arg= args[++i]; 16958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot int lastIndex= arg.lastIndexOf('.'); 17058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot testCase= arg.substring(0, lastIndex); 17158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot method= arg.substring(lastIndex + 1); 17258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } else if (args[i].equals("-v")) 17358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot System.err.println("JUnit " + Version.id() + " by Kent Beck and Erich Gamma"); 17458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot else 17558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot testCase= args[i]; 17658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 17758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 17858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot if (testCase.equals("")) 17958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot throw new Exception("Usage: TestRunner [-wait] testCaseName, where name is the name of the TestCase class"); 18058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 18158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot try { 18258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot if (!method.equals("")) 18358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot return runSingleMethod(testCase, method, wait); 18458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot Test suite= getTest(testCase); 18558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot return doRun(suite, wait); 18658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } catch (Exception e) { 18758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot throw new Exception("Could not create and run test suite: " + e); 18858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 18958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 19058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 19158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot protected TestResult runSingleMethod(String testCase, String method, boolean wait) throws Exception { 19258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot Class testClass= loadSuiteClass(testCase); 19358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot Test test= TestSuite.createTest(testClass, method); 19458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot return doRun(test, wait); 19558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 19658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 19758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot protected void runFailed(String message) { 19858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot System.err.println(message); 19958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot System.exit(FAILURE_EXIT); 20058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 20158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 20258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public void setPrinter(ResultPrinter printer) { 20358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot fPrinter= printer; 20458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 20558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 20658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 20758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot}