【原创】Junit源码分析(-)

原创 2004年07月07日 22:08:00

(由于是边看边写,有些内容是根据已有知识推理得来,不一定正确,请各位指正,谢谢)

我们测试一个类,一般都是要测试它的方法。

(Junit v.3.8.1,对主要的类逐个逐个的分析)

TestCase

Junit中分为TestSuit和TestCase,前者包括多个后者,后者一般是对一个类的测试。TestCase是一个抽象类,使用者必须要继承它来写自己的测试用例类。例如(example from Junit source code's commet):

 * public class MathTest extends TestCase {
 *     protected double fValue1;
 *     protected double fValue2;
 *
 *    protected void setUp() {
 *         fValue1= 2.0;
 *         fValue2= 3.0;

 *     }

*    //add whatever u want to test here
 * }

接下来比如说我们要测试一个名为add的method则我们要在MathTest中定义testAdd(),最好按这种方式确定你的方法名:test +whatever u want to test (第一个字母大写),原因是后面会谈到的TestCase运行你的测试方法的方法,其实如果你用过Eclipse的话就会知道,Eclipse就是按照这个规则自动生成测试方法的方法名的,再有一个就是这样命名也是我们对要测试什么一目了然。比如我们的testAdd()为(同上):

 *    public void testAdd() {
 *        double result= fValue1 + fValue2;
 *        assertTrue(result == 5.0);
 *    }

现在你可以有两种方法来运行这个testAdd()。第一种如下:

 * TestCase test= new MathTest("add") {
 *        public void runTest() {
 *            testAdd();
 *        }
 * };
 * test.run();

这是定义了一个内部类,覆盖了runTest() 方法,这是最生硬的方法,其实不要参数"add"参数是多余的,我们用的最多的还是下面这种方法。

第二种,使用java的反射机制(最近正在研究这个^_^,派上用场了),如:

 * TestCase= new MathTest("testAdd");
 * test.run();

这里传递"testAdd"参数是为了用反射机制找到并testAdd(),这个功能恰好是在前一种方法中覆盖掉的runTest() 中实现的,至于是怎么实现的,后面会详细讲。

两种方法都最后调用了run()方法,但是真正运行你的测试方法并不是在这个方法里面,我们从第一种方法中里也看到了,testAdd()是在runTest() 里调用的。其实调用run()是为了对整个测试的过程做一些统计,以及保存测试的结果在TestResult对象里,我们看run()的源代码就知道:

 /**
  * A convenience method to run this test, collecting the results with a
  * default TestResult object.
  *
  * @see TestResult
  */
 public TestResult run() {
  TestResult result= createResult();
  run(result);
  return result;
 }

 public void run(TestResult result) {
  result.run(this);
 }

这些统计处理都是在TestResult里的run(final TestCase test)里实现的,这个方法最终通过this参数调用了TestCase中的runBare()方法:

 /**
  * Runs the bare test sequence.
  * @exception Throwable if any exception is thrown
  */
 public void runBare() throws Throwable {
  setUp();
  try {
   runTest();
  }
  finally {
   tearDown();
  }
 }

大家可能对setUp()和tearDown()特别熟悉吧,对了,这就是在Eclipse里建立测试用例中要你勾选的两个选项,现在知道是干什么用的了吧,setUp()是建立你的测试环境,tearDown()则是做一些收尾工作,比如如果你测试与数据库有关的类的话,这个方法里大概就要关闭你打开的数据库连接了。

所以到这里大家也看到了,重点就在runTest(),下面我们来分析这个方法:

 protected void runTest() throws Throwable {
  assertNotNull(fName);
  Method runMethod= null;
  try {
   runMethod= getClass().getMethod(fName, null);
  } catch (NoSuchMethodException e) {
   fail("Method /""+fName+"/" not found");
  }
  if (!Modifier.isPublic(runMethod.getModifiers())) {
   fail("Method /""+fName+"/" should be public");
  }

  try {
   runMethod.invoke(this, new Class[0]);
  }

//the left code

这里要说一下 assertNotNull(fName),先判断一下要调用的方法名是否为空,如果不为空,再接下去用反射机制调用这个方法,这里要用到方法名来查找方法,也就是前面提到的为什么要那样命名你的测试方法的原因。 assertNotNull(fName)方法会抛出Erro,而不是Exception,所以不需要try-catch。

到这里TestCase的主要方法,都差不多介绍完了,但是我还要说一点。在看Junit的源代码之前,我只用Eclipse对它有过简单的应用,Eclipse帮我们做了很多事情,这个在看Junit的源代码时才知道。原来每测试一个方法,都要初始化一个TestCase实例。

今天就看到这里,也写到这里了。Junit更另我感兴趣的是整个框架的结构,这个以后再说,我还每看完呢!(^_^)

(未完待续)

【原创】Junit源码分析(-)

  • zgqtxwd
  • zgqtxwd
  • 2008年04月25日 05:32
  • 147

【JUnit4.10源代码分析】6 Runner

Runner是JUnit的工作引擎。它在诸多类型的支持下,处理测试并产生(Description)、Failure和Result等输出。...
  • yqj2065
  • yqj2065
  • 2014年10月22日 00:33
  • 3883

JUnit4.8.2源代码分析-1 说明

分析一下JUnit4.8.2的源代码
  • yqj2065
  • yqj2065
  • 2014年10月07日 01:36
  • 2825

JUnit源码分析(一)

一、引子JUnit源码是我仔细阅读过的第一个开源项目源码。阅读高手写的代码能学到一些好的编程风格和实现思路,这是提高自己编程水平行之有效的方法,因此早就想看看这些赫赫有名的框架是怎么回事了。今天就拿最...
  • ai92
  • ai92
  • 2005年03月12日 22:11
  • 17250

junit源码解析--核心类

JUnit 的概念及用途 JUnit 是由 Erich Gamma 和 Kent Beck 编写的一个开源的单元测试框架。它属于白盒测试,只要将待测类继承 TestCase 类,就可以利用 JUni...
  • u011794238
  • u011794238
  • 2016年02月01日 11:55
  • 583

JUnit3原理分析二(框架结构与源码分析)

在上一篇我们介绍了JUnit3的简单应用,这里我们会再分析JUnit3框架介绍以及部分源代码分析。源码下载地址:http://download.csdn.net/download/wuhenhcp/3...
  • chenzhentao
  • chenzhentao
  • 2016年01月28日 16:50
  • 771

分析 JUnit 框架源代码

理解 JUnit 测试框架实现原理和设计模式 本文细致地描述了 JUnit 的代码实现,在展示代码流程 UML 图的基础上,详细分析 JUnit 的内部实现代码的功能与机制,并在涉及相关设计模式的...
  • gloria0610
  • gloria0610
  • 2014年03月15日 02:53
  • 1254

Linux kernel 3.10内核源码分析--slab原理及相关代码

1、基本原理 我们知道,Linux保护模式下,采用分页机制,内核中物理内存使用buddy system(伙伴系统)进行管理,管理的内存单元大小为一页,也就是说使用buddy system...
  • omnispace
  • omnispace
  • 2016年04月01日 18:05
  • 628

Junit3.8详解

详细讲解单元测试神器Junit的使用和进阶过程
  • quwenzhe
  • quwenzhe
  • 2014年11月27日 17:35
  • 1307

JUnit源码与设计模式欣赏——JUnit学习(三)

先介绍下这篇博文的由来,之前已经对JUnit的使用经行了深入的介绍和演示(参考JUnit学习(一),JUnit学习(二)),其中的部分功能是通过分析JUnit源代码找到的。得益于这个过程有幸完整的拜读...
  • ggj20ss
  • ggj20ss
  • 2015年07月15日 18:04
  • 1273
收藏助手
不良信息举报
您举报文章:【原创】Junit源码分析(-)
举报原因:
原因补充:

(最多只允许输入30个字)