| package org.junit.runner; |
| |
| import junit.runner.Version; |
| import org.junit.internal.JUnitSystem; |
| import org.junit.internal.RealSystem; |
| import org.junit.internal.TextListener; |
| import org.junit.internal.runners.JUnit38ClassRunner; |
| import org.junit.runner.notification.RunListener; |
| import org.junit.runner.notification.RunNotifier; |
| |
| /** |
| * <code>JUnitCore</code> is a facade for running tests. It supports running JUnit 4 tests, |
| * JUnit 3.8.x tests, and mixtures. To run tests from the command line, run |
| * <code>java org.junit.runner.JUnitCore TestClass1 TestClass2 ...</code>. |
| * For one-shot test runs, use the static method {@link #runClasses(Class[])}. |
| * If you want to add special listeners, |
| * create an instance of {@link org.junit.runner.JUnitCore} first and use it to run the tests. |
| * |
| * @see org.junit.runner.Result |
| * @see org.junit.runner.notification.RunListener |
| * @see org.junit.runner.Request |
| * @since 4.0 |
| */ |
| public class JUnitCore { |
| private final RunNotifier notifier = new RunNotifier(); |
| |
| /** |
| * Run the tests contained in the classes named in the <code>args</code>. |
| * If all tests run successfully, exit with a status of 0. Otherwise exit with a status of 1. |
| * Write feedback while tests are running and write |
| * stack traces for all failed tests after the tests all complete. |
| * |
| * @param args names of classes in which to find tests to run |
| */ |
| public static void main(String... args) { |
| Result result = new JUnitCore().runMain(new RealSystem(), args); |
| System.exit(result.wasSuccessful() ? 0 : 1); |
| } |
| |
| /** |
| * Run the tests contained in <code>classes</code>. Write feedback while the tests |
| * are running and write stack traces for all failed tests after all tests complete. This is |
| * similar to {@link #main(String[])}, but intended to be used programmatically. |
| * |
| * @param classes Classes in which to find tests |
| * @return a {@link Result} describing the details of the test run and the failed tests. |
| */ |
| public static Result runClasses(Class<?>... classes) { |
| return runClasses(defaultComputer(), classes); |
| } |
| |
| /** |
| * Run the tests contained in <code>classes</code>. Write feedback while the tests |
| * are running and write stack traces for all failed tests after all tests complete. This is |
| * similar to {@link #main(String[])}, but intended to be used programmatically. |
| * |
| * @param computer Helps construct Runners from classes |
| * @param classes Classes in which to find tests |
| * @return a {@link Result} describing the details of the test run and the failed tests. |
| */ |
| public static Result runClasses(Computer computer, Class<?>... classes) { |
| return new JUnitCore().run(computer, classes); |
| } |
| |
| /** |
| * @param system |
| * @param args from main() |
| */ |
| Result runMain(JUnitSystem system, String... args) { |
| system.out().println("JUnit version " + Version.id()); |
| |
| JUnitCommandLineParseResult jUnitCommandLineParseResult = JUnitCommandLineParseResult.parse(args); |
| |
| RunListener listener = new TextListener(system); |
| addListener(listener); |
| |
| return run(jUnitCommandLineParseResult.createRequest(defaultComputer())); |
| } |
| |
| /** |
| * @return the version number of this release |
| */ |
| public String getVersion() { |
| return Version.id(); |
| } |
| |
| /** |
| * Run all the tests in <code>classes</code>. |
| * |
| * @param classes the classes containing tests |
| * @return a {@link Result} describing the details of the test run and the failed tests. |
| */ |
| public Result run(Class<?>... classes) { |
| return run(defaultComputer(), classes); |
| } |
| |
| /** |
| * Run all the tests in <code>classes</code>. |
| * |
| * @param computer Helps construct Runners from classes |
| * @param classes the classes containing tests |
| * @return a {@link Result} describing the details of the test run and the failed tests. |
| */ |
| public Result run(Computer computer, Class<?>... classes) { |
| return run(Request.classes(computer, classes)); |
| } |
| |
| /** |
| * Run all the tests contained in <code>request</code>. |
| * |
| * @param request the request describing tests |
| * @return a {@link Result} describing the details of the test run and the failed tests. |
| */ |
| public Result run(Request request) { |
| return run(request.getRunner()); |
| } |
| |
| /** |
| * Run all the tests contained in JUnit 3.8.x <code>test</code>. Here for backward compatibility. |
| * |
| * @param test the old-style test |
| * @return a {@link Result} describing the details of the test run and the failed tests. |
| */ |
| public Result run(junit.framework.Test test) { |
| return run(new JUnit38ClassRunner(test)); |
| } |
| |
| /** |
| * Do not use. Testing purposes only. |
| */ |
| public Result run(Runner runner) { |
| Result result = new Result(); |
| RunListener listener = result.createListener(); |
| notifier.addFirstListener(listener); |
| try { |
| notifier.fireTestRunStarted(runner.getDescription()); |
| runner.run(notifier); |
| notifier.fireTestRunFinished(result); |
| } finally { |
| removeListener(listener); |
| } |
| return result; |
| } |
| |
| /** |
| * Add a listener to be notified as the tests run. |
| * |
| * @param listener the listener to add |
| * @see org.junit.runner.notification.RunListener |
| */ |
| public void addListener(RunListener listener) { |
| notifier.addListener(listener); |
| } |
| |
| /** |
| * Remove a listener. |
| * |
| * @param listener the listener to remove |
| */ |
| public void removeListener(RunListener listener) { |
| notifier.removeListener(listener); |
| } |
| |
| static Computer defaultComputer() { |
| return new Computer(); |
| } |
| } |