158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotpackage junit.textui; 258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport java.io.PrintStream; 558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.Test; 7b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport junit.framework.TestCase; 858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.TestResult; 958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.framework.TestSuite; 1058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.runner.BaseTestRunner; 1158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabotimport junit.runner.Version; 1258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 1358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot/** 1458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * A command line based tool to run tests. 1558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * <pre> 1658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * java junit.textui.TestRunner [-wait] TestCaseClass 1758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * </pre> 18b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 19b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * <p>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 22b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * the methods starting with "test" having no arguments are run.</p> 23b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 24b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * <p> When the wait command line argument is given TestRunner 25b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * waits until the users types RETURN.</p> 26b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 27b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * <p>TestRunner prints a trace as the tests are executed followed by a 28b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * summary at the end.</p> 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 */ 61b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot static public void run(Class<? extends TestCase> 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) { 71b3823db9f1192d8c81345740b3e65bd6738ba55bBrett 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 89b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot @Override 9058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public void testFailed(int status, Test test, Throwable t) { 9158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 9258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 93b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot @Override 9458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public void testStarted(String testName) { 9558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 9658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 97b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot @Override 9858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public void testEnded(String testName) { 9958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 10058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 10158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot /** 10258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * Creates the TestResult to be used for the test run. 10358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot */ 10458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot protected TestResult createTestResult() { 10558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot return new TestResult(); 10658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 10758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 10858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public TestResult doRun(Test test) { 10958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot return doRun(test, false); 11058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 11158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 11258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public TestResult doRun(Test suite, boolean wait) { 11358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot TestResult result= createTestResult(); 11458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot result.addListener(fPrinter); 11558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot long startTime= System.currentTimeMillis(); 11658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot suite.run(result); 11758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot long endTime= System.currentTimeMillis(); 11858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot long runTime= endTime-startTime; 11958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot fPrinter.print(result, runTime); 12058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 12158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot pause(wait); 12258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot return result; 12358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 12458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 12558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot protected void pause(boolean wait) { 12658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot if (!wait) return; 12758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot fPrinter.printWaitPrompt(); 12858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot try { 12958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot System.in.read(); 13058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 13158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot catch(Exception e) { 13258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 13358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 13458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 13558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public static void main(String args[]) { 13658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot TestRunner aTestRunner= new TestRunner(); 13758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot try { 13858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot TestResult r= aTestRunner.start(args); 13958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot if (!r.wasSuccessful()) 14058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot System.exit(FAILURE_EXIT); 14158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot System.exit(SUCCESS_EXIT); 14258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } catch(Exception e) { 14358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot System.err.println(e.getMessage()); 14458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot System.exit(EXCEPTION_EXIT); 14558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 14658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 14758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 14858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot /** 14958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * Starts a test run. Analyzes the command line arguments and runs the given 15058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot * test suite. 15158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot */ 15258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public TestResult start(String args[]) throws Exception { 15358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot String testCase= ""; 15458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot String method= ""; 15558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot boolean wait= false; 15658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 15758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot for (int i= 0; i < args.length; i++) { 15858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot if (args[i].equals("-wait")) 15958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot wait= true; 16058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot else if (args[i].equals("-c")) 16158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot testCase= extractClassName(args[++i]); 16258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot else if (args[i].equals("-m")) { 16358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot String arg= args[++i]; 16458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot int lastIndex= arg.lastIndexOf('.'); 16558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot testCase= arg.substring(0, lastIndex); 16658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot method= arg.substring(lastIndex + 1); 16758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } else if (args[i].equals("-v")) 16858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot System.err.println("JUnit " + Version.id() + " by Kent Beck and Erich Gamma"); 16958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot else 17058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot testCase= args[i]; 17158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 17258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 17358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot if (testCase.equals("")) 17458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot throw new Exception("Usage: TestRunner [-wait] testCaseName, where name is the name of the TestCase class"); 17558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 17658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot try { 17758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot if (!method.equals("")) 17858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot return runSingleMethod(testCase, method, wait); 17958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot Test suite= getTest(testCase); 18058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot return doRun(suite, wait); 18158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } catch (Exception e) { 18258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot throw new Exception("Could not create and run test suite: " + e); 18358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 18458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 18558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 18658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot protected TestResult runSingleMethod(String testCase, String method, boolean wait) throws Exception { 187b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot Class<? extends TestCase> testClass= loadSuiteClass(testCase).asSubclass(TestCase.class); 18858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot Test test= TestSuite.createTest(testClass, method); 18958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot return doRun(test, wait); 19058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 19158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 192b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot @Override 19358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot protected void runFailed(String message) { 19458a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot System.err.println(message); 19558a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot System.exit(FAILURE_EXIT); 19658a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 19758a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 19858a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot public void setPrinter(ResultPrinter printer) { 19958a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot fPrinter= printer; 20058a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot } 20158a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 20258a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot 20358a8b0aba2dec5695628a2bf25a3fae42c2c3533Brett Chabot}