电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 在线教程-> JSP教程
JUnit和单元测试入门简介-JSP教程,Java技巧及代码
作者:网友供稿 点击:159
  西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!虚拟主机可在线rar解压,自动数据恢复设置虚拟目录等.虚拟主机免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:[1] 
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());



}

}




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·IReport与JasperReport开发详解一-JSP教程,Java技巧及代码
·JSTL(JSP标准标签库)介绍-JSP教程,资料/其它
·格式化输入日期时间控件 JieFormattedDateBox-JSP教程,Java技巧及代码
·JSTL简化JSP编码-JSP教程,Jsp/Servlet
·JUnit和单元测试入门简介-JSP教程,Java技巧及代码
·从数据库中读取一个图片并保存为一个图片文件-JSP教程,数据库相关
·Java Swing入门基础-JSP教程,Java技巧及代码
·IntelliJ IDEA培训-JSP教程,Java技巧及代码
·通过JSP的预编译消除性能瓶颈-JSP教程,Jsp/Servlet
·Java中利用JMF编写摄像头拍照程序-JSP教程,Java技巧及代码

最新文章
·J2ME中的时间处理方法
·J2ME播放声音流程简介
·J2ME开发之手机键盘使用注意问题
·J2ME 记录管理存储
·MVC模式在j2me项目中的应用(二)
·MVC模式在j2me项目中的应用(一)
·J2ME中使用记录存储系统(RMS)存储信息
·J2ME与MIDP开发(1)
·用简单的J2ME程序测试MIDlet的生命周期
·JAVA基础:提升JSP应用程序的七大绝招


 
 


版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号