JUnit源码解析

发表于:2016-10-04来源:saymagic作者:saymagic点击数: 标签:junit
JUnit源码解析JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架,以Eclipse、IDEA等为代表的Java开发环境都对JUnit提供了非常友善的支持。提到Erich Gamma,他就是大名鼎鼎的《设计模式
JUnit源码解析
JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架,以Eclipse、IDEA等为代表的Java开发环境都对JUnit提供了非常友善的支持。提到Erich Gamma,他就是大名鼎鼎的《设计模式:可复用面向对象软件的基础》一书的作者之一。因此,JUnit当中的设计模式的运用相当得当,所以,JUnit的源码可谓相当优良的一本武林秘籍,非常值得一看。 本文基于JUnit4.12,将从JUnit的运行流程,Match验证,两个方面,来对JUnit的源码进行整体的分析。
 
运行流程
 
JUnit的启动方式有很多,比如在Android Studio中我们可以直接点击某个被@Test注解的函数来运行:
 
 
 
此时,启动的是JUniteStarter,该类是intellij为我们提供的。感兴趣可以查看其源码: https://github.com/JetBrains/intellij-community/blob/master/plugins/junit_rt/src/com/intellij/rt/execution/junit/JUnitStarter.java
 
如果我们使用gradle, 可以执行gradle test运行测试,实际上是在一个线程中执行SuiteTestClassProcessor的processTestClass方法来进行启动。其源码可以查看https://github.com/gradle/gradle/blob/master/subprojects/testing-base/src/main/java/org/gradle/api/internal/tasks/testing/SuiteTestClassProcessor.java
 
如上两种都是第三方工具为我们提供的便捷方式,实际上JUnit也提供了一个名为JUnitCore的类来供我们方便的运行测试用例
 
尽管启动JUnit的方式有很多,但这都是打开与JUnit对话的一些方式,最终执行的还是JUnit当中的起到核心作用的一些类,为了让大家对这些核心boss有一个初步了解,我画了一个类图:
 
 
 
上图中仅是JUnit中的几个核心的类,也是本分主要分析的对象。这里先给出一些对象的职责,可以有个大体的了解,后面会通过代码就会更清楚每个对象是如何完成这些职责的:
 
在类图的中央,有个叫做ParentRunne的对象很引人注目,它继承自Runner.
Runner则表示着JUnit对整个测试的抽象
Runner实现了Describable接口,Describable接口中唯一的函数getDescription()返回了Description对象,记录着测试的信息。
Statement 是一个抽象类,其 evaluate()函数代表着在测试中将被执行的方法。
ParentRunner 共有两个子类,BlockJUnit4ClassRunner 用来运行单个测试类,Suite用来一起运行多个测试类
RunnerBuilder 是生产Runner的策略,如使用@RunWith(Suite.class)标注的类需要使用Suite, 被@Ignore标注的类需要使用IgnoreClassRunner。
TestClass是对被测试的类的封装
综上,我们先从ParentRunner看起,其构造函数如下:
 
protected ParentRunner(Class<?> testClass) throws InitializationError {
    this.testClass = createTestClass(testClass);
    validate();
}
this.testClass即前文所说的TestClass,我们进入createTestClass方法来查看其如何将class对象转换为TestClass。
 
protected TestClass createTestClass(Class<?> testClass) {
        return new TestClass(testClass);
}
并没什么东西,具体的逻辑都写在TestClass的内部:
 
public TestClass(Class<?> clazz) {
    this.clazz = clazz;
    if (clazz != null && clazz.getConstructors().length > 1) {
        throw new IllegalArgumentException(
                "Test class can only have one constructor");
    }
    Map<Class<? extends Annotation>, List<FrameworkMethod>> methodsForAnnotations =
            new LinkedHashMap<Class<? extends Annotation>, List<FrameworkMethod>>();
    Map<Class<? extends Annotation>, List<FrameworkField>> fieldsForAnnotations =
            new LinkedHashMap<Class<? extends Annotation>, List<FrameworkField>>();
    scanAnnotatedMembers(methodsForAnnotations, fieldsForAnnotations);
    this.methodsForAnnotations = makeDeeplyUnmodifiable(methodsForAnnotations);
    this.fieldsForAnnotations = makeDeeplyUnmodifiable(fieldsForAnnotations);

原文转自:http://blog.saymagic.cn/2016/09/30/understand-Junit.html

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
  • 柯荷欢
    2017-01-20 18:46:36发表

    NoatyshTtP://5875.1118D.COM

  • 送现金
    2017-01-20 16:40:27发表

    MeyhouhTtP://1560.1118D.COM

  • mprjbkeq
    2017-01-15 10:35:46发表

    精仿奢侈品?复刻手表?顶级A货 http://1773.118v.net 范思哲Versace?宝格丽?Burberry?Tiffany?Dior?

  • tsxflaiz
    2017-01-15 06:08:33发表

    A货货源?奢侈品?高仿手表 +VX:LoveMeJck 范思哲Versace㈢chanel㈢万国㈢Rolex㈢IWC㈢爱马仕㈢Prada㈢

  • 路婵
    2017-01-14 15:51:37发表

    1:1手表?精仿奢侈品?精品原单 http://3382.118v.net Bvlgari?万国?GUCCI?卡地亚?IWC?卡地亚?范思哲Versace?

  • 鲁凝
    2017-01-14 15:03:22发表

    顶级A货?原单包包?原单包包 加微:LoveMeJck 劳力士?LouisVuitton?chanel?LV?Bally?Dior?Cartier?迪奥?

  • 鲁玲丽
    2017-01-14 14:16:53发表

    顶级A货?一件代发?外贸原单 加微:LoveMeJck chanelゲ万宝龙ゲ路易威登ゲ巴利ゲHermesゲ伯爵ゲ蒂芙尼ゲBallyゲ

  • 傅苑
    2017-01-14 13:25:37发表

    高仿原单﹗原单奢侈品﹗复刻手表 V:LoveMeJck Burberry?LouisVuitton?香奈儿?IWC?万宝龙?Tiffany?

  • 柯璐
    2017-01-14 12:43:01发表

    外贸原单?1:1手表?精仿奢侈品 http://3939.118v.net 菲拉格慕?万国?爱马仕?百达翡丽?伯爵?

  • 甘淑露
    2017-01-14 11:53:01发表

    外贸原单?一件代发?一件代发 http://3801.118v.net chanel?Tiffany?范思哲Versace?百达翡丽?Dior?Coach?IWC?Rolex?

  • 区娥凤
    2017-01-14 11:00:30发表

    复刻手表?一手货源?原单包包 威信:LoveMeJck LV?IWC?迪奥?范思哲Versace?Montblanc?江诗丹顿?伯爵?Dior?