Junit源码分析(若言于至)
- 格式:pdf
- 大小:751.21 KB
- 文档页数:33
JUNIT源码分析整理:若言于至空间:/xianming01/引文:1、《JUnit入门》,网上下载版,作者不详,共18页word文档,2758字;2、《Java开源测试工具JUnit教程》,网上下载版,作者不详,文中标题为《Java开源测试工具JUnit简介》;3、《Junit设计模式分析》,刘兵,该文发表于《程序员》第6期;4、《Junit In Action中文版》,Vincent Massol著,鲍志云译;本文内容根据以上各文中的内容整理,未经过各个作者同意。
1单元测试概述1.1关于测试的几个概念白盒测试——把测试对象看作一个打开的盒子,程序内部的逻辑结构和其他信息对测试人员是公开的。
回归测试——软件或环境的修复或更正后的“再测试”,自动测试工具对这类测试尤其有用。
单元测试——是最小粒度的测试,以测试某个功能或代码块。
一般由程序员来做,因为它需要知道内部程序设计和编码的细节。
JUnit ——是一个开发源代码的Java测试框架,用于编写和运行可重复的测试。
他是用于单元测试框架体系xUnit的一个实例(用于java语言)。
主要用于白盒测试,回归测试。
1.2单元测试概念1.2.1单元测试的好处A、提高开发速度——测试是以自动化方式执行的,提升了测试代码的执行效率。
B、提高软件代码质量——它使用小版本发布至集成,便于实现人员除错。
同时引入重构概念,让代码更干净和富有弹性。
C、提升系统的可信赖度——它是回归测试的一种。
支持修复或更正后的“再测试”,可确保代码的正确性。
1.2.2单元测试针对对象A、面向过程的软件开发针对过程。
B、面向对象的软件开发针对对象。
C、可以做类测试,功能测试,接口测试(最常用于测试类中的方法)。
1.2.3单元测试工具和框架目前的最流行的单元测试工具是xUnit系列框架,常用的根据语言不同分为JUnit(java),CppUnit(C++),DUnit (Delphi ),NUnit(.net),PhpUnit(Php )等等。
该测试框架的第一个和最杰出的应用就是由Erich Gamma (《设计模式》的作者)和Kent Beck(XP(Extreme Programming)的创始人)提供的开放源代码的JUnit。
2JUnit简介2.1JUnit的好处和JUnit单元测试编写原则好处:A、可以使测试代码与产品代码分开。
B、针对某一个类的测试代码通过较少的改动便可以应用于另一个类的测试。
C、易于集成到测试人员的构建过程中,JUnit和Ant的结合可以实施增量开发。
D、JUnit是公开源代码的,可以进行二次开发。
C、可以方便地对JUnit进行扩展。
编写原则:A、是简化测试的编写,这种简化包括测试框架的学习和实际测试单元的编写。
B、是使测试单元保持持久性。
C、是可以利用既有的测试来编写相关的测试。
2.2JUnit的特征A、使用断言方法判断期望值和实际值差异,返回Boolean值。
B、测试驱动设备使用共同的初始化变量或者实例。
C、测试包结构便于组织和集成运行。
D、支持图型交互模式和文本交互模式。
由于才开始介绍Junit,所以可能这些语言描述比较难理解,所以我们等一下介绍一个简单的应用例子来讲述具体的情况。
3JUnit简单应用实例3.1JUnit安装步骤分解在/junit/中下载JUnit包并将Junit压缩包解压到一个物理目录中(例如C:\Junit3.8.1)。
记录Junit.jar文件所在目录名(例如C:\Junit3.8.1Junit.jar)。
进入操作系统(以Windows2000操作系统为准),按照次序点击“开始设置控制面板”。
在控制面板选项中选择“系统”,点击“环境变量”,在“系统变量”的“变量”列表框中选择“CLASS-PATH”关键字(不区分大小写),如果该关键字不存在则添加。
双击“CLASS-PATH”关键字添加字符串“C:\Junit3.8.1Junti.jar”(注意,如果已有别的字符串请在该字符串的字符结尾加上分号“;”),这样确定修改后Junit就可以在集成环境中应用了。
对于IDE环境,对于需要用到的JUnit的项目增加到lib中,其设置不同的IDE有不同的设置。
3.2JUnit在Eclipse中的使用Eclipse集成了JUnit,可以非常方便地编写TestCase。
Eclipse自带了一个JUnit的插件,不用安装就可以在你的项目中开始测试相关的类,并且可以调试你的测试用例和被测试类。
下面介绍一下Eclipse中JUint使用步骤:a.创建一个新的Java Project,File-->New-->Java Project;b.输入Project name 之后点Finish;c.在src中新建一个Class,New—>Class;d.在Name栏中输入Class名,选中public static void main(string[] args);e.编辑一段代码,例如DoubleAdd.java;f.在Eclipse中加入一个JUnit库,先选择Properties;择Add Library,弹出Add Library对话框,选择JUnit点Next;选择JUnit library version,再这里我们就选择JUnit 3,然后点Finish;这样就将一个JUnit 3的库加入到doubleadd中了;g.新建一个JUnit Test Case,New-->JUnit Test Case弹出New JUnit Test Case对话框,输入Name选中setUp()和tearDown,点Finish;这样就新建了一个JUnit Test Caseh.编辑一个test casei.然后运行JUnit Test,得出结果,Run As-->JUnit Test;如果assert成功,则会出现绿色的条带。
如果有任何一个方法没有assert成功,就会显示红色的条带,并再下面的Failure Trace中说明原因。
以上就是一个简单的JUnit在Eclipse中使用的实例。
4JUnit核心类介绍4.1JUnit框架组成在junit3版本的类库如下所示:其中Junit框架核心类有如下7个类(接口):A、测试接口,定义了测试用例的接口(Test)B、对测试目标进行测试的方法与过程集合,可称为测试用例(TestCase)。
C、测试用例的集合,可容纳多个测试用例(TestCase),将其称作测试包(TestSuite)。
D、测试结果的描述与记录。
(TestResult) 。
E、测试过程中的事件监听者(TestListener)。
F、每一个测试方法所发生的与预期不一致状况的描述,称其测试失败元素(TestFailure)G、JUnit Framework中的出错异常(AssertionFailedError)。
JUnit框架是一个典型的Composite模式:TestSuite可以容纳任何派生自Test的对象;当调用TestSuite对象的run()方法是,会遍历自己容纳的对象,逐个调用它们的run()方法。
4.2JUnit的运作模式在以上的应用实例中,当你需要编写更多的test case的时候,你可以创建更多的TestCase对象。
当你需要一次执行多个TestCase对象的时候,你可以创建另一个叫做TestSuite的对象。
为了执行TestSuite,你需要使用TestRunner。
如下图所示,展现了这3个类在实践中的三重唱:++=在这里,TestSuite相当于是一个TestCase的集合,TestRunner相当于一个测试工具,将TestSuite中的用例自动执行,同时利用TestResult收集测试结果信息。
具体的流程,可以参考其中的设计模式。
5JUnit设计模式以下内容,参考《Junit设计模式分析》一文,这里仅全文引用该文中有关设计模式的内容。
3 JUnit设计模式3.1 Command(命令)模式3.1.1 问题JUnit是一个测试framework,测试人员只需开发测试用例。
然后把这些测试用例(TestCase)组成请求(可能是一个或者多个),发送到JUnit,然后由JUnit执行,最后报告详细测试结果。
其中包括执行的时间,错误方法,错误位置等。
这样测试用例的开发人员就不需知道JUnit 内部的细节,只要符合它定义的请求格式即可。
从JUnit的角度考虑,它并不需要知道请求TestCase的具体操作信息,仅把它当作一种命令来执行,然后把执行测试结果发给测试人员。
这样就使JUnit 框架和TestCase的开发人员独立开来,使得请求的一方不必知道接收请求一方的详细信息,更不必知道是怎样被接收,以及怎样被执行的,实现系统的松耦合。
3.1.2 模式的选择Command(命令)模式(请参见Gamma, E., et al. Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley, Reading, MA, 1995)则能够比较好地满足需求。
摘引其意图(intent),"将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求进行排队或记录请求日志..."Command模式告诉我们可以为一个操作生成一个对象并给出它的一个"execute(执行)"方法。
3.1.3 实现为了实现Command模式,首先定义了一个接口Test,其中Run便是Command的Execute 方法。
然后又使用Default Adapter模式为这个接口提供缺省实现的抽象类TestCase,这样开发人员就可以从这个缺省实现进行继承,而不必从Test接口直接实现。
Test我们首先来分析Test接口,它有一个countTestCases方法,用来统计这次测试有多少个TestCase,另外一个方法就是Command模式的Excecute方法,这里命名为run,参数TestResult 用来统计测试结果public interface Test {// Counts the number of test cases that will be run by this test.public abstract int countTestCases();//runs a test and collects its result in a TestResult instance.public abstract void run(TestResult result);}TestCase是该接口的抽象实现,它增加了一个测试名称属性,因为每一个TestCase在创建时都要有一个名称,如果一个测试失败了,便可识别出是哪个测试失败。