由于各种缘由,一本《.Net单元测试艺术》突然出现在了我的办公桌上,于是我的单元测试之路就此开始。通过一两个月不间断的学习,以及不断结合具体的项目做开发,再结合书上的知识对单元测试有了一些个人的理解,想在此与大家交流一下。
下面分为三个部分,首先说说开发过程中个人发现的一些问题,再说说单元测试在开发过程中的作用,最后,也是最重要的如何在项目中应用单元测试。由于本人是从事.Net开发的,所以会以NUint作为单元测试工具,并且和大家分享一下,我在使用NUnit过程中遇到的一些问题,以及对单元测试的一些粗线的理解。
一、软件开发过程中存在的问题(没有使用单元测试的情况下)
难于定位bug的位置
修改一个bug,容易引进n个bug
bug越后期发现,修改越困难
后期系统的复杂性,导致难于修改和重构代码
开发人员常认为编译通过,进行了几次手工测试就等于测试通过
在完全依赖外部系统的情况下,无法进行有效的测试
手工测试效率地下,针对性不强
代码难以维护和复用
开发人员觉得测试和修改是额外的工作,认为代码通过编译和调试就完成任务
二、单元测试在开发过程中起到的作用
单元测试大大节约了测试和修改的时间
单元测试能快速定位bug
单元测试能使开发人员重新审视需求和功能的设计
单元测试强迫开发者以调用者而不是实现者的角度来设计代码,利于代码之间的解耦
便于理解API函数的如何使用
有效且便于测试各种情况
使代码可以放心修改和重构
单元测试可用作被测代码的用法说明,可作为开发文档使用
三、如何在实际项目中应用单元测试(.Net项目为例)
选用NUnit作为单元测试工具
NUnit的简单使用
单元测试的核心技术
由于篇幅和个人精力有限,我会在下一篇中讲解如何在实际项目中应用单元测试。
现在接着上次说到的内容,如何在项目中进行单元测试。由于做了一些调整,我上次发的内容,我这次也会重新发一次,请认真看看。
一、软件开发过程中存在的问题(没有使用单元测试的情况下)
难于定位bug的位置
修改一个bug,容易引进n个bug
bug越后期发现,修改越困难
后期系统的复杂性,导致难于修改和重构代码
开发人员常认为编译通过,进行了几次手工测试就等于测试通过
在完全依赖外部系统的情况下,无法进行有效的测试
手工测试效率地下,针对性不强
代码难以维护和复用
开发人员觉得测试和修改是额外的工作,认为代码通过编译和调试就完成任务
二、单元测试在开发过程中起到的作用
单元测试大大节约了测试和修改的时间
单元测试能快速定位bug
单元测试能使开发人员重新审视需求和功能的设计
单元测试强迫开发者以调用者而不是实现者的角度来设计代码,利于代码之间的解耦
自动化的单元测试能保证回归测试的有效执行
有效且便于测试各种情况
使代码可以放心修改和重构
单元测试可用作被测代码的用法说明,可作为开发文档使用
以下举一个本人项目的例子,这个被测方法是验证登陆用户是否为管理员或版主
例子:public bool IsAdminOrBoardMaster(IOnLineUser p_OnLineUser)
{
if (!IsRegularUser(p_OnLineUser))//判断是否为有效用户
return false;
if (p_OnLineUser.UserType == UserType.Teacher)//判断是否为教师
{
if (IsHeadmanForUser(p_OnLineUser.UserIdentity))//判断是否为教师组组长
return true;
else
return IsCourseClassBoardMasterForUser(p_OnLineUser.UserId);//判断是否为课程班带教老师
}
else if (p_OnLineUser.UserType == UserType.Student)//判断是否为班长
return p_OnLineUser.UserIdentity == 1;//身份为1的话,用户为班长,返回true
else
return true;//管理员
}
从以上例子可有以下的测试用例
用户为无效用户,返回false
用户有效,类型为管理员,返回true
用户有效,类型为学生且为班长,返回true
用户有效,但为普通学生,返回false
用户有效,类型为教师且为组长,返回true
用户有效,类型为教师且为课程班带教老师,返回true
用户有效,但为普通教师,返回false
根据上面的测试用例,运行单元测试,NUnit运行如下图
测试用例全部通过,现在我修改一下生产代码,令运行失败,如下图
单元测试可以好清楚地显示哪个方法,哪个参数报错了,出错原因在右面。本人通过这两个例子为了显示一下单元测试在我们实际开发中的其中一个功能,快速定位bug。下面将开始讲解如何在实际项目中应用单元测试。
原文转自:http://www.cnblogs.com/jialege/p/3601184.html