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了。

下一篇:JUnit4源代码分析---2

posted on 2012-08-22 09:08  云 娜Blog  阅读(1804)  评论(0编辑  收藏  举报