探讨软件测试“误区”
2011-03-17乔勇诚
乔勇诚
(中国电子科技集团公司第三十研究所,四川 成都 610041)
0 引言
你听过那个古老的 IT专业的创世纪笑话吗?“为什么上帝只花了 7天就创造了宇宙?”答案是:“因为他以前没有安装过。他没有什么可以搞砸的东西,不会激怒现有的用户,无需顾虑先前的功能和蹩脚的设计。上帝走运,可是我们就没那么走运了。”
从这则笑话中可以看出,随着世界的进步,生活水平的提高,人们的需求越来越多样化,科技产品越来越先进化、大型化和复杂化。这些都极大的促进了软件信息化产业的蓬勃发展,当前人们已经越来越离不开软件系统,而由于软件的易频繁发生故障的特性,软件测试行业也迎来了高速发展的阶段。
我国对软件测试的研究相对于国外来说,起步较晚,发展较慢,直到21世纪初期,我国才逐步开始重视软件测试行业。2003年国家人事部和信息产业部开始颁发“软件评测师”职业资质认证证书。各个大型企业也相继组建自己的测试部门或团队,而对于大型软件系统外包项目,很多企业还引入了第三方的评测机构,这些都刺激了国内软件测试行业的迅速发展。但是,相对于国外的软件测试水平还存在不小的差距。很多的人,甚至软件测试人员本身对软件测试领域的认知,还存在许多误区,我这里例举6个常见误区,与大家一起探讨和剖析。
1 软件测试误区
(1)“误区1”:软件质量是通过测试来保证的
许多企业或个人都认为有了专职的测试人员或测试团队,软件的质量就可以得到保障,甚至把软件测试人员就当成软件质量保证人员。其实软件质量保证的含义是通过建立一套有计划、有系统的方法,来保证拟定出的标准、步骤、实践和方法能够正确地被所有项目所采用[2-3]。而软件质量的提高是通过整个产品的质量和整个团队的努力,以及产品的开发过程决定的。
软件测试只是软件生产过程中,为提高软件质量而进行的一种检查措施或者叫监督措施。这就像食品有质量监督部门,但是毒奶粉、爆炸瓜等问题依然不断;又比如房屋建设有监管机构,但是豆腐渣工程仍然层出不穷,显然监管机构不能绝对保证质量。所以说,测试人员或团队是不能绝对保证高质量的软件产品。
如何才能生产出高质量的软件呢?个人认为:无论是什么样的活动或过程,都是离不开人的行为,在软件开发中,主体就是软件设计人员、开发人员、质量保证人员和测试人员。用一种科学的、高效的,同时又是符合自身当前实际情况的软件生产过程或方法,将各个角色人员有机的结合起来,使之能够紧密合作、相辅相成,才有可能生产出高质量的产品。这种方法目前已经有很多了,而现在最需要作的就是在这些科学方法的基础上,去寻找最适合自己的方法,这也是软件质量人员需要永恒探讨的课题。
(2)“误区2”:软件测试的真正价值
目前在许多企业中,评估软件测试活动时,通常采用软件缺陷数量、软件缺陷的严重性、测试用例的多少、自动化测试的代码量、手动测试的代码量、回归测试套件的数目以及所有具体的指标来进行衡量。而这些指标并不能够真正体现软件测试的价值,软件测试的工作绩效应该体现在提高了多少开发人员的工作绩效上。所以说软件测试并不能保证软件会更好,但是可以保证开发人员会更好的进行编程。
软件开发人员制造软件,而软件测试如果仅仅是帮助他找出缺陷并去掉它,那么软件测试并没有创造出自己的真正价值。如果软件测试人员努力认真的对待自己的工作,让软件测试产生持续有效的正面影响,那么就应该帮助开发人员理解程序中出现的问题和原因,让他们在将来的工作中少犯错误。
英国计算机科学家托尼·霍尔(Tony Hoare)有句名言很好的概括了软件测试的价值:
“软件测试的真正价值并不体现在代码中找出了多少缺陷,而是发现设计和编程人员解决问题方法上的局限、思路中的狭隘和技能方面的不足[1]。”
要做到这一点,有2个方面最重要,①是软件测试人员的素质,如果测试人员还没有达到能够为软件开发过程或软件设计过程等方面提出建议的水平,那么就需要加强学习和接受更深入的培训,这就需要加大投入力度。②是软件测试人员的地位,软件测试人员如果只是作为项目开发团队中的一员,缺乏话语权,那么当测试人员对软件设计或编程上的不足提出建议时,就不一定能够被有效采纳,甚至在测试人员发现了重大问题时,无力阻止错误的继续发生。适当提高软件测试人员的地位,对于体现软件测试正真价值,可以起到较好的推动作用。
(3)“误区3”:汝不应崇拜无法重现的失效
这是由著名的软件测试大师詹姆斯·惠特克(James Whittaker)提出的软件测试9大诫律中的第4条。意思是不要深陷于只见过一次的缺陷中。
在日常的软件测试中经常会出现这样的情况:遇到了一个缺陷,往往还是很严重的缺陷,但是无法重现,缺陷越严重,测试人员感觉越不好。而测试人员最常用的做法就是浪费数个小时或者数天的时间,甚至于更长的一段时间试图去重现这个只见过一次的缺陷[1]。也许由于没有适合的工具或者其它原因,为了重现这个缺陷的努力付诸流水,时间被白白浪费,测试人员却没有意识到这点。如果把这个时间用在其它更好的、更需要的地方,是否会有更好的测试效果呢?
从这个诫律可以看出,在进行软件测试时要尽最大的努力注意并记住(或者记录下来)对软件采取的动作次序,同时记住应用程序的响应;并且考虑使用带有追踪功能、软件状态等功能的调试器或者测试工具,这样可以尽量减少重现缺陷时的猜测成分,避免测试人员的深陷[4]。
(4)“误区4”:测试人员无需懂开发
持这个观点的人认为,软件测试人员一般都使用工具进行测试,只要懂得一些测试工具需要的脚本语言以及一些环境搭建的知识就足够了;又或者,软件测试人员并不专注于白盒测试,只是进行产品功能测试,更注重用户使用或用户反馈,无需知道太多的开发知识。个人认为造成这个误区的原因,是没有理解软件测试的真正价值所在。软件测试最终是要为软件开发服务的,是要持续影响并提高软件设计水平以及软件开发水平的。试问:不懂开发的测试人员如何提出软件开发过程的改进措施和建议呢?
我知道有种说法:“程序写得最好的不是工作多年的开发人员,而是有着多年测试经验的测试人员[3]。”由此可见,一个优秀的软件测试人员,是要涉及多方面的知识领域。例如在詹姆斯·惠特克的9大软件测试诫律中的第9条:“汝应贪图开发人员的源代码”。测试人员通过对源代码的阅读,特别是那些从用户界面或者用户使用功能上很难见到或者得到的错误处理代码,花时间了解代码中有哪些错误处理,哪些输入能够触发这些错误处理,这样一点一点地收集类似的线索,来帮助测试人员明确要执行哪些测试。
詹姆斯·惠特克曾说过这样一段话,能够充分说明测试人员是需要懂得开发的:
“一名优秀的测试人员,会仔细的分析找出的缺陷,并能够巧妙的向开发人员或小组进行汇报和有效交流,使他们能够意识到自己知识技能中的不足,从而进行相应的弥补和提高。随着开发人员素质的提高,最终同时达到软件缺陷数量下降和生产效率提高的目的,这远远超过了只注重发现并清除软件缺陷的简单方式[1]。”
(5)“误区5”:有了自动化测试工具,就不需要手工测试了
自动化测试工具一般有2种:①无需软件运行即可对其进行分析的工具,诸如代码审查或静态分析等。这些工具只能对软件固有的一些规范性缺陷进行检测,而许多软件缺陷是要等到在实际应用环境中才会暴露出来;②需要软件运行的动态测试工具。这些工具可以检测出许多软件实际运行时可能出现的缺陷,但是它却具有无法联系上下文场景的问题(运行环境、所处状态等)。更重要的是它的阿基利斯脚踵就在于它没有办法覆盖应用程序出错的大多数情形[1]。除非发生自身崩溃、异常输出或者是断言被激活,自动化测试工具不会注意到应用程序出错的。
要找到这样的缺陷,避免它跑到客户的桌面上,唯一的方法就是创造出与客户所处环境一模一样的运行环境,在那里运行软件来重现软件出错时的数据和状态。很多产品都经过了自动化测试工具的测试,可是,在这样的情况下,手工测试仍然能够定期地找出软件缺陷,更糟糕的是用户们(根据定义,他们执行的也是手工测试)也找得出软件缺陷。由此可见手工测试存在着令人不可忽略的力量,甚至于手工测试优于自动化测试。
有一个Intel的测试经理曾经评论过手工测试与自动化测试:
“让整个小组完全专注于自动化测试,并夸耀我们的1500个自动化测试用例后,我们的应用程序在手指头接触键盘的一瞬间就崩溃了。如果你想找出客户可能看到的那些软件缺陷,手工测试起着决定性作用[1]。”
(6)“误区6”:测试用例是万能的
测试人员可以写一个程序,设计足够多足够好的测试用例,可以进行无限次的测试,并且在睡觉的时候依然能够帮你找到软件缺陷,测试可以一遍又一遍不知疲倦地运行。很好,很强大!然而令人费解的是,在软件测试技术以及自动化测试工具长足发展的今天,依然有一些弱不禁风的软件被生产出来,而且这些软件在接触到真正的用户后随时报错。为什么?这是因为有一个致命的弱点是所有测试用例从来没办法解决的。在测试领域中,这个致命的弱点被美称为预言家问题:当运行一个给定的测试用例时,我们怎么知道软件是在按照预想的方式在执行?它是否产生了正确的输出?与此同时,它是否产生了不必要的副作用?我们又怎能确定这一点呢?是否能有一个预言家告诉我们给定用户环境、数据配置、输入序列后,软件会按照当初设计的模式准确的执行[1]。事实上由于没有完美的设计规范,对于目前的测试来说,这是根本不可能实现的。
如果不存在预言家,那么这些测试用例只能发现那些较为严重的故障:崩溃,挂起(至少看起来像是挂起)和异常。而且测试用例本身也是软件,这往往意味着那些错误可能是测试用例本身而不是目标软件产生的。测试用例与目标软件合为一体也构成一个软件,它仍然会留下漏洞让那些微妙复杂的错误逃过测试。所以,归根结底还是自动化测试与手工测试都不可或缺。
2 结语
自从 1979年第一本关于软件测试的书籍诞生以来,随着软件测试行业的飞速发展,软件测试艺术、软件测试技艺等已经不能准确的描述测试人员在软件测试中所做的工作了。目前许多知名的测试大师们已经开始将软件测试称之为一门学科——软件测试学。作为一门学科,其涉及的知识面将是广阔的,是值得测试人员花足够多的时间去掌握和精通的。同时,在这个过程中也必将伴随着各种各样理解上的误区。这需要通过不断地学习,不断地接受训练,去深入的了解软件测试,消除软件测试的理解误区,去努力寻找适合自己的软件测试方法,提高软件测试水平,从而达到改善或改进整个软件开发过程的最终目的。
[1]WHITTAKER J A. 探索式软件测试[M]. 方敏,张胜,钟颂东等,译.清华大学出版社, 2010:230.
[2]于波,姜艳. 软件质量管理实践——软件缺陷预防、清除、管理实用方法[M].电子工业出版社,2008:431.
[3]Weinberg G M. 完美软件——对软件测试的各种幻想[M]. 宋锐,译.电子工业出版社,2009:345.
[4]曹向志,于涌,高楼. 软件测试项目实战——技术、流程与管理[M].电子工业出版社,2010:360.
[5]陈能技. 软件测试技术大全——测试基础、流行工具、项目实践[M].人民邮电出版社,2008:500.