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

JUnit和单元测试入门简介(转)

阅读更多

junit和单元测试入门简介

1、几个相关的概念

白盒测试——把测试对象看作一个打开的盒子,程序内部的逻辑结构和其他信息对测试人员是公开的。

回归测试——软件或环境的修复或更正后的“再测试”,自动测试工具对这类测试尤其有用。

单元测试——是最小粒度的测试,以测试某个功能或代码块。一般由程序员来做,因为它需要知道内部程序设计和编码的细节。

junit ——是一个开放源代码的java测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系xunit的一个实例(用于java语言)。主要用于白盒测试,回归测试。



2、单元测试概述

2.1、单元测试的好处

a、提高开发速度——测试是以自动化方式执行的,提升了测试代码的执行效率。

b、提高软件代码质量——它使用小版本发布至集成,便于实现人员除错。同时引入重构概念,让代码更干净和富有弹性。

c、提升系统的可信赖度——它是回归测试的一种。支持修复或更正后的“再测试”,可确保代码的正确性。

2.2、单元测试的针对对象

a、面向过程的软件开发针对过程。

b、面向对象的软件开发针对对象。

c、可以做类测试,功能测试,接口测试(最常用于测试类中的方法)。

2.3、单元测试工具和框架

目前的最流行的单元测试工具是xunit系列框架,常用的根据语言不同分为junit(java),cppunit(c++),dunit (delphi ),nunit(.net),phpunit(php )等等。该测试框架的第一个和最杰出的应用就是由erich gamma (《设计模式》的作者)和kent beck(xp(extreme programming)的创始人 )提供的开放源代码的junit。



3.junit入门简介

3.1、junit的好处和junit单元测试编写原则

好处:

a、可以使测试代码与产品代码分开。

b、针对某一个类的测试代码通过较少的改动便可以应用于另一个类的测试。

c、易于集成到测试人员的构建过程中,junit和ant的结合可以实施增量开发。

d、junit是公开源代码的,可以进行二次开发。

c、可以方便地对junit进行扩展。

编写原则:

a、是简化测试的编写,这种简化包括测试框架的学习和实际测试单元的编写。

b、是使测试单元保持持久性。

c、是可以利用既有的测试来编写相关的测试。

3.2、junit的特征

a、使用断言方法判断期望值和实际值差异,返回boolean值。

b、测试驱动设备使用共同的初始化变量或者实例。

c、测试包结构便于组织和集成运行。

d、支持图型交互模式和文本交互模式。

3.3、junit框架组成

a、对测试目标进行测试的方法与过程集合,可称为测试用例(testcase)。

b、测试用例的集合,可容纳多个测试用例(testcase),将其称作测试包(testsuite)。

c、测试结果的描述与记录。(testresult) 。

d、测试过程中的事件监听者(testlistener)。

e、每一个测试方法所发生的与预期不一致状况的描述,称其测试失败元素(testfailure)

f、junit framework中的出错异常(assertionfailederror)。

junit框架是一个典型的composite模式:testsuite可以容纳任何派生自test的对象;当调用testsuite对象的run()方法时,会遍历自己容纳的对象,逐个调用它们的run()方法。(可参考《程序员》2003-6期)。

3.4、junit的安装和配置

junit安装步骤分解:

在http://download.sourceforge.net/junit/中下载junit包并将junit压缩包解压到一个物理目录中(例如c:\junit3.8.1)。
记录junit.jar文件所在目录名(例如c:\junit3.8.1\junit.jar)。
进入操作系统(以windows2000操作系统为准),按照次序点击“开始 设置 控制面板”。
在控制面板选项中选择“系统”,点击“环境变量”,在“系统变量”的“变量”列表框中选择“class-path”关键字(不区分大小写),如果该关键字不存在则添加。
双击“class-path”关键字添加字符串“c:\junit3.8.1\junti.jar”(注意,如果已有别的字符串请在该字符串的字符结尾加上分号“;”),这样确定修改后junit就可以在集成环境中应用了。
对于ide环境,对于需要用到的junit的项目增加到lib中,其设置不同的ide有不同的设置 。
3.5、junit中常用的接口和类

test接口——运行测试和收集测试结果

test接口使用了composite设计模式,是单独测试用例 (testcase),聚合测试模式(testsuite)及测试扩展(testdecorator)的共同接口。
它的public int counttestcases()方法,它来统计这次测试有多少个testcase,另外一个方法就是public void run( testresult ),testresult是实例接受测试结果, run方法执行本次测试。
testcase抽象类——定义测试中固定方法

testcase是test接口的抽象实现,(不能被实例化,只能被继承)其构造函数testcase(string name)根据输入的测试名称name创建一个测试实例。由于每一个testcase在创建时都要有一个名称,若某测试失败了,便可识别出是哪个测试失败。
testcase类中包含的setup()、teardown()方法。setup()方法集中初始化测试所需的所有变量和实例,并且在依次调用测试类中的每个测试方法之前再次执行setup()方法。teardown()方法则是在每个测试方法之后,释放测试程序方法中引用的变量和实例。
开发人员编写测试用例时,只需继承testcase,来完成run方法即可,然后junit获得测试用例,执行它的run方法,把测试结果记录在testresult之中。
assert静态类——一系列断言方法的集合

assert包含了一组静态的测试方法,用于期望值和实际值比对是否正确,即测试失败,assert类就会抛出一个assertionfailederror异常,junit测试框架将这种错误归入failes并加以记录,同时标志为未通过测试。如果该类方法中指定一个string类型的传参则该参数将被做为assertionfailederror异常的标识信息,告诉测试人员改异常的详细信息。
junit 提供了6大类31组断言方法,包括基础断言、数字断言、字符断言、布尔断言、对象断言。
其中assertequals(object expcted,object actual)内部逻辑判断使用equals()方法,这表明断言两个实例的内部哈希值是否相等时,最好使用该方法对相应类实例的值进行比较。而assertsame(object expected,object actual)内部逻辑判断使用了java运算符“==”,这表明该断言判断两个实例是否来自于同一个引用(reference),最好使用该方法对不同类的实例的值进行比对。asserequals(string message,string expected,string actual)该方法对两个字符串进行逻辑比对,如果不匹配则显示着两个字符串有差异的地方。comparisonfailure类提供两个字符串的比对,不匹配则给出详细的差异字符。
testsuite测试包类——多个测试的组合

testsuite类负责组装多个test cases。待测得类中可能包括了对被测类的多个测试,而testsuit负责收集这些测试,使我们可以在一个测试中,完成全部的对被测类的多个测试。
testsuite类实现了test接口,且可以包含其它的testsuites。它可以处理加入test时的所有抛出的异常。
testsuite处理测试用例有6个规约(否则会被拒绝执行测试)
a 测试用例必须是公有类(public)

b 测试用例必须继承与testcase类

c 测试用例的测试方法必须是公有的( public )

d 测试用例的测试方法必须被声明为void

e 测试用例中测试方法的前置名词必须是test

f 测试用例中测试方法误任何传递参数

n testresult结果类和其它类与接口

testresult结果类集合了任意测试累加结果,通过testresult实例传递个每个测试的run()方法。testresult在执行testcase是如果失败会异常抛出
testlistener接口是个事件监听规约,可供testrunner类使用。它通知listener的对象相关事件,方法包括测试开始starttest(test test),测试结束endtest(test test),错误,增加异常adderror(test test,throwable t)和增加失败addfailure(test test,assertionfailederror t)
testfailure失败类是个“失败”状况的收集类,解释每次测试执行过程中出现的异常情况。其tostring()方法返回“失败”状况的简要描述


3.6、junit一个实例

在控制台中简单的范例如下:
1、写个待测试的triangle类,创建一个testcase的子类exampletest:
2、 exampletest中写一个或多个测试方法,断言期望的结果(注意:以test作为待测试的方法的开头,这样这些方法可以被自动找到并被测试)
3、 exampletest中写一个suite()方法,它会使用反射动态的创建一个包含所有的testxxxx方法的测试套件:
4、 exampletest可以写setup()、teardown()方法,以便于在测试时初始化或销毁测试所需的所有变量和实例。(不是必须的)

5、写一个main()方法以文本运行器或其它gui的方式方便的运行测试

6、编译exampletest,执行测试。

3.7、eclipse中junit的使用

eclipse自带了一个junit的插件,不用安装就可以在你的项目中开始测试相关的类,并且可以调试你的测试用例和被测试类。

使用步骤如下:

1、新建一个测试用例,点击“file->new->other…菜单项,在弹出的“new”对话框中选择”java->junit”,下的testcase 或testsuite,就进入“new junit testcase”对话框

2、在“new junit testcase”对话框填写相应的栏目,主要有name(测试用例名),superclass(测试的超类一般是默认的junit.framework.testcase),class under test(被测试的类),source folder(测试用例保存的目录),package(测试用例包名),及是否自动生成main,setup,teardown方法。

3、如果点击下面的”next>”按钮,你还可以直接勾选你想测试的被测试类的方法,eclipse将自动生成与被选方法相应的测试方法,点击“fishish”按钮后一个测试用例就创建好了。

4、编写完成你的测试用例后,点击“run”按钮就可以看到运行结果了。

3.8、junit的扩展应用

以下罗列了些junit的扩展应用:

junit + httpunit=web功能测试工具
junit + hansel =代码覆盖测试工具
junit + abbot =界面自动回放测试工具
junit + dbunit =数据库测试工具
junit + junitperf=性能测试工具

3.9、一些使用junit经验

不要用testcase的构造函数初始化,而要用setup()和teardown()方法。
不要依赖或假定测试运行的顺序,因为junit利用vector保存测试方法。所以不同的平台会按不同的顺序从vector中取出测试方法。
避免编写有副作用的testcase。例如:如果随后的测试依赖于某些特定的交易数据,就不要提交交易数据。简单的回滚就可以了。
当继承一个测试类时,记得调用父类的setup()和teardown()方法。
将测试代码和工作代码放在一起,一边同步编译和更新。
测试类和测试方法应该有一致的命名方案。如在工作类名前加上test从而形成测试类名。
确保测试与时间无关,不要依赖使用过期的数据进行测试。导致在随后的维护过程中很难重现测试。
如果你编写的软件面向国际市场,编写测试时要考虑国际化的因素。不要仅用母语的locale进行测试。
尽可能地利用junit提供地assert/fail方法以及异常处理的方法,可以使代码更为简洁。
测试要尽可能地小,执行速度快。


参考资料与附件

1. http:// www.junit.org junit官方网站

2. http://bbs.51cmm.com 的测试论坛

3. http://www.uml.org.cn 的软件测试专栏

4. 单元测试 《程序员》 2002年7期

5. junit设计模式分析 《程序员》2003年6期

6. 《软件测试和junit实践》

7. 附件triangle.java 一个要测试的类

8. 附件exampletest.java 一个测试用例类






triangle.java

/** 

* this is triangle class 

* @author liujun 

*/ 

public class triangle 

{ 

//定义三角形的三边 

protected long lbordera = 0; 

protected long lborderb = 0; 

protected long lborderc = 0; 



//构造函数 

public triangle(long lbordera,long lborderb,long lborderc) 

{ 

this.lbordera = lbordera; 

this.lborderb = lborderb; 

this.lborderc = lborderc; 

} 

/** 

* 判断是否是三角形 

* 是返回ture;不是返回false 

*/ 

public boolean istriangle(triangle triangle) 

{ 

boolean istrue = false; 

//判断边界,大于0小于200,出界返回false 

if((triangle.lbordera>0&&triangle.lbordera<200) 

&&(triangle.lborderb>0&&triangle.lborderb<200) 

&&(triangle.lborderc>0&&triangle.lborderc<200)) 

{ 

//判断两边之和大于第三边 

if((triangle.lbordera<(triangle.lborderb+triangle.lborderc)) 

&&(triangle.lborderb<(triangle.lbordera+triangle.lborderc)) 

&&(triangle.lborderc<(triangle.lbordera+triangle.lborderb))) 

istrue = true; 

} 

return istrue; 

} 



/** 

* 判断三角形类型 

* 等腰三角形返回字符串“等腰三角形”; 

* 等边三角形返回字符串“等边三角形”; 

* 其它三角形返回字符串“不等边三角形”; 

*/ 

public string istype(triangle triangle) 

{ 

string strtype = ""; 

// 判断是否是三角形 

if(this.istriangle(triangle)) 

{ 

//判断是否是等边三角形 if(triangle.lbordera==triangle.lborderb&&triangle.lborderb==triangle.lborderc) 

strtype = "等边三角形"; 

//判断是否是不等边三角形 

else if((triangle.lbordera!=triangle.lborderb)&& 

(triangle.lborderb!=triangle.lborderc)&& 

(triangle.lbordera!=triangle.lborderc)) 

strtype = "不等边三角形"; 

else 

strtype="等腰三角形"; 

} 

return strtype; 

} 

} 



exampletest.java 

import junit.framework.*; 

/** 

* some tests. 

* 

*/ 

public class exampletest extends testcase { 

public triangle triangle; 

//初始化 

protected void setup() { 

triangle=new triangle(10,2,9); 

} 



public static test suite() { 

return new testsuite(exampletest.class); 

} 

//函数istriangle()的测试用例 

public void testistriangle() { 

asserttrue(triangle.istriangle(triangle)); 

} 

//函数istype()的测试用例 

public void testistype() 

{ 

assertequals("这次测试",triangle.istype(triangle),"不等边三角形"); 

} 



//执行测试 

public static void main (string[] args) { 

//文本方式 

junit.textui.testrunner.run(suite()); 

//swingui方式 

//junit.swingui.testrunner.run(suite().getclass()); 

//awtui方式 

//junit.awtui.testrunner.run(suite().getclass()); 



} 

} 

 

分享到:
评论

相关推荐

    软件测试技术JUnit和单元测试入门简介

    JUNIT软件测试软件测试技术JUnit和单元测试入门简介软件测试1、几个相关的概念白盒测试——把测试对象看作一个打开的盒子,程序内部的逻辑结构和其他信息对测试人员是公开的。回归测试——软件或环境的修复或更正后...

    Junit4单元测试必备入门教程

    JUnit单元测试的重要性 ------------------- 单元测试是java开发必备技能,它可以确保代码的正确性和可靠性。JUnit是一个流行的单元测试框架,它可以帮助开发者快速地编写和执行单元测试。 JUnit4的改进 ---------...

    Junit4单元测试入门例子

    Junit4作为Java领域最常用的单元测试框架,为开发者提供了方便、高效的测试工具。本文将深入探讨如何使用Junit4对名为Calculate的类进行单元测试,包括其加减乘除四个方法。 首先,我们需要了解Junit4的基本结构和...

    在软件测试中了解JUnit和单元测试入门简介

    JUNIT软件测试在软件测试中了解JUnit和单元测试入门简介1、几个相关的概念白盒测试——把测试对象看作一个打开的盒子,程序内部的逻辑结构和其他信息对测试人员是公开的。回归测试——软件或环境的修复或更正后的...

    JUnit4单元测试入门详解.pdf

    JUnit是一个非常流行的Java单元测试框架,它允许开发者编写和运行可重复的测试代码。JUnit 4是该框架的一个重要版本,它利用Java 5的注解(Annotation)特性极大地简化了测试用例的编写过程。 在介绍JUnit 4之前,...

    JUnit和单元测试简介PDF格式

    ### JUnit和单元测试简介 #### 一、基础知识与概念 **1.1 白盒测试与回归测试** - **白盒测试**:这是一种测试策略,其中测试人员完全了解被测对象的内部工作原理和逻辑结构。这有助于深入检查代码的具体实现细节...

    JUnit单元测试入门必看篇

    JUnit单元测试入门必看篇 JUnit单元测试是Java开发中的一种测试方法,它可以帮助开发者确保代码的正确性和稳定性。以下是JUnit单元测试的知识点总结: 1. 什么是单元测试? 单元测试是指对软件的最小单元进行测试...

    junit4 单元测试源码

    【标题】"junit4 单元测试源码"涉及的是Java编程中单元测试的重要工具JUnit4的使用,这是对代码进行验证和调试的关键部分。JUnit4是JUnit框架的一个版本,它提供了更灵活的注解、测试套件管理和断言方式,使得编写...

    JUnit做单元测试

    在开始使用JUnit进行单元测试之前,了解其基本概念和使用方法是非常重要的。这包括如何编写测试用例、如何组织测试类、如何断言预期结果等。JUnit提供了丰富的API来支持这些操作,例如`assertEquals`用于验证预期值...

    junit单元测试文档

    JUnit单元测试框架是基于Java语言的一种流行的单元测试工具,它的最新版本JUnit 5相比之前的版本有显著的改进和发展。JUnit 5由三个不同的子项目组成:JUnit Platform、JUnit Jupiter和JUnit Vintage。 JUnit ...

    单元测试(Junit,selenium)

    本文将详细介绍两种常用的单元测试工具:JUnit和Selenium,并探讨它们在单元测试中的应用。 #### 二、JUnit简介 JUnit是一种广泛使用的Java单元测试框架。它最初由Kent Beck和Erich Gamma开发,目的是简化Java应用...

    JUnit API和入门手册 chm

    总的来说,掌握JUnit对于任何Java开发者来说都是必备技能,通过阅读这些资源,你可以从基础到高级,全面了解和运用JUnit进行有效的单元测试。这将极大地提升你的开发效率,确保软件的质量和稳定性。

    Junit使用教程 测试教程 使用入门

    它是用于单元测试框架体系xUnit的一个实例(用于Java语言)。以下是JUnit的特性: 1.断言(Assertion):用于测试期望结果的断言,确保测试结果符合预期。 2.测试工具:用于共享共同测试数据的测试工具,提高测试...

    JUnit测试代码示例

    JUnit是Java编程语言中最...随着JUnit4和JUnit5的出现,更多的高级特性,如参数化测试、异步测试、规则等,使得单元测试更加灵活和强大。不过,了解JUnit3的基本概念和实践对于理解后续版本的演变和使用是至关重要的。

    junit5学习入门

    **单元测试定义**:单元测试是对软件中的最小可测试单元进行检查和验证的过程,通常是指单个函数或类。其目的是确保每个单元都能按照预期正确地运行。 **单元测试的好处**: - 提高代码质量。 - 增强软件的可靠性。...

Global site tag (gtag.js) - Google Analytics