JUnit 3.8.1 源码学习

时间:2023-03-08 18:36:45

JUnit 3.8.1 源码学习


  环境搭建(源码加载配置)

  由于IDE自身含有JUint插件,因此通过正常途径是没有源码加载入口的,因此需通过手动加载扩展JAR,然后再添加对应源码JAR,如图:项目右键—>PropretiesJUnit 3.8.1 源码学习

完成之后,项目结构如图:JUnit 3.8.1 源码学习

  启动类创建

  为了能够对JUint的整个流程有个完整的认识,通过一个简单的调用作为入口,走进JUint的大门。在这里通过一段非常简单的代码,如下

public class Caculator {

    int a,b;
public Caculator(int a, int b) {
super();
this.a = a;
this.b = b;
}
public static int add(int a, int b) {
return a+b;
}
public static void main(String[] args) throws NoSuchMethodException, SecurityException {
junit.textui.TestRunner.run(TestCaculator.class);
}
} public class TestCaculator extends TestCase{ public void testadd() {
int result = Caculator.add(1,2);
Assert.assertEquals(4, result);
}
}

  这里通过代码启动,junit.textui.TestRunner.run(TestCaculator.class);

  正式开始

  首先看到的是TestSuite(Test子类),通过调用TestSuite的有参构造器

  JUnit 3.8.1 源码学习


  有参构造中,最主要的就是addTestMethod方法,该方法执行条件是:测试类中有多少个方法就执行多少次,并支持测试类继承

JUnit 3.8.1 源码学习


  在方法内部,再对方法进行规则校验

JUnit 3.8.1 源码学习


  包括对方法的参数个数、方法名称、方法返回值以及方法修饰符

JUnit 3.8.1 源码学习

JUnit 3.8.1 源码学习


  同时也注意到,不管校验是否通过,都会调用addTest方法(这里用到了组合模式),添加的Test对象在执行测试类时进行遍历获取

JUnit 3.8.1 源码学习

  该方法接收一个Test接口类型的参数

  先说校验不通过的处理逻辑,在warning方法体内,通过匿名内部类的方式生成TestCase类,并重写runTest方法,其中的fail方法,则是throw一个自定义error异常信息

JUnit 3.8.1 源码学习

  JUnit 3.8.1 源码学习


   再说校验通过所调用的createTest方法,该方法主体是通过反射生成TestCase对象实例,同时将字段名称赋值给TestCase对象的fName字段(该用于日志输出)

JUnit 3.8.1 源码学习


到此,测试类已经加载完毕,接下来就是启动测试类

  对于测试结果,通过TestResult类进行接收,通过createTestResult方法new出一个TestResult实例对象,再调用其addListener方法添加监听(这里使用到了观察者模式)

  通过调用Test.run方法进行测试类的启动,这里的suite的实际类型为TestSuite类型

JUnit 3.8.1 源码学习


  调用tests方法获取加载测试类时所添加的测试类对象,遍历执行每个测试类的run方法

  JUnit 3.8.1 源码学习

JUnit 3.8.1 源码学习


  执行到TestCase的run方法,方法接收一个TestResult类型的参数,方法体内,再执行该TestResult对象的run方法

JUnit 3.8.1 源码学习


  在TestResult类中的run方法体内,调用了三个方法,其中最重要的就是Protectable这个接口的内部类实现,它的protect方法体中的TestCase.runBare()方法中的runTest方法是最终的测试方法的执行

JUnit 3.8.1 源码学习

JUnit 3.8.1 源码学习


  startTest方法,用来执行Listener(观察者)实际类型为ResultPrinter的startTest方法,控制台则输出对应的"."信息

JUnit 3.8.1 源码学习

JUnit 3.8.1 源码学习


  通过反射执行测试类中指定的测试方法,方法体重的fName字段的参数,在通过反射生成对象实例时,调用set方法进行赋值了,如在测试方法执行过程中,产生的异常,则会向上抛出

JUnit 3.8.1 源码学习

  p.protect是执行测试方法的最后一步,如执行测试方法有异常,在runProtected方法体中,进行catch捕获,并调用对应的addFailure或addError方法

JUnit 3.8.1 源码学习


  记录失败信息,fFailures用来存储产生的错误信息日志数据,用来执行Listener(观察者)实际类型为ResultPrinter的addFailure方法输出对应的错误信息

JUnit 3.8.1 源码学习


至此,启动测试类已经运行完毕,接下来就是输出运行结果

  调用fPrinter.print方法实现日志的输出

  JUnit 3.8.1 源码学习


  在方法体中的四个方法,就是最终日志的输出方法

JUnit 3.8.1 源码学习


  printFailures实现代码如下,获取在执行测试类记录的错误日志,并输出

JUnit 3.8.1 源码学习

JUnit 3.8.1 源码学习