JUnit4.1源代码分析---1
用JUnit4进行测试有两种方式分别是:
(1)、命令行方式:java org.junit.runner.JUnitCore [java class...];
(2)、程序方式:直接调用org.junit.runner.JUnitCore.runClass(Class<?>...clazz)方法;
这两种测试的方法,最终调用的是同一个执行体。先看第一种测试方法:在JUnitCore这个类中,我们可以发现它有一个main方法:
1 public static void main(String... args) { 2 runMainAndExit(new RealSystem(), args); 3 }
这就是命令行方式执行的入口,JUnitCore.runMain()方法
1 public Result runMain(JUnitSystem system, String... args) { 2 system.out().println("JUnit version " + Version.id()); 3 List<Class<?>> classes= new ArrayList<Class<?>>(); 4 List<Failure> missingClasses= new ArrayList<Failure>(); 5 for (String each : args) 6 try { 7 classes.add(Class.forName(each)); 8 } catch (ClassNotFoundException e) { 9 system.out().println("Could not find class: " + each); 10 Description description= Description.createSuiteDescription(each); 11 Failure failure= new Failure(description, e); 12 missingClasses.add(failure); 13 } 14 RunListener listener= new TextListener(system); 15 addListener(listener); 16 Result result= run(classes.toArray(new Class[0])); 17 for (Failure each : missingClasses) 18 result.getFailures().add(each); 19 return result; 20 }
在上面这个方法中,主要是构造一个存储Class<?>类型的List,以供JUnitCore.run(Class<?>...clazz);来执行。
再看第二种执行方式,调用的是JUnitCore.runClass(Class<?>... classes),
1 public static Result runClasses(Class<?>... classes) { 2 return new JUnitCore().run(defaultComputer(), classes); 3 }
在这个方法里面,会构造一个默认的Computer(这个后面会解释它的用处),紧接着就调用了JUnitCore的另外一个重载的run()方法
1 public Result run(Computer computer, Class<?>... classes) { 2 return run(Request.classes(computer, classes)); 3 }
该方法会构造一个封装了Runner的Request,然后继续调用JUnitCore的run方法:
1 public Result run(Runner runner) { 2 Result result= new Result(); 3 RunListener listener= result.createListener(); 4 fNotifier.addFirstListener(listener); 5 try { 6 fNotifier.fireTestRunStarted(runner.getDescription()); 7 runner.run(fNotifier); 8 fNotifier.fireTestRunFinished(result); 9 } finally { 10 removeListener(listener); 11 } 12 return result; 13 }
该方法才是真正的开始执行Test,首先会构造一个Result的对象,顾名思义就知道它是记录运行时的状态,
1 public class Result implements Serializable { 2 private static final long serialVersionUID = 1L; 3 private AtomicInteger fCount = new AtomicInteger(); 4 private AtomicInteger fIgnoreCount= new AtomicInteger(); 5 private final List<Failure> fFailures= Collections.synchronizedList(new ArrayList<Failure>()); 6 private long fRunTime= 0; 7 private long fStartTime; 8 //....... 9 private class Listener extends RunListener { 10 //....... 11 } 12 }
包括:所运行Test的数量,所忽略Test的数量,开始运行的时间,总运行时间,运行期间出现错误的信息;它里面还包含一个私有内部类,该类的作用就是帮助Result记录状态的。最后会执行Runner的run方法。这时就真正开始执行Test了。