`
lvwenwen
  • 浏览: 958980 次
  • 性别: Icon_minigender_1
  • 来自: 魔都
社区版块
存档分类
最新评论

Junit源码分析(转)

阅读更多

Junit源码分析

junit是我们平时开发中天天用到的测试框架,为了了解器内部隐藏的机关,特意分析了一下源码,这里我们用的是Junit3.8版本。

1.包的划分

junit.awtui,这个是junit的awt实现的ui界面组件

junit.extensions这个是junit核心功能之外的扩展点,对TestCase的装饰,Demorator模式的很好的例子

junit.framework,这个是junit的核心功能,像我们平时常用的TestCase,TestSuit类都是在这的,还有Assert类,提供了我们测试中常用的断言静态方法

junit.runner,这个包下是运行TestCase的核心类,最重要的是TestListener和BaseTestRunner类,这个后面会解释到

junit.swingui,这个包的作用和junit.awtui是完全一直的,只不过是用Swing的方式实现而已

junit.textui,功能等价与junit.awtui和junit.swingui,junit控制台输出的一个实现,下面的源码解读中,我们以textui包作为ui输出解释

从上面的分析可以看出,Junit运行的最小单元是framework+runner+ui-简洁就是美

2.框架的核心类

junit的源码非常小,但是设计的非常巧妙,核心类/接口大约有5-6个的样子,通过分析,我们可以得出一下的核心类图

Test接口:这个是最顶层的测试实体抽象,接口中只定义了两个方法,countTestCases()表示当前测试实体有多少个测试用例,另一个就是核心的run方法了

TestCase类–Test接口的一个实现类,也是我们平时常用的测试父类,表示一个要进行测试的对象,在实际代码中,代表我们一个个的测试方法(junit3.8中只那些继承了TestCase类中那些以test开头的测试方法)

TestSuit类–Test接口的另一个实现,见名知其意,是一组测试用例类,和TestCase是一对多关系

TestResult类-这个是测试结果的包裹类,提供了常用的方法,如测试失败时,测试成功时做一些处理,基于Observer模式实现

TestListener接口–整个junit核心基于ObserVer模式实现,这个接口则是对Observer的抽象

BaseTestRunner类–TestListener的抽象实现,定义了通用的公共方法,而TestRunner(swing,atw,textui)则是扩展了基类的功能,提供了ui的展示层功能

2.源码解读

上面介绍了框架的核心类,接下来看下我们的核心类之间如何协调来完成测试的

3.junit的设计思想

3.1观察者模式

观察者模式的核心对象有两个,一个是要监控的对象,junit里就是一个个测试用例TestCase,另一个是观察者,当监控对象发生变化时(测试用例开始前,出错,运行失败,运行结束事件),做出一些操作(GUI更新)。从第一节的类层次中可以看出,junit本身对TestListener做了封装,上层可以通过继承这个类来快速的开发出另一种观察者的实现,如我们在Eclipse中运用junit插件,其实就是插件中扩展一下BaseTestRunner的功能,增加eclipse展示的ui而已,而底层的核心逻辑是不需要变化的

3.2模板方法模式

可以这样理解模板方法模式,在父类中定义一个算法的骨架,而具体的实现类则放在子类中去实现,junit很多地方都充斥着这种思想

TestResult.run方法就是一个模板方法startTest,runTest,endTest,依次执行,我们熟知的TestCase中,每个测试方法执行前都会运行setUp,测试方法运行完后运行tearDown方法,这个也是个模板方法模式的实现,在TestCase中有个我们不直接调的核心模板方法

/**
* Runs a TestCase.
*/
protected void run(final TestCase test) {
startTest(test);
Protectable p= new Protectable() {
public void protect() throws Throwable {
test.runBare();
}
};
runProtected(test, p);
endTest(test);
}

 

这下子搞明白了,这个方法则是在更顶层的TestResult.run中调用runBare(),然后runBare()中调用我们熟知的那些setUp,tearDown
3.3约定大于配置
测试junit3测试用例的同学都知道,要写一个让junit可以运行的测试用例,我们的测试方法必须是public void test***()这种格式的,否则junit不会执行,为什么呢?看下junit的实现细节

 

private void addTestMethod(Method m, Vector names, Class theClass) {
String name= m.getName();
if (names.contains(name))
return;
if (! isPublicTestMethod(m)) {
if (isTestMethod(m))
addTest(warning(“Test method isn’t public: “+m.getName()));
return;
}
names.addElement(name);
addTest(createTest(theClass, name));
}
private boolean isTestMethod(Method m) {
String name= m.getName();
Class[] parameters= m.getParameterTypes();
Class returnType= m.getReturnType();
return parameters.length == 0 && name.startsWith(“test”) && returnType.equals(Void.TYPE);//这个地方判断方法以test开头是写死的:)
}

 

这种做法有两种争论,一种是支持派,有这样一个约定,大家都没的选,样式统一规范,看一眼就知道是个测试方法,这种方式和maven项目的默认项目结构有点类似–要到这个山头混,就得听山大王的:)
另一种是反对派,认为这种方式太过死板,为什么测试方法不可以有参数,为什么不能不以test开头,这可能也是后来testgn,junit4横空出世的原因吧:)
4.收获&总结
一个优秀的框架不在于它有多大,内部用了多先进的技术,用最简单的东西实现最常用的功能就可以了,研究源码主要收获如下
1).系统设计(特别是框架设计)一定要简洁易懂,简洁就是美
2).为系统设计留有余地–系统的内核在于定义核心逻辑和算法,但是具体实现的多样化可以留给后来人自由扩展–对接口和抽象编程,定义钩子方法
分享到:
评论

相关推荐

    Junit源码分析(圣思园)

    **Junit源码分析(圣思园)** Junit是Java编程语言中最广泛使用的单元测试框架,它使得开发者能够方便地编写和运行可重复的、可靠的测试用例。本篇文章将深入探讨Junit的源码,揭示其内部工作原理,帮助我们更好地...

    自定义junit源码

    自定义JUnit源码是一个对Java开发人员非常有帮助的主题,特别是对于那些想要深入理解测试框架工作原理或希望根据自身需求定制测试工具的开发者。JUnit是一个广泛使用的单元测试框架,它简化了编写和运行针对Java代码...

    junit in action 源码

    10. **持续集成**:JUnit源码也揭示了如何将测试集成到持续集成(CI)系统,如Jenkins、Travis CI等,确保每次代码变更后都能自动运行测试并获取反馈。 总的来说,分析《JUnit in Action》的源码,不仅可以帮助我们...

    junit4 单元测试源码

    【标题】"junit4 单元测试源码"涉及的是Java编程中单元测试的重要工具...通过分析和运行这些源码,学习者可以掌握单元测试的基本概念,了解如何编写有效的测试用例,以及如何利用Eclipse的集成环境进行测试驱动开发。

    Junit设计模式分析(带源码)

    本资源"Junit设计模式分析(带源码)"旨在深入探讨JUnit在设计上的模式和最佳实践,通过源码分析帮助开发者更好地理解和应用这个工具。 1. 单元测试基础: 单元测试是对软件中的最小可测试单元进行检查,如函数、...

    feed4junit源码

    它能够从业务分析人员定义好的CVS或 Excel文件读取测试用例数据并在构建/单元测试框架中报告测试成功。利用Feed4JUnit能够很方便用随机但校验过的数据执行冒烟测试来提高代码 代码覆盖率和发现由非常特殊的数据结构...

    junit4测试源码

    通过分析和运行这些测试用例,我们可以了解如何编写有效的JUnit4测试,以及如何利用JUnit4提供的各种工具和特性来提高测试覆盖率和质量。 总之,理解和掌握JUnit4的源码对于Java开发者来说是至关重要的,它能帮助...

    junit4 jar包以及源码

    同时,源码分析也有助于学习最佳实践和设计模式,提升自身的编程技能。 JUnit4的主要特性包括: 1. **注解驱动**:通过注解可以轻松地标识测试方法,如@Test表示测试方法,@Before和@After分别用于在每个测试方法...

    netbeans junit 源码

    2. **JUnit框架**:JUnit源码在NetBeans中的实现意味着我们可以看到如何在IDE内部封装和扩展JUnit的API。这可能涉及到对`@Test`注解的处理,以及如何触发测试执行和显示测试结果。 3. **事件监听和API调用**:...

    Springboot-junit项目源码

    SpringBoot-junit项目源码分析 SpringBoot是一个流行的Java框架,用于快速开发微服务和Web应用程序。它简化了Spring框架的配置,使得开发者可以更快地启动项目。JUnit是Java编程语言中最常用的单元测试框架,它使得...

    JUnit设计模式分析

    本篇将深入分析JUnit源码中的设计模式,帮助你理解其内在的架构原理,提升你的编程技能。 首先,JUnit的核心设计原则之一是“开闭原则”(Open-Closed Principle),它主张软件实体(类、模块、函数等)应对于扩展...

    Junit源码【肯特版】好像是4.几版忘了

    1. **注解(Annotations)**:JUnit 4放弃了之前基于继承的测试模型,转而使用注解来标记测试方法。如`@Test`用于标记测试方法,`@Before`和`@After`分别用于在每个测试方法前和后执行的代码,还有`@Ignore`用来忽略...

    北京圣思园 junit全套笔记及源码

    【JUnit 框架详解】 JUnit 是一个广泛使用的 Java 编程语言的单元测试框架,由 Erich Gamma 和 Kent Beck 开发,它是 xUnit 家族的...结合源码分析,将帮助你更好地理解和应用这些概念,提升你的编程技能和代码质量。

    eclipse下利用ant、junit进行自动化测试例子源码

    6. **源码分析**:压缩包中的"testAntJunit"文件可能是包含了一个示例项目,这个项目演示了如何在Eclipse中设置ANT脚本和JUnit测试。通过查看源码,我们可以学习如何在代码中编写测试用例,以及如何在ANT构建文件中...

    javajunit源码-java-junit-jenkins:使用Jenkins的CI的源代码-在我的页面上发布:http://jumpsta

    JavaJUnit Jenkins 源码分析 在 Java 开发过程中,单元测试是保证代码质量的重要环节,JUnit 是一个广泛使用的 Java 单元测试框架。而 Jenkins 是一个流行的持续集成(CI)工具,它可以帮助开发者自动化构建、测试...

    JUnit设计模式分析及简化的JUnit代码

    JUnit是Java开发者进行单元测试的重要工具,由著名程序员Erich Gamma和Kent Beck共同创建,它遵循简洁、可扩展的原则,使得测试代码易于编写和维护。本文将深入探讨JUnit中的设计模式,以及如何通过理解这些模式来...

    JUnit -- 分析

    9. **源码分析**:可能深入到JUnit的源代码,解释其设计模式,如观察者模式、装饰器模式,以及JUnit如何处理测试失败和测试报告。 10. **实战示例**:结合实际项目,展示如何利用JUnit进行单元测试,解决实际问题。...

    junit-example-源码.rar

    《深入解析JUnit源码》 JUnit是Java编程语言中最广泛使用的单元测试框架,它为开发者提供了编写和执行可重复测试的便利工具。本篇将基于"junit-example-源码.rar"这一压缩包中的源码,对JUnit的核心概念、工作原理...

    junit3.8.2 jar包和源码

    4. **学习设计模式**: JUnit源码中应用了许多设计模式,如工厂模式、装饰器模式等,这些都是软件设计中的重要概念。 **总结:** JUnit 3.8.2虽然已经是一个较旧的版本,但它仍然能帮助开发者理解和学习单元测试的...

Global site tag (gtag.js) - Google Analytics