• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 package org.junit.runner;
2 
3 import java.util.ArrayList;
4 import java.util.List;
5 
6 import junit.runner.Version;
7 import org.junit.internal.JUnitSystem;
8 import org.junit.internal.RealSystem;
9 import org.junit.internal.TextListener;
10 import org.junit.internal.runners.JUnit38ClassRunner;
11 import org.junit.runner.notification.Failure;
12 import org.junit.runner.notification.RunListener;
13 import org.junit.runner.notification.RunNotifier;
14 
15 /**
16  * <code>JUnitCore</code> is a facade for running tests. It supports running JUnit 4 tests,
17  * JUnit 3.8.x tests, and mixtures. To run tests from the command line, run
18  * <code>java org.junit.runner.JUnitCore TestClass1 TestClass2 ...</code>.
19  * For one-shot test runs, use the static method {@link #runClasses(Class[])}.
20  * If you want to add special listeners,
21  * create an instance of {@link org.junit.runner.JUnitCore} first and use it to run the tests.
22  *
23  * @see org.junit.runner.Result
24  * @see org.junit.runner.notification.RunListener
25  * @see org.junit.runner.Request
26  */
27 public class JUnitCore {
28 	private RunNotifier fNotifier;
29 
30 	/**
31 	 * Create a new <code>JUnitCore</code> to run tests.
32 	 */
JUnitCore()33 	public JUnitCore() {
34 		fNotifier= new RunNotifier();
35 	}
36 
37 	/**
38 	 * Run the tests contained in the classes named in the <code>args</code>.
39 	 * If all tests run successfully, exit with a status of 0. Otherwise exit with a status of 1.
40 	 * Write feedback while tests are running and write
41 	 * stack traces for all failed tests after the tests all complete.
42 	 * @param args names of classes in which to find tests to run
43 	 */
main(String... args)44 	public static void main(String... args) {
45 		runMainAndExit(new RealSystem(), args);
46 	}
47 
48 	/**
49 	 * Do not use. Testing purposes only.
50 	 * @param system
51 	 */
runMainAndExit(JUnitSystem system, String... args)52 	public static void runMainAndExit(JUnitSystem system, String... args) {
53 		Result result= new JUnitCore().runMain(system, args);
54 		system.exit(result.wasSuccessful() ? 0 : 1);
55 	}
56 
57 	/**
58 	 * Run the tests contained in <code>classes</code>. Write feedback while the tests
59 	 * are running and write stack traces for all failed tests after all tests complete. This is
60 	 * similar to {@link #main(String[])}, but intended to be used programmatically.
61 	 * @param computer Helps construct Runners from classes
62 	 * @param classes Classes in which to find tests
63 	 * @return a {@link Result} describing the details of the test run and the failed tests.
64 	 */
runClasses(Computer computer, Class<?>... classes)65 	public static Result runClasses(Computer computer, Class<?>... classes) {
66 		return new JUnitCore().run(computer, classes);
67 	}
68 	/**
69 	 * Run the tests contained in <code>classes</code>. Write feedback while the tests
70 	 * are running and write stack traces for all failed tests after all tests complete. This is
71 	 * similar to {@link #main(String[])}, but intended to be used programmatically.
72 	 * @param classes Classes in which to find tests
73 	 * @return a {@link Result} describing the details of the test run and the failed tests.
74 	 */
runClasses(Class<?>.... classes)75 	public static Result runClasses(Class<?>... classes) {
76 		return new JUnitCore().run(defaultComputer(), classes);
77 	}
78 
79 	/**
80 	 * Do not use. Testing purposes only.
81 	 * @param system
82 	 */
runMain(JUnitSystem system, String... args)83 	public Result runMain(JUnitSystem system, String... args) {
84 		system.out().println("JUnit version " + Version.id());
85 		List<Class<?>> classes= new ArrayList<Class<?>>();
86 		List<Failure> missingClasses= new ArrayList<Failure>();
87 		for (String each : args)
88 			try {
89 				classes.add(Class.forName(each));
90 			} catch (ClassNotFoundException e) {
91 				system.out().println("Could not find class: " + each);
92 				Description description= Description.createSuiteDescription(each);
93 				Failure failure= new Failure(description, e);
94 				missingClasses.add(failure);
95 			}
96 		RunListener listener= new TextListener(system);
97 		addListener(listener);
98 		Result result= run(classes.toArray(new Class[0]));
99 		for (Failure each : missingClasses)
100 			result.getFailures().add(each);
101 		return result;
102 	}
103 
104 	/**
105 	 * @return the version number of this release
106 	 */
getVersion()107 	public String getVersion() {
108 		return Version.id();
109 	}
110 
111 	/**
112 	 * Run all the tests in <code>classes</code>.
113 	 * @param classes the classes containing tests
114 	 * @return a {@link Result} describing the details of the test run and the failed tests.
115 	 */
run(Class<?>.... classes)116 	public Result run(Class<?>... classes) {
117 		return run(Request.classes(defaultComputer(), classes));
118 	}
119 
120 	/**
121 	 * Run all the tests in <code>classes</code>.
122 	 * @param computer Helps construct Runners from classes
123 	 * @param classes the classes containing tests
124 	 * @return a {@link Result} describing the details of the test run and the failed tests.
125 	 */
run(Computer computer, Class<?>... classes)126 	public Result run(Computer computer, Class<?>... classes) {
127 		return run(Request.classes(computer, classes));
128 	}
129 
130 	/**
131 	 * Run all the tests contained in <code>request</code>.
132 	 * @param request the request describing tests
133 	 * @return a {@link Result} describing the details of the test run and the failed tests.
134 	 */
run(Request request)135 	public Result run(Request request) {
136 		return run(request.getRunner());
137 	}
138 
139 	/**
140 	 * Run all the tests contained in JUnit 3.8.x <code>test</code>. Here for backward compatibility.
141 	 * @param test the old-style test
142 	 * @return a {@link Result} describing the details of the test run and the failed tests.
143 	 */
run(junit.framework.Test test)144 	public Result run(junit.framework.Test test) {
145 		return run(new JUnit38ClassRunner(test));
146 	}
147 
148 	/**
149 	 * Do not use. Testing purposes only.
150 	 */
run(Runner runner)151 	public Result run(Runner runner) {
152 		Result result= new Result();
153 		RunListener listener= result.createListener();
154 		fNotifier.addFirstListener(listener);
155 		try {
156 			fNotifier.fireTestRunStarted(runner.getDescription());
157 			runner.run(fNotifier);
158 			fNotifier.fireTestRunFinished(result);
159 		} finally {
160 			removeListener(listener);
161 		}
162 		return result;
163 	}
164 
165 	/**
166 	 * Add a listener to be notified as the tests run.
167 	 * @param listener the listener to add
168 	 * @see org.junit.runner.notification.RunListener
169 	 */
addListener(RunListener listener)170 	public void addListener(RunListener listener) {
171 		fNotifier.addListener(listener);
172 	}
173 
174 	/**
175 	 * Remove a listener.
176 	 * @param listener the listener to remove
177 	 */
removeListener(RunListener listener)178 	public void removeListener(RunListener listener) {
179 		fNotifier.removeListener(listener);
180 	}
181 
defaultComputer()182 	static Computer defaultComputer() {
183 		return new Computer();
184 	}
185 
186 }
187