google搜索
51Testing站内搜索
软件测试门户
|
软件测试培 训
|
文章资料精选
|
软件测试论坛
|
软件测试博客
|
测试招聘求职
注册
登录
搜索
鲜花鸡蛋
调查问卷
帮助
51Testing软件测试论坛
»
[单元测试与集成测试]
»
[xUnit]
» JUnit实施 测试的概念
‹‹ 上一主题
|
下一主题 ››
发新话题
发布投票
发布商品
发布悬赏
发布活动
发布辩论
发布视频
打印
JUnit实施 测试的概念
lummyliao
高级站友
个人空间
发短消息
加为好友
当前离线
1
#
大
中
小
发表于 2004-11-29 10:51
只看该作者
JUnit实施 测试的概念
测试的概念
长期以来,我所接触的软件开发人员很少有人能在开发的过程中进行测试工作。大部分的项目都是在最终验收的时候编写测试文档。有些项目甚至没有测试文档。现在情况有了改变。我们一直提倡UML、RUP、软件工程、CMM,目的只有一个,提高软件编写的质量。举一个极端的例子:如果你是一个超级程序设计师,一个传奇般的人物。(你可以一边喝咖啡,一边听着音乐,同时编写这操作系统中关于进程调度的模块,而且两天时间内就完成了!)我真得承认,有这样的人。(那个编写UNIX中的vi编辑器的家伙就是这种人。)然而非常遗憾的是这些神仙们并没有留下如何修成正果的README。所以我们这些凡人--在同一时间只能将注意力集中到若干点(据科学统计,我并不太相信,一般的人只能同时考虑最多7个左右的问题,高手可以达到12个左右),而不能既纵览全局又了解细节--只能期望于其他的方式来保证我们所编写的软件质量。
为了说明我们这些凡人是如何的笨。有一个聪明人提出了软件熵(software entropy)的概念:一个程序从设计很好的状态开始,随着新的功能不断地加入,程序逐渐地失去了原有的结构,最终变成了一团乱麻。你可能会争辩,在这个例子中,设计很好的状态实际上并不好,如果好的话,就不会发生你所说的情况。是的,看来你变聪明了,可惜你还应该注意到两个问题:1)我们不能指望在恐龙纪元(大概是十年前)设计的结构到了现在也能适用吧。2)拥有签字权的客户代表可不理会加入一个新功能是否会对软件的结构有什么影响,即便有影响也是程序设计人员需要考虑的问题。如果你拒绝加入这个你认为致命的新
功能,那么你很可能就失去了你的住房贷款和面包(对中国工程师来说也许是米饭或面条,要看你是南方人还是北方人)。
另外,需要说明的是我看过的一些讲解测试的书都没有我写的这么有人情味(不好意思..)。我希望看到这片文章的兄弟姐妹能很容易地接受测试的概念,并付诸实施。所以有些地方写的有些夸张,欢迎对测试有深入理解的兄弟姐妹能体察民情,并不吝赐教。
好了,我们现在言归正传。要测试,就要明白测试的目的。我认为测试的目的很简单也极具吸引力:写出高质量的软件并解决软件熵这一问题。想象一下,如果你写的软件和Richard Stallman(GNU、FSF的头儿)写的一样有水准的话,是不是很有成就感?如果你一致保持这种高水准,我保证你的薪水也会有所变动。
测试也分类,白箱测试、黑箱测试、单元测试、集成测试、功能测试...。我们先不管有多少分类,如何分类。先看那些对我们有用的分类,关于其他的测试,有兴趣的人可参阅其他资料。白箱测试是指在知道被测试的软件如何(How)完成功能和完成什么样(What)的功能的条件下所作的测试。一般是由开发人员完成。因为开发人员最了解自己编写的软件。本文也是以白箱测试为主。黑箱测试则是指在知道被测试的软件完成什么样(What)的功能的条件下所作的测试。一般是由测试人员完成。黑箱测试不是我们的重点。
本文主要集中在单元测试上,单元测试是一种白箱测试。目的是验证一个或若干个类是否按所设计的那样正常工作。集成测试则是验证所有的类是否能互相配合,协同完成特定的任务,目前我们暂不关心它。下面我所提到的测试,除非特别说明,一般都是指单元测试。
需要强调的是:测试是一个持续的过程。也就是说测试贯穿与开发的整个过程中,单元测试尤其适合于迭代增量式(iterative and incremental)的开发过程。Martin Fowler(有点儿像引用孔夫子的话)甚至认为:“在你不知道如何测试代码之前,就不应该编写程序。而一旦你完成了程序,测试代码也应该完成。除非测试成功,你不能认为你编写出了可以工作的程序。”我并不指望所有的开发人员都能有如此高的觉悟,这种层次也不是一蹴而就的。但我们一旦了解测试的目的和好处,自然会坚持在开发过程中引入测试。
因为我们是测试新手,我们也不理会那些复杂的测试原理,先说一说最简单的:测试就是比较预期的结果是否与实际执行的结果一致。如果一致则通过,否则失败。看下面的例子
:
//将要被测试的类
public class Car {
public int getWheels() {
return 4;
}
}
//执行测试的类
public class testCar {
public static void main(String[] args) {
testCar myTest = new testCar();
myTest.testGetWheels();
}
public testGetWheels() {
int expectedWheels = 4;
Car myCar = Car();
if (expectedWheels==myCar.getWheels())
System.out.println("test [Car]: getWheels works perfected!");
else
System.out.println("test [Car]: getWheels DOESN'T work!");
}
}
如果你立即动手写了上面的代码,你会发现两个问题,第一,如果你要执行测试的类TestCar,你必须必须手工敲入如下命令:
[Windows] d:>java testCar
[Unix] % java testCar
即便测试如例示的那样简单,你也有可能不愿在每次测试的时候都敲入上面的命令,而希望在某个集成环境中(IDE)点击一下鼠标就能执行测试。后面的章节会介绍到这些问题。
第二,如果没有一定的规范,测试类的编写将会成为另一个需要定义的标准。没有人希望查看别人是如何设计测试类的。如果每个人都有不同的设计测试类的方法,光维护被测试的类就够烦了,谁还顾得上维护测试类?另外有一点我不想提,但是这个问题太明显了,测试类的代码多于被测试的类!这是否意味这双倍的工作?不!1)不论被测试类-Car 的 getWheels 方法如何复杂,测试类-testCar 的testGetWheels 方法只会保持一样的代码量。2)提高软件的质量并解决软件熵这一问题并不是没有代价的。testCar就是代价。
我们目前所能做的就是尽量降低所付出的代价:我们编写的测试代码要能被维护人员容易的读取,我们编写测试代码要有一定的规范。最好IDE工具可以支持这些规范。 好了,你所需要的就是JUnit。一个Open Source的项目。用其主页上的话来说就是:“JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。用于Java开发人员编写单元测试之用。”所谓框架就是 Erich Gamma 和 Kent Beck 定下了一些条条框框,你编写的测试代码必须遵循这个条条框框:继承某个类,实现某个接口。其实也就是我们前面所说的规范。好在JUnit目前得到了大多数软件工程师的认可。遵循JUnit我们会得到很多的支持。回归测试就是你不断地对所编写的代码进行测试:编写一些,测试一些,调试一些,然后循环这一过程,你会不断地重复先前的测试,哪怕你正编写其他的类,由于软件熵的存在,你可能在编写第五个类的时候发现,第五个类的某个操作会导致第二个类的测试失败。通过回归测试我们抓住了这条大Bug。
JUnit提供的assertTrue,assertNull等等方法用于单元测试中,
和assert关键字无关,结合Ant,自动批量运行单元测试已经是
项目快速迭代中尤其是应用极限编程后所需要的关键技术。
可以有效保证代码质量。
assert作为语言内置的断言检查,便利debug调试,它的语义较弱,不如JUnit提供的丰富,只assert某个布尔表达式是否为真。用assert来debug应该还是挺方便的,javac和java默认都是关闭assert选项的,打开后可以编译通过,但运行时忽略assert,保证正常情况下代码速度不应debug部分降低。而打开assert选项将执行断言,输出调试用信息。
总结一下:我个人意见是单元测试中就是使用junit.framework.Assert提供的
各种方法,assert反而会添乱。而在某些需要debug的情况下,assert会带来便利。毕竟做到了把调试代码和正式代码间的无缝集成。
搜索更多相关主题的帖子:
JUnit
概念
实施
UID
6559
帖子
21
精华
6
积分
328
综合技术指数
328
生活情趣指数
0
鲜花
0
鸡蛋
0
阅读权限
10
在线时间
7 小时
注册时间
2004-11-8
最后登录
2008-8-13
查看详细资料
TOP
lsh
高级站友
个人空间
发短消息
加为好友
当前离线
2
#
大
中
小
发表于 2004-12-8 11:27
只看该作者
unit测试新手
没做过此类测试,看得云里雾里的
UID
7512
帖子
111
精华
0
积分
260
综合技术指数
260
生活情趣指数
0
鲜花
0
鸡蛋
0
阅读权限
10
来自
北京
在线时间
22 小时
注册时间
2004-11-22
最后登录
2008-3-24
查看详细资料
TOP
hxb1118
高级站友
个人空间
发短消息
加为好友
当前离线
3
#
大
中
小
发表于 2005-1-4 11:17
只看该作者
看着测试代码比程序代码都长。。。
晕~~
UID
10331
帖子
50
精华
0
积分
203
综合技术指数
203
生活情趣指数
0
鲜花
0
鸡蛋
0
阅读权限
10
在线时间
0 小时
注册时间
2004-12-29
最后登录
2005-6-14
查看详细资料
TOP
flamezv
中级站友
个人空间
发短消息
加为好友
当前离线
4
#
大
中
小
发表于 2005-4-21 10:50
只看该作者
刚做测试没有多久,看晕了
UID
14907
帖子
14
精华
0
积分
164
综合技术指数
164
生活情趣指数
0
鲜花
0
鸡蛋
0
阅读权限
10
来自
上海
在线时间
1 小时
注册时间
2005-3-24
最后登录
2006-3-17
查看详细资料
TOP
polaris_tian
中级站友
个人空间
发短消息
加为好友
当前离线
5
#
大
中
小
发表于 2005-5-26 12:06
只看该作者
好!感谢!知道了开发同时测试的重要。
UID
16886
帖子
10
精华
0
积分
150
综合技术指数
150
生活情趣指数
0
鲜花
0
鸡蛋
0
阅读权限
10
在线时间
4 小时
注册时间
2005-4-21
最后登录
2006-3-20
查看详细资料
TOP
fish_yy
高级站友
弥勒佛
个人空间
发短消息
加为好友
当前离线
6
#
大
中
小
发表于 2005-8-10 16:58
只看该作者
用junit不是更好,省事。
UID
19940
帖子
688
精华
2
积分
384
综合技术指数
355
生活情趣指数
29
鲜花
10
鸡蛋
0
阅读权限
10
在线时间
1050 小时
注册时间
2005-6-6
最后登录
2008-8-20
查看个人网站
查看详细资料
TOP
accyangjun
中级站友
个人空间
发短消息
加为好友
当前离线
7
#
大
中
小
发表于 2006-1-14 11:10
只看该作者
抄袭哦,我学JUNIT的时候也看过一样的文章....
UID
32604
帖子
1
精华
0
积分
141
综合技术指数
141
生活情趣指数
0
鲜花
0
鸡蛋
0
阅读权限
10
在线时间
0 小时
注册时间
2005-11-26
最后登录
2006-1-14
查看详细资料
TOP
JPeanut
中级站友
个人空间
发短消息
加为好友
当前离线
8
#
大
中
小
发表于 2006-3-13 22:09
只看该作者
不错的文章
只是,如果用junit+ant的话会涉及到数据库的数据问题
junit的测试数据是硬代码的,但是,数据库一变的话,就会导致所有的测试全部失败。
因为,一直考虑把junit的测试代码和项目一起交给维护组的,所以,数据库中的数据也必须要留下来,这个在实际中会碰到多多的问题。现在正在为这个事情郁闷呢
大家有空可以私下找我聊聊关于这个问题怎么解决 msn:YoungSnow82◎hotmail。com
UID
40686
帖子
36
精华
0
积分
165
综合技术指数
165
生活情趣指数
0
鲜花
0
鸡蛋
0
阅读权限
10
在线时间
22 小时
注册时间
2006-2-17
最后登录
2008-3-28
查看详细资料
TOP
李才军
高级站友
个人空间
发短消息
加为好友
当前离线
9
#
大
中
小
发表于 2006-6-24 11:35
只看该作者
我加你了,我在学习,极限编程,有兴趣,我们可以聊聊
UID
45404
帖子
264
精华
0
积分
396
综合技术指数
394
生活情趣指数
2
鲜花
0
鸡蛋
0
阅读权限
10
在线时间
61 小时
注册时间
2006-3-16
最后登录
2007-9-6
查看详细资料
TOP
‹‹ 上一主题
|
下一主题 ››
版块跳转 ...
> [软件测试新手上路]
> [软件测试新手上路精华区]
> [每日一贴]
> [测试资源共享区]
> [软件测试职业发展]
> [企业招聘]
> [人才频道]
> [学员免费推荐]
> [个人求职]
> [简历与面试]
> [51Testing软件测试沙龙]
> [测试交流QQ群与MSN群]
> [软件测试每周一问]
> 【Software Testing English Column】
> 译文征稿活动
> [未决问题区]
> 最佳博客评选
> [软件质量管理]
> [质量管理精华区]
> [软件缺陷管理]
> [软件测试管理]
> [软件配置管理]
> [VSS/PVCS]
> [CVS/Subversion/SVN]
> [ClearCase]
> [软件需求管理]
> [嵌入式软件测试]
> [手机测试]
> [软件测试外包]
> [本地化软件测试与国际化软件测试]
> [通用软件产品测试]
> [游戏测试]
> [金融证券行业测试]
> [电信行业测试]
> [电子商务测试]
> [TestDirector&Quality Center]
> [TD&QC精华区]
> [QuickTest Pro]
> [QTP精华区]
> [LoadRunner]
> [LR精华区]
> [WinRunner]
> [WR精华区]
> [Robot]
> [Robot 精华区]
> [Rational Functional Tester]
> [其他工具与自动化测试框架]
> [Borland Silk系列工具]
> [JMeter]
> [测试用例设计]
> [单元测试与集成测试]
> [xUnit]
> [日构建和Ant]
> [系统测试]
> [WEB测试]
> [性能测试]
> [安全测试]
> [测试系统架构]
> [操作系统]
> [J2EE与中间件]
> [.Net平台]
> [数据库]
> [前沿技术、测试方法]
> [灌水乐园]
> [游戏动漫]
> [流行影音]
> [健康美食]
> [电子数码]
> [运动旅游]
> [奖励专区]
> 双节送祝福抢楼活动
> 07年度最受会员欢迎活动评选
> 07年度论坛最佳版主评选
> 众志成城 抗震救灾
> 最佳会员评选
> [投诉建议区]
> [版主申请任命专区]
控制面板首页
编辑个人资料
积分记录
公众用户组
个人空间管理
升级个人空间
当前时区 GMT+8, 现在时间是 2008-8-20 19:29Copyright(C)
上海博为峰软件技术有限公司
2001-2007 电话:021-64471599-8017
当您在访问网站、论坛及博客过程中遇到问题时可发送email:
webmaster@51testing.com
或发送论坛短信至管理员
“
风在吹
”
2008中国首届企业软件测试现状调查
软件测试沙龙(上海站)开始报名
51Testing系列丛书上市 Hot!
软件测试每周一问,答帖有奖
软件测试培训 签订合同保证就业
☆NEW第十七周版主贡献排行榜☆
高端课程打造高薪人才
51Testing FTP服务器全新开放!
IBM Rational软件开发高峰论坛9月揭幕
IBM Rational软件开发高峰论坛9月揭幕
软件测试每周一问,答帖有奖
软件测试每周一问,答帖有奖
软件测试每周一问,答帖有奖
软件测试每周一问,答帖有奖
IBM Rational软件开发高峰论坛9月揭幕
软件测试每周一问,答帖有奖
IBM Rational软件开发高峰论坛9月揭幕