您的位置:软件测试 > 开源软件测试 > 开源单元测试工具 > junit
JUnit源码分析
作者:网络转载 发布时间:[ 2013/1/18 13:59:32 ] 推荐标签:

从这个main方法入口,首先JUnit将要分析命令行的参数,然后将检查测试类是否包含符合标准的suite方法,如果有将执行方法中的内容(见图中0、1部分);如果没有找到将自动生成一个TestSuite,这样跳过了图中的0部分,并将测试用例类作为参数传入。

上面得到了一个TestSuite类型的对象,现在可以运行测试了,不过在运行前要先加载TestResult和TestListener的对象,用来监听和记录测试结果信息。剩下的在图中可以很容易的看懂了,你可以参照源码浏览一遍。

这里提出我的一点疑问。注意到JUnit实践中提示将测试类中每个测试方法公用的初始化步骤放到setup方法中。这似乎会给你一种错觉,那是你会认为setup与tearDown中的语句对于一个测试类中的所有测试方法只会运行一次。但是实际上JUnit在实现上却出乎意料,setup对于测试类中的每个测试方法都回运行一遍。意思是说,你把公用的初始化代码放到setup方法中仅仅是在代码结构上实现了重用,而没有起到任何优化系统的作用。比如你在setUp中初始化数据库连接,那么这个过程将被执行不只一次,这可有点……。我们来看下代码:

//theClass为得到的TestCase类,name为此类其中的一个方法

static public Test createTest(Class theClass, String name) {

       Constructor constructor;

       try {

              constructor= getTestConstructor(theClass);
       ……

       Object test;

       try {

//以下内容为获得一个TestCase对象,并将方法名称传入这个对象


              if (constructor.getParameterTypes().length == 0) {

                     test= constructor.newInstance(new Object[0]);

                    if (test instanceof TestCase)

                            ((TestCase) test).setName(name);

              } else {

                     test= constructor.newInstance(new Object[]{name});

              }

       ……
 

       //返回这个对象


       return (Test) test;

}

 

再看下运行处的代码,下面的方法是运行在setUp和tearDown中间的

protected void runTest() throws Throwable {

       //fName是testcase对象所拥有的那个方法的名称

       assertNotNull(fName);


       Method runMethod= null;

       try {

              //根据方法名由反射得到方法


              runMethod= getClass().getMethod(fName, null);

       }


       ……
 

              //执行测试方法

              runMethod.invoke(this, new Class[0]);
……

       }


这样每执行一个测试方法要运行一遍setUp和tearDown方法,大概是这样一个过程:

恩……,也许这是为了兼容老的版本,也许是……。还好,JUnit提供了一个补救的扩展类,那是我们上面提到的TestSetup,在这里类里面真正的实现了setUp、tearDown方法的提取使用。你在使用的时候,通过继承来实现自己的setUp、tearDown方法,并使用装饰模式独有的调用方式来使用它可以了。

在阅读的过程中,代码风格上给我明显的感觉是,代码基本上全多做到了细化,将每个功能点单独提取到一个方法中,这样提高了代码的可复用性。可是在阅读的时候,在方法间频繁的跳跃,实在不是件好事,如果没有IDE的帮助,我非要晕掉不可。

因此我认为在提高代码重用上还是要坚持这样的一条原则:到必要的时候再下手。是说,在你刚开始写代码的时候不要考虑什么重用和扩展,只有当你真正需要复用某段代码或者扩展系统时,在动手吧(记得在某位牛人的书上是这么来比喻的:让第一颗子弹打中你)。

JUnit中使用的是老版本java collection,这大概是因为JUnit初版本出现的时候还没有新版collection推出。这种代码不应该出现在我们现在编写的代码中了,请注意。

好了,基本上分析完了JUnit的代码,不知道你学到了什么。希望本文能够起到抛砖引玉的作用。

上一页123下一页
软件测试工具 | 联系我们 | 投诉建议 | 诚聘英才 | 申请使用列表 | 网站地图
沪ICP备07036474 2003-2017 版权所有 上海泽众软件科技有限公司 Shanghai ZeZhong Software Co.,Ltd