结合缺陷预防的软件测试教学改革探索
2014-03-20张战成陆卫忠任建平付保川
张战成,陆卫忠,任建平,付保川
(苏州科技学院 电子与信息工程学院,江苏 苏州 215009)
随着软件规模和复杂性的增长,软件产品的质量逐步引起了客户和软件公司的重视,向用户交付高质量的软件产品已成为各方的共识。一套清晰严格受控的软件过程是高质量软件产品的基本保障,其中软件测试是软件质量保证中最重要的一个环节。企业对软件测试工程师的需求也与日俱增,为满足企业对人才的需求,高校的课程设置、教学内容也需要与时俱进[1]。
传统的软件测试的教学内容是软件工程课程的一个章节,在一门60课时的课程中一般占4~6个课时,这么短的课时仅够介绍软件测试的概貌,其教学内容的深度和广度距离企业期待的既掌握扎实的软件测试基本理论和测试方法,又具有一定的软件测试经验的测试人才的需求还有较大的差距[2]。为加强软件测试人才的培养,各个高校开设了软件测试课程,甚至单独的软件测试培养方向。
通过软件缺陷的统计发现,不同的项目,不同的开发人员重复着同样的Bug,甚至同一个人也重复相同的Bug,每一位新手都在重复前人走过的弯路,重复同样的错误[3]。将这些共性的错误总结出来,提前学习和预防是软件质量保证中重要的一个环节,与测试、缺陷定位修改、回归测试的过程相比,其人力成本消耗低很多,是一种高效的软件质量保证措施。国外已有相关的教材[4-6]对这类缺陷进行了很好的总结,并被列入业界的经典推荐书目。而国内现有的计算机程序设计的教学中仅仅注重编程语言自身的功能和特性,对于编程语言中存在的一些“陷阱”较少涉及。笔者从软件质量保证的角度,尝试在软件测试课程的教学活动中,引入缺陷预防的内容,探索提高学生软件综合技能的教学新方法,以期为高素质的软件人才培养起到促进作用。
1 软件测试课程的教学现状
软件测试课程和软件工程、软件能力成熟度模型、设计模式、程序设计等课程有紧密的联系。在传统的V字型模型中,软件测试过程伴随着软件的整个生命周期,在不同的阶段有不同的侧重点,例如:详细设计和编码阶段引入的错误可以通过单元测试来发现,软件进入维护期后,比较关注回归测试和自动化测试。现有的软件测试教材基本按照黑盒测试、白盒测试技术,V字形模型的各个测试阶段来组织,这种教学方式使得学生“只见树木,不见森林”。实际上在学习软件测试计划的制订和管理的时候用的是软件工程中项目管理的相关知识,针对不同的软件规模,一些测试过程是可以裁减和合并的,这需要学生了解软件能力成熟度模型的相关知识;每个阶段需重点关注那一类缺陷实际上又需要有设计模式和程序设计的相关基础知识。所以软件测试一般安排在大学三年级开设,以保证学生能够将先前的知识融会贯通,学好软件测试。
学生认识上的误区。传统的认识将测试看成是“低等”的工作,没有技术含量,认为毕业后从事软件测试是没有出息的工作,多数学生认为只有软件开发才是计算机专业的主要工作。纠正学生的这些错误认识,一方面通过业界的一些行业调查数据来举例说明软件测试的重要性,另一方面,采取“以其人之道,还治其人之身”的策略,通过在测试的每个阶段列举一些软件开发中容易犯的错误,并通过设计测试用例来发现这些缺陷,通过这些实例使得学生对软件测试的重要性“心服口服”,增加自主学习的动力。
现有的测试案例缺少对缺陷预防的关注。软件测试教材中经典的三角形测试、NextDate测试、保险金计算程序测试等经典案例主要训练学生掌握边界法、等价划分法、决策表法等黑盒测试用例的设计方法。对于如何预防缺陷,虽然有些教材在测试概述章节提到了静态测试和代码评审,这部分内容如果单独的介绍确实比较枯燥,但是如果将其穿插在软件测试的具体案例中,则让学生即学习了测试技能又提高了编程技能。
2 缺陷预防在软件测试课程中的教学实践
缺陷预防就是将缺陷消灭在萌芽状态。按照净室软件工程的哲学:“通过在第一次正确地书写代码增量并在测试前验证它们的正确性来避免对成本很高的错误消除过程的依赖”。而软件测试属于后来弥补型,产生缺陷之后再来修改,但是缺陷发现越晚,修改缺陷花费也就越大,所以软件缺陷预防技术既是项目生命周期的早期消灭缺陷的一项重要措施,也是软件测试所追求的最高境界。
根据软件生命周期不同阶段的特点,每个阶段关注的预防内容也不同:需求阶段重点关注需求理解的偏差、需求的遗漏;设计阶段重点关注模块接口消息的传递,资源的申请和释放以及并发访问;编码阶段重点关注函数内部逻辑判断和编程语言自身的一些的陷阱。这些内容涉及软件工程、设计模式、程序设计等课程,在这些课程的教学过程中,通常仅仅讲授“正向”的内容,对于各阶段容易犯的错误和相应的预防措施甚少涉及,而这部分内容正是从书本知识上升实战技能必须掌握的知识。因为这个环节的缺失,软件企业会抱怨刚从校园迈入职场的新人开发的软件产品中缺陷率比较高,尤其是编码阶段引入的缺陷比较多,企业通常需要通过编程规范培训、技术评审和代码走读等措施才能减少他们所犯的错误,在一定程度上增加了企业的人力成本,同时也造成了新员工的挫折感,影响开发团队的士气。
高质量的软件开发和软件测试是软件质量保证的两个方面。尽早发现和预防缺陷,并对这些缺陷分类统计和分析,不仅可以提高软件质量,还可以为软件过程的持续改进提供可靠的参考。所以,在软件测试的教学活动中,除了介绍软件测试的基本原理外,在每个测试阶段介绍典型的缺陷,如编码阶段的缺陷有:数据引用错误、数据声明错误、运算错误、比较错误、控制流程错误、接口错误、输入/输出错误等。针对每类缺陷,写出一段含有这类缺陷的程序,结合具体的测试原理,设计对应的测试用例来发现这些缺陷。例如:数组越界和变量未初始化是新手编码是容易犯的错误,先给出如下一段子程序:
1:int getCount(int*p,int n)/*返回数组p中n个元素的累加值 */
2:{
3:int sum; /* 定义整型循环变量 */
4:for(int i=0;i<=n;i++) /* 循环条件 */
5:{
6: sum+=p[i]; /* 不断累加 */
7:}
8:return sum;
9:}
在这个短短的9行程序中,隐藏了两个Bug(第3行sum未初始化,第4行i=n时数组访问越界)。在课堂上,首先让学生阅读这段程序,启发学生通过静态分析代码来发现程序中的Bug,这相当于代码评审的过程,即静态测试的过程,这个过程也是软件质量保证一个重要的环节。然后老师和学生一起分析,如何设计测试用例才可以发现这些Bug,并进一步分析和总结设计测试用例的一般方法和理论。最后,老师和学生再一起反思,通过什么措施可以避免重复犯这类错误,从而引出编程规范、代码Lint检查等相关知识,本例中,第3行的Bug实际上违反了“禁止使用未经初始化的变量”的编程规范;第4行的Bug也可以通过PC-Lint工具检查发现。
软件代码评审是一种静态白盒测试方法,按照V字形模型,这个质量保证活动发生在代码编写完成之后,单元测试之前,是一种高效的缺陷预防方法。在教学过程中,也穿插的介绍代码评审的组织流程和规范,逐步让学生认识到软件开发是有组织、有规范的团队活动,而不仅仅是个人活动。
通过这种教学方式,学生认识到了软件测试“从哪里来,到哪里去”。“从哪里来”首先回答了为什么要进行软件测试,也明白了软件缺陷的来源:编程技能、个人疏忽、交流不畅、配置管理等。“到那里去”回答了软件测试的目的,即提高软件的质量。软件工程课程中的各种软件过程和管理措施,设计模式中的各种架构模式都是围绕这一目标进行的,这样将软件测试课程放在整个软件生命周期中结合其他课程的内容学习,使得学生对高质量软件开发有了全面的认识,将学生学习到的零散的课程知识转化为高质量软件开发的技能。
通过典型缺陷的学习,学生对测试的重要性有了直观和深刻的认识,从而愿意积极主动地学习软件测试的相关理论和方法。同时,学生的编程规范水平、编程技能也得到了提高,并且在以后编写程序的时候,有了缺陷预防的意识,更能满足实际生产环境软件质量的要求。
在学习过程中,学生不仅学习了测试用例设计的相关内容,还学习了代码评审、测试用例评审的、缺陷总结的规范,使学生认识到软件开发不仅是个人活动,更是一项团队活动。通过这些活动也训练了学生团队协作的能力,有利于学生在实习阶段更好地融入职场。
3 结束语
软件测试是一门综合性很强的课程,软件测试的最终目的是提高软件质量。在教学过程中,结合典型缺陷案例分析,按照代码评审、测试用例设计和缺陷分析和预防的流程剖析各个案例,使学生加深了对软件测试的理论和方法的理解,并进一步将软件工程、设计模式和程序设计等课程的相关内容融会贯通,为今后从事高质量的实际项目开发奠定坚实的基础。
[1] 李静,赵志升.软件测试专业课程体系建设和教学改革[J].教育与职业,2014(2):135-137.
[2] 周元哲.“软件测试”教学改革的探索和实践[J].计算机教育,2008(22):14-15.
[3] 刘新浙,刘玲,王超,等.从缺陷中学习C/C++[M].北京:人民邮电出版社,2013:1-2.
[4] Andrew Koenig.C Traps and Pitfalls[M].Addison-Wesley Professional.1989.
[5] Andrew Koenig.Ruminations on C++:A Decade of Programming Insight and Experience[M].Addison-Wesley Professional,1996.
[6] Bruce Eckel.Thinking in Java (4th Edition)[M].Prentice Hall,2006.