APP下载

基于游戏模式的软件测试技术课程实践教学设计

2020-07-04孙军梅戴雅婕姚茂群肖蕾

中国信息技术教育 2020年12期

孙军梅 戴雅婕 姚茂群 肖蕾

摘要:为了使软件测试技术学习者更好地掌握软件测试技术的概念、方法和原理,并提高学习者的兴趣,作者设计了基于游戏模式的实践教学环境,设计开发了一个基于角色扮演类游戏的软件测试技术实验系统。学习者通过分别扮演不同的角色进行实验,寓教于乐并体验如何进行软件测试,以及如何编写可靠性高的软件代码来提高软件质量。

关键词:软件测试技术实验;游戏模式;变异体

中图分类号:G434  文献标识码:A  论文编号:1674-2117(2020)12-0000-05

软件测试是软件开发活动中不可或缺的一部分,但调查显示,计算机或软件工程类专业课程中更多重视程序的设计和实现。[1]

文献[2]指出,测试在软件开发人员的日常活动中扮演的角色远不如人们希望的那样,而且新闻频繁地报道关于软件漏洞造成的影响,使人们对软件测试在实践中產生的效果产生了怀疑。与编程和设计相比,测试通常被认为是无聊和困难的。[3]教学中主要体现在教学内容抽象与学生学习兴趣不高。

文献[4]对软件测试教育对软件代码可靠性的影响进行了实证研究,研究发现软件测试知识能提高编写的代码的可靠性。国内软件行业也普遍存在“重开发,轻测试”的观点,这种观点延伸到软件测试技术课程的教学中,导致部分学生对软件测试这个职业存在认识偏差。因此,软件测试课程必须改变原来偏重理论讲解、学生缺乏实践经验的教学模式,加强实践教学环节,让学生在实践中体会到软件测试技术的重要性。[5]因此该课程迫切需要一个既能够体现软件测试技术相关知识,增强学生实践操作能力,又能够吸引学生兴趣的实验环境。

基于游戏模式的软件测试技术实验系统将软件测试技术的知识点融入到游戏关卡中,为学习者提供了一个充满挑战和乐趣的实验环境,让学习者在快乐中学习相关概念并在通关的实践中提升实践动手能力。本系统在设计时借鉴了变异测试的理念,变异测试是一种基于缺陷的在细节方面对程序源代码进行改进的动态的软件测试方法。[6]变异测试首创于20世纪70年代,发展至今,在学术界已得到了广泛的关注和研究,但在工业应用上仍比较少。在大学的软件测试技术教材中也提得比较少,一般不作为基本的教学内容。但通过对变异测试的研究,笔者发现变异测试的思想虽然在实际应用中还不完全成熟,但通过变异测试的练习,可以加深学习者对软件测试基本概念、方法和原理的理解,[7-9]基于此,笔者设计开发了本实验系统。该系统是基于一个角色扮演类游戏而设计的,学习者可以分别扮演不同的角色来创建变异体和测试用例,体会如何编写可靠性高的软件,学习进行软件测试的基本方法和原理。

● 实验内容

1.白盒测试/黑盒测试方法

白盒测试方法和黑盒测试方法[10-11]是软件测试中用得最多得两种测试技术,也是目前工业界仍旧在普遍使用的两种方法。白盒测试是基于程序源代码对程序内部的逻辑结构以及相关信息进行测试的方法,测试者需先了解程序的内部结构,根据被测程序的内部结构设计测试用例,检验程序中的每条通路是否能按照预定的要求正确工作。白盒测试最常用的方法有语句覆盖、分支覆盖、条件覆盖等。黑盒测试是基于程序功能的测试方法,目的是检查软件的各项功能是否实现或软件中是否存在功能上的错误。黑盒测试最常见的方法有等价类划分法、边界值分析法等。

①语句覆盖:为了发现或确认程序中的错误,程序代码必须被执行。直观地说,如果包含bug的语句从未被任何测试执行过,那么就无法检测到bug。语句覆盖率是衡量测试质量的最通用的标准。图1是一个演示语句覆盖的游戏程序:图1(a)为被测试的程序,图1(b)是测试程序。此测试程序中设计的测试用例仅涵盖了if条件语句的true分支,而未涵盖第二个return语句,因此此测试程序没有达到语句覆盖的要求。

②分支覆盖:分支覆盖要求程序控制流图中的所有边至少执行一次,这意味着每个if条件语句都需要取一次真值和假值。图2给出了一个分支覆盖示例游戏程序。图2(a)是被测程序,图2(b)是测试程序,初始测试集涵盖了所有语句,即满足语句覆盖的要求,但没有达到分支覆盖的要求。

③循环测试:系统已经定义了各种覆盖标准来处理循环引起的挑战。例如,不同的循环迭代次数可能导致发现不同的错误。图3显示了一个循环测试示例游戏程序,其中现有的测试套件涵盖了循环未执行和仅执行一次的情况,但不包括循环多次执行的情况。

④边界值测试。图4显示了边界值测试的示例,其中现有测试集实现了分支覆盖,但是没有在x>100的边界上进行测试。

2.测试用例概念

在进行软件测试时,设计测试用例是一个非常重要的环节,测试用例设计的好坏直接影响到是否能发现缺陷,测试用例设计得好就能发现缺陷,并可能会发现比较多的缺陷,设计得不好,也许就发现不了缺陷或者只能发现一些比较容易发现的缺陷。所以,编写测试用例是软件测试中必不可少的环节。本实验系统学习者通过扮演防御者角色来设计测试用例,掌握一些设计测试用例的技巧,并积累设计好的测试用例的经验。

● 实验系统的设计与实现

1.实验系统框架结构

本系统结构由游戏模式和学习模式两个模块组成如图5所示。学习模式主要提供给对相关知识还不是很熟悉的学习者在进入游戏模式之前进行学习、练习的模块。游戏模式主要提供给学习者实操使用。

2.游戏模式设计

游戏包括攻击者模式和防御者模式两种游戏模式,学习者可以通过攻击者模式来对源程序进行修改,通过防御者模式来创建测试用例检测出修改的部分。通过两种模式的操作,学习者可以对软件测试的相关概念、方法和原理进行实操训练。

(1)攻击者模式

在攻击者模式中,学习者最主要的目标就是改变源程序,使改变的部分尽可能难被测试用例检测出来,如下页图6所示,学习者可在此模块看到详细源代码,并且可对源代码进行合法的微小的修改。学习者在修改程序时须遵守以下规则:①不能修改源程序的类名、函数名、变量名以及数据类型;②修改后的程序必须可运行,即没有语法上的缺陷;③不能向程序中添加新的if语句或循环语句;④修改的部分必须有输出值;⑤每次修改程序只能引入一个故障(fault)。

以图1所示的语句覆盖示例为例。当学习者作为攻击者时,系统将向学习者玩家展示源程序和测试集,学习者的任务是修改源程序创建测试集不能检测到的变异体,下页图7所示的游戏程序为攻击者创建的一个变异体。

(2)防御者模式

在防御者模式中,学习者最主要的目标就是创建测试用例,找出攻击者模式中玩家创建的变异体。如下页图8所示,学习者可根据修改后的源代码在界面上输入测试用例。测试数据需要满足以下条件:①输入的测试数据必须对源程序和修改后的源程序引起不同的程序状态;②修改的输出值的语句必须被执行且该输出值能够被测试数据检测出来。

判断学习者是否杀死当前变异体的最主要的方式是,学习者创建测试用例后,在源代码和修改代码中运行该测试用例,然后判断两者的输出值是否相同。如果源代码和修改代码的输出值不同,则说明学习者创建的测试用例成功检测出了修改部分,即杀死了当前变异体,反之则说明没有检测出程序的修改。还是以图1的语句覆盖为例,如果防御者输入的测试用例为x=10,则运行源代码和修改代码后的输出结果是一样的,说明防御者设计的测试用例没有发现缺陷,据此判定攻击者胜,攻击者得分。如果输入测试用例为x=3,则运行源代码和修改后代码的输出结果是不一致的,据此可以判定防御者在这一局中胜,防御者得分。

● 教学评估

1.课程管理

教师可以使用这个基于游戏模式的实验系统来进行软件测试技术课程的实验教学,并通过这个系统对课程进行管理。系统在实际使用时教师可以以管理员的角色来对源代码进行管理。教师可以根据教学进度更换或者新增符合当前教学知识点的比较典型的游戏代码,让学习者根据当前所学的内容,针对新的源代码进行代码修改;同时,学习者也可以针对新修改的程序来设计测试用例。

教师可以查看每位学习者的参与度,也可以根据每个学习者修改的程序数量、检测出来的变异体数量等信息来判断学习者对知识的掌握程度。

2.教学效果

使用基于游戏的软件进行实践学习,寓教于乐,还可以增强学习过程中的竞争性,增强学习者学习的积极性,同时也增强学习者实践教学的参与度。软件记录了每位学习者修改的源程序数量、检查出多少修改代码的数量以及在练习模式中答对的习题数量,学习者和教师均可以通过这些数据分析学习成果,学习者可以通过在游戏中扮演不同的角色,在游戏通关中掌握知识,也能够了解自己在哪些方面存在不足,需要改进。教师可以根据学习者的实践教学参与度来调整课堂教学内容、教学方法以及教学难度,适当增加源代码以及習题的难度,可以提升学习者学习的积极性、竞争性。

本系统不仅可以作为实验用工具,还可以作为评价工具。例如,将课程考试由笔试的形式改为在游戏软件中进行,在规定的时间内创建一定数量的有效新代码,创建测试用例检查新代码。

● 结语

在本文中,我们提出了基于游戏的软件测试技术实验教学模式,使学生在游戏中掌握软件测试技术的相关概念、方法和原理。学生在创建新程序以及创建测试用例的同时,不仅可以掌握软件测试的相关知识,还能对如何编写高质量软件有一定的理解。同时,由于实验是在游戏中进行的,这样就为枯燥的软件测试课程增加了乐趣,更加吸引学生。接下来我们所面对的挑战就是评估此款游戏软件对使用者产生的影响,评估游戏软件在学习者使用的过程中是否有不合理或需要优化的地方。

参考文献:

[1]Astigarraga, T., Dow, E.M., Lara, C., Prewitt, R., Ward, M.R., 2010. The emerging role of software testing in curricula. In: Proceedings of the IEEE Transforming Engineering Education: Creating Interdisciplinary Skills for Complex Global Environments. IEEE, pp. 1–26.

[2]M. Beller, G. Gousios, A. Panichella, and A. Zaidman. When, how, and why developers (do not) test in their IDEs. In ACM Symposium on the Foundations of Software Engineering (FSE), pages 179–190, 2015.

[3]Clegg B S , Rojas J M , Fraser G . Teaching Software Testing Concepts Using a Mutation Testing Game[C]// 2017 IEEE/ACM 39th International Conference on Software Engineering: Software Engineering Education and Training Track (ICSE-SEET). ACM, 2017.

[4]Lazzarini Lemos, Otávio Augusto, Fagundes Silveira, Fábio, Cutigi Ferrari F , et al. The impact of Software Testing education on code reliability: An empirical assessment[J].Journal of Systems and Software, 2017:S0164121217300419.

[5]董玉坤.“软件测试”课程教学现状分析[J].课程教育研究,2015(25):229-229.

[6]Jia Y, Harman M.An Analysis and Survey of the Development of Mutation Testing[J].IEEE Transactions on Software Engineering, 2011, 37(05):649-678.

[7]使用muJava进行变异测试[EB/OL].https://blog.csdn.net/wkw1125/article/details/51967630.

[8]茆亮亮.变异测试技术应用研究[D].合肥:中国科学技术大学,2010.

[9]陈翔,顾庆.变异测试:原理、优化和应用[J].计算机科学与探索, 2012(12).

[10]Bill Hetzel.The Complete guide to Software Testing.1993:1057-1075.

[11]Corey Sandler, Glenford Myers, Tom Badgett, The Art of Software Testing, 3rd Edition,Wiley,2011.

通讯作者:孙军梅(1974—),女,山西大同人,博士,副教授,硕士生导师,研究方向为软件测试技术、机器学习、教育技术

基金项目:杭州师范大学教改项目,杭州师范大学研究生核心课程建设项目(Yjskc19),福建省软件评测工程技术研究中心开放课题。