当前位置: 首页> 技术文章 > 单元测试本质:面向逻辑块

技术文章| Articles

相关文章
  • 开源C/C++单元测试框架极昂贵?
  • 可执行的C/C++单元测试教程
  • 表格驱动的单元测试技术(1)
  • 嵌入式测试:IAR单元测试示例
  • 什么叫好用例?
  • 实现完整测试的思路和方法
  • 单元测试实践的主要问题与解决(四)
  • 单元测试实践的主要问题与解决(三)
  • 单元测试实践的主要问题与解决(二)
  • 单元测试实践的主要问题与解决(一)
  • 全面介绍单元测试
  • Cppunit 可以测试内存泄漏吗?
  • 单元测试用例概述
  • 由开发部门进行单元测试能保证测试效果吗?
  • 由谁进行测试?开发部门还是测试部门?
  • 由测试部门进行单元测试为什么成本昂贵?
  • C/C++单元测试问答(摘要)
客服中心
技术咨询:
凯乐软件技术支持联系电话 020-85589541
凯乐软件技术支持QQ QQ 凯乐软件技术支持QQ QQ
凯乐软件技术支持邮箱 邮箱
业务咨询:
凯乐软件技术支持联系电话020-85589545
凯乐软件技术支持QQ QQ 凯乐软件技术支持邮箱 邮箱
????C/C++??Ԫ???Լ?????Ѷ

单元测试本质:面向逻辑块

发布时间:2014-02-04 18:51:52

    单元测试是最早阶段的软件测试,面对的目标最小,可以综合使用黑盒测试方法和白盒测试方法,按理说,单元测试用例的设计应该是最简单的,但实际上,单元测试用例的设计常让人感觉无从下手,这是什么原因?是代码真的不具有“可测性”吗?还是测试思路和方法不对?正确的测试思路和方法是什么?单元测试工具应该具备什么样的功能,才能支持快速地构建测试用例?

   
大道至简,意思是掌握了事物的本质,事情就会变得很简单。反之,如果事情很复杂很麻烦,往往表示没有抓住本质。

   
单元测试的本质是什么?首先要看单元测试的目标是什么。单元测试检测代码功能逻辑,实现高质高效的编程。只要真正做过单元测试的工程师都知道,单元测试要做的,能做的,就是检测代码的功能逻辑,扯上其他东西是没有任何意义的。既然单元测试是对代码功能逻辑的检测,那么,测试用例要做的,就是针对代码的功能逻辑,设定其输入,并判断其输出是否符合预期,从而检测功能逻辑的正确性。功能逻辑是由什么实现的?逻辑块。所以,单元测试的本质,是面向逻辑块,单元测试用例的本质,是逻辑块的输入输出,也就是设定逻辑块的各种可能输入,及对应的预期输出。

   
一旦我们把目光转向逻辑块,所有的事情就会变得简单。来看一个典型示例。“典型”的意思是,如果这个代码不会测,实际项目也就不会测,因为同样的测试问题会大量存在;反过来,如果这个代码可以测得很好很快,那么实际项目的测试就基本上没有问题,因为已经掌握了正确的测试思路和测试方法。这个代码的功能是,取得职位列表,将职位标题拼成短信并发送给用户。参数是一个数据流,包含用户的手机号和想要什么类型的职位等信息,程序从数据库里读取对应的职位列表和一个映射表,映射表用来检查哪些职位已经发送给用户,然后把职位的标题拼成短信并且发送给用户。代码使用C++编写,但它所表达的测试问题和测试思想,则是通用的。

   

   

    请想一想,这个代码的测试思路是什么?也就是说,哪些变量要设置输入,哪些变量要判断输出?如果按照传统的方法,输入是参数,输出是返回值,那基本没法测。但是如果面向逻辑块(上面的代码分为两张图片,第二张图片实现函数的功能逻辑,也就是我们要测的逻辑块),立刻就有了思路:输入是链表对象objList和映射表对象map里的数据,输出是拼接出来的字符串,在两个地方需要判断它的值。

   
具备了面向逻辑块的测试思路,就可以将“可测性”这个词扔进垃圾桶了,除非代码真的糟糕得太过分,否则都不难测。至于代码之间的耦合,那是再正常不过的事情,代码反映了客观事物,客观事物本身就是互相关联的,代码能没有耦合?如果一个函数有多个逻辑块,同样很简单,各个逻辑块分别测试就是了。

   
面向逻辑块,测试用例的数据也很简单,因为逻辑计算涉及到的数据往往很少,且一般是基本类型。上面的示例,数据算是比较麻烦的,多数代码的测试数据量都少于这个示例。虽然这个示例的数据看起来很吓人,又有链表,又有映射表,但实际上,逻辑计算中涉及到的输入就是一些标题(title),字符串而已,也就是说,我们要加入到链表和映射表中的对象指针,不管它的类型多复杂,每个对象只需要设定标题(title)就OK了。至于输出,也不过是字符串。总之,对于这个示例,用例的输入是一系列字符串,输出也是一些字符串。

   
传统单元测试思想,是面向函数,即用例由函数的输入输出构成,这在一些特例中没有问题,例如三角形函数、排序函数之类最底层函数。这些函数,只有一个逻辑块,且逻辑块的输入输出,与函数的输入输出完全一致,当然可以使用函数的输入输出来构建测试用例。传统的单元测试用例设计技术,都拿这些特例作为基础,当面对含有耦合关系的代码时,反而作为特例来处理,要使用编写桩代码、设置模拟对象之类的麻烦方法来解决(实际上很多时候解决不了问题,例如,前面示例中的输出怎么办?)。实际项目中,代码存在耦合关系是常态,完全没有耦合的代码反而很少。这种拿特例当常态,拿常态当特例的方法,在本质上是错误的,因此必然很麻烦,从根本上造成了单元测试难度大、成本高。总之,面向函数来设计单元测试用例,测试将很困难,至于主张单元测试要面向对象、面向模块,那纯粹是胡扯。

   
有了面向逻辑块的测试思想,测试思路是很简单了,但是,如何设置逻辑块的输入值和输出值呢?逻辑块的输入,除了参数、成员变量之类的常规变量,还包括底层输入,即调用底层函数获得的输入,如前面示例中的链表和映射表对象中的数据;很多时候,还包括局部输入,即在被测试代码执行过程中对某些变量的实时赋值,如局部静态输入、中断输入、界面输入等。逻辑块的输出,除了返回值、成员变量之类的常规变量,还包括局部输出,即被测试代码执行过程中对某些变量的实时判断,如前面示例中直接发送出去的短信需要在发送前实时判断。这些问题,恰恰表明了单元测试的另一个简单:选择工具很简单。如果工具不能直接地、方便地设定逻辑块的输入输出,那基本上没法用,或者成本很高(至少十倍以上),因此,选择工具的最主要指标,就是能否直接地、方便地设定逻辑块的输入输出。Visual Unit 4可以通过在表格中填写数据,直接设定逻辑块的输入输出,例如前面的示例,使用Visual Unit 4,只要点点鼠标,在表格中填写一些字符串,就可以构建出链表和映射表中的数据,以及判断所拼接的短信是否正确。

   
也许有人认为,对于前面的示例,如果面向函数,通过设定参数来获得链表和映射表的数据,也可以达到同样的测试效果,甚至可以同时检测代码所调用的其他函数,例如用于解析用户信息的GetUserInfo ()函数,用于从数据库读取职位列表的GetJobList()函数。这种想法是完全错误的,白白浪费时间和精力,为什么?
    1、这些函数可能还没有实现,这在并行开发中很常见;
    2、这些函数或者它们所依赖的函数在测试时可能被隔离,这在大型项目中很常见;
    3、相关设备在测试时可能不存在,例如,单元测试一般不连接数据库;
    4、相关设备无法返回测试需要的数据,例如,一个取环境温度的底层函数,总是返回固定值;
    5、即使以上问题都不存在,通过设置参数来间接获得逻辑块的输入也可能非常困难,例如前面的示例,必须熟悉通讯协议,了解GetUserInfo ()函数的工作过程,并在参数中填写正确的数据流,且数据库里有合适的数据,才可能获得链表和映射表中的数据。

    面向逻辑块,则完全不需要考虑这些问题,无论多大的项目,无论多少人并行开发,都可以在开始编写代码时,就做到边开发边测试。至于底层函数,谁家的孩子谁抱,应该由编写者直接进行测试,这样才能全面地检测它的功能逻辑。


   
总之,单元测试应该面向逻辑块,只有这样,才能迅速产生测试思路,才能快速构建用例数据,才能检测功能逻辑的方方面面,不留死角,而判断一个单元测试工具是否可以高效地应用于实际项目,最主要的指标是能否直接地、方便地设置逻辑块的输入输出。

分享到:

上一篇: 嵌入式测试:IAR单元测试示例


下一篇: 什么叫好用例?

联系我们 | 专家博客 |

Copyright 2005-2021 KaileSoft All Right Reserved

  广州凯乐软件技术有限公司 粤ICP备17061168号
                      


                                                 

哆哆女性网狮子座2013年运势宝宝起名宝典 新生宝宝seo优化公司效果浩和皓哪个字起名大气免费起名名字测分电子商务网站的建设心得体会网站制作项目欢乐好声音 电影天堂起名茶叶专卖店周易免费测名打分非常网八卦起人名深圳企业网站制作服务周公解梦捡了很多钱优化 网站推广韩姓起起什么名字好seo专业培训培训平面设计创意网站群安福州网站建设开发优化公司网站给五胞胎起名字景氏男孩起名周易教育姓单 起名字低空饭店油烟净化器免费制作网站的网址给年宝宝起名姓罗新余网站制作报价如何提供网站建设公司女孩的名字怎起梦溪名字解析淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻不负春光新的一天从800个哈欠开始有个姐真把千机伞做出来了国产伟哥去年销售近13亿充个话费竟沦为间接洗钱工具重庆警方辟谣“男子杀人焚尸”男子给前妻转账 现任妻子起诉要回春分繁花正当时呼北高速交通事故已致14人死亡杨洋拄拐现身医院月嫂回应掌掴婴儿是在赶虫子男孩疑遭霸凌 家长讨说法被踢出群因自嘲式简历走红的教授更新简介网友建议重庆地铁不准乘客携带菜筐清明节放假3天调休1天郑州一火锅店爆改成麻辣烫店19岁小伙救下5人后溺亡 多方发声两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#青海通报栏杆断裂小学生跌落住进ICU代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了当地回应沈阳致3死车祸车主疑毒驾武汉大学樱花即将进入盛花期张立群任西安交通大学校长为江西彩礼“减负”的“试婚人”网友洛杉矶偶遇贾玲倪萍分享减重40斤方法男孩8年未见母亲被告知被遗忘小米汽车超级工厂正式揭幕周杰伦一审败诉网易特朗普谈“凯特王妃P图照”考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼恒大被罚41.75亿到底怎么缴男子持台球杆殴打2名女店员被抓校方回应护栏损坏小学生课间坠楼外国人感慨凌晨的中国很安全火箭最近9战8胜1负王树国3次鞠躬告别西交大师生房客欠租失踪 房东直发愁萧美琴窜访捷克 外交部回应山西省委原副书记商黎光被逮捕阿根廷将发行1万与2万面值的纸币英国王室又一合照被质疑P图男子被猫抓伤后确诊“猫抓病”

哆哆女性网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化