1. 引言
软件测试是保障软件质量最直接最有效的手段,软件测试技术是软件开发人员和测试人员都应掌握的技术 [1]。近十五年来,我国IT产业对专业软件测试人才的需求不断增长,各高校相继开设了软件测试课程 [2]。软件测试是一门实践性很强的技术,要求测试者设计测试用例的输入和预期输出,运行被测程序获得实际输出,并通过比较预期输出和实际输出、比较需求规格与代码实现来找出程序的缺陷,进而分析如何定位和修复这些缺陷。然而大多数学生因缺乏工程经验,很难理解软件测试的策略、过程和步骤,从而觉得软件测试知识枯燥难懂、难以提起对软件测试技术的学习兴趣 [3]。因此在软件测试教学中很有必要配合理论知识对学生进行实践训练。在传统的软件测试实践练习中,教师不仅需要设计被测程序和程序缺陷,而且需要人工地评估每个学生的测试结果,因此教师的教学负担重、效率低。特别是在学生人数众多的情况下(比如暨南大学每年的软件测试课有100名左右的学生选课),教师无法为每个学生都提供个性化的、实时的实训练习辅导,这会使得教学效果大打折扣。
当学习任务是困难且枯燥的时候,将学习任务游戏化是一种有效的教育方法。游戏化学习是游戏与学习相融合的产物,为学生提供寓教于乐的学习环境,通过游戏激发学生探究知识的热情 [4]。为缓解软件测试实训教学中的前述问题,我们开发了一个游戏化的软件测试实训系统。此系统的主要特点包括:1) 将软件测试实训环境虚拟化和游戏化,学生的软件测试学习任务体现为具有情境的游戏任务,整个学习过程表现为游戏闯关的形式,在学习过程中加入娱乐性和竞争性的游戏元素。2) 使系统承担教师的实训教学工作,包括自动化地完成批改题目、反馈做题结果和提供个性化指导信息等工作,并将工作结果表现为游戏反馈的形式。接下来,本文将分别详述此系统的设计、实现与应用成效。
2. 系统设计与实现
2.1. 系统技术架构的设计
本文的软件测试实训系统采用开源的Web应用程序框架SSH (Struts [5] + Spring [6] + Hibernate [7])开发,系统架构自上而下分为表现层、业务层和数据层,如图1所示。在表现层,系统在服务器端使用Struts架构负责模型、视图和控制器的分离,实现页面的渲染和跳转;在浏览器端则使用AjaxDWR框架 [8] 实现浏览器与服务器的异步交互。在数据持久层,系统采用关系型数据库MySQL,并通过Hibernate对象关系映射框架进行所有的数据层访问操作。在业务逻辑层,系统使用Spring框架将业务逻辑封装成供上层调用的服务。
系统的业务逻辑主要实现了以下六个服务:1) 用户服务:为每个用户(包括教师和学生两类角色)提供注册、登录和个人信息管理的功能。2) 课堂服务:为教师用户提供开设课堂和管理选课学生的功能,为学生用户提供选择课堂的功能。3) 课题服务:为教师用户提供加入课题(即被测程序)和查看学生成绩等功能。4) 执行服务:对于学生给出的每个测试用例,执行被测程序的功能;对于学生给出的程序改错选项,生成并执行修改后的被测程序副本。5) 分析服务:对于被执行的测试用例,判断该测试用例的设计是否正确,进而判断正确设计的测试用例能否暴露程序缺陷,最后定位所发现的缺陷在被测程序中的位置并提供缺陷修复选项;记录每个学生在每个课题中的表现并生成最终成绩;为每个课堂生成平均成绩和成绩排名。6) 报告服务:生成每个学生的成绩报告,并传递给上层渲染页面展示。
2.2. 实训内容与游戏机制融合的设计
系统在实训操作之前,设计了一个故事引入环节,以动画形式引导学生回顾软件测试的基本知识。接下来,系统的实训包括四方面的内容,分别被设计成四个游戏关卡,即基础知识关卡、黑盒测试实战关卡、白盒测试实战关卡和缺陷修复实战关卡。这四个游戏关卡的闯关难度依次提升,对应具有先后承接关系的四个练习环节。在基础知识闯关环节:系统随机地给出十道选择题,以考察学生的软件测试基础知识;在学生解答后,系统进行自动评分,学生只有在获得60分以上(总分100分)时,才能成功闯过此关。接下来的三个实战闯关对应的是同一个有缺陷的被测Java程序:系统的教师用户开设实训课堂,设置被测程序作为实训课题;而学生用户在接下来的闯关实战中对此被测程序进行黑盒测试、白盒测试和缺陷修复。
在游戏化学习过程中,学习性指导能激发学习的积极性 [9]。系统根据学习者的输入做出实时反馈,可帮助学生在游戏活动中获得成功,从而使学习变得更容易和更有效率;也可以使学习者在虚拟环境中获得较高的沉浸感,促进思考从而深化学习 [10] [11]。因此本系统在各个游戏闯关环节都提供实时的学习性指导和反馈。在基础知识闯关环节,对用户选择的答案给出实时的正误判断。1) 在黑盒测试闯关环节:要求学生根据被测程序的需求规格说明、设计并输入黑盒测试用例。如图2(b)所示,系统反馈这些测试用例的执行情况,包括实际输出和测试结果,其中测试结果包括以下三种情况:PASS,表明测试用例通过,未能发现程序缺陷;FAIL,表明测试用例未通过,发现了程序缺陷;ERROR,表示测试用例本身的设计有误;此外,系统还使用饼状图指导学生分析其测试用例的分布情况。2) 在白盒测试闯关环节。要求学生根据被测程序的源码、设计并输入白盒测试用例。如图2(c)所示,系统不仅反馈这些测试用例的实际输出和测试结果,而且通过以下两种反馈形式、帮助学生分析其测试用例的代码覆盖情况:高亮所覆盖的源码行;显示语句覆盖和分支覆盖等逻辑覆盖率。3) 在缺陷修复闯关环节:要求学生尝试修复在在前两个环节中所发现的程序缺陷。系统显示包含这些缺陷的代码行,并给出修复缺陷选项;在学生修复缺陷后,系统在后台立即执行回归测试并反馈新的测试结果。4) 在学生闯关结束后,系统将实时反馈学生在游戏中的综合表现和成绩,如图2(d)所示。
在游戏化学习过程中,对学生表现的娱乐性反馈能引发深度学习 [12]。因此为了提高学生的学习动机和学习效果,本系统不仅提供学习性指导,而且提供娱乐性反馈。在基础知识关卡结束时,系统反馈带有打油诗和虚拟形象的页面,作为第一关顺利通过后的娱乐奖励,如图2(a)所示;而打油诗的内容也进一步激发学生继续“闯关杀Bugs”的兴趣。在黑盒和白盒测试的闯关环节,每当学生提交的测试用例发现了一个新的缺陷,在学生页面“你的战绩(Bugs)”瓶中就会增加一个新的彩色圆点以表示“捉到了一个新Bug”,如图2(b)和图2(c)的右上方区域所示。在游戏化学习过程中,通过引入游戏竞争,可使学生更加活跃,学习更有效和更有趣 [13]。因此,本系统在学生页面中还显示“班级平均战绩(Bugs)”瓶,激发学生的竞争意识,使得学习更有效果;而实时变化的卡通战绩瓶,也使得学习更有趣。
Figure 2. Illustration of student webpages
图2. 学生页面示例
2.3. 游戏交互的实现
本系统在学生提交测试用例或修复选项之后,需要对学生页面进行实时的局部刷新。系统采用B/S模式,所用的框架和类库如图1所示:1) 通过远程服务器端Ajax DWR (Direct Web Remoting) [8] 框架实现页面的局部刷新、改善页面与Java类的异步交互;2) 使用jQuery [14] 框架实现页面的动态效果。3) 使用基于jQuery的JavaScript类库Highcharts [15],显示多种数据的统计图。系统实现交互式游戏页面的业务逻辑,关键在于实现图1中的执行服务和分析服务。接下来,本文将叙述这两个关键服务的详细实现:
1) 执行服务的实现:为了在执行被测程序时获得语句覆盖等信息,执行服务需要对被测程序的.class文件进行插装,插装时所用的工具为Cobertura [16]。“执行测试的子服务”从浏览器页面抽取学生输入的测试用例数据,在Java虚拟机上执行插装后的被测程序;“执行修复的子服务”从浏览器页面获得学生所选的修复选项,在后台生成修复后的程序副本并进行插装。此后,“执行测试的子服务”就可执行修复后的被测程序。
2) 分析服务的实现:对于每一个带有缺陷的被测程序BUG-V,系统在后台都保存了该程序的一个正确版本COR-V,以及BUG-V程序中每个缺陷的信息,包括缺陷的编号,缺陷在程序中的位置和缺陷对应的修复方案。对于学生输入的一个测试用例(包括“输入”和“预期输出”两部分),系统使用其“输入”运行COR-V从而获得“正确输出”;运行BUG-V从而获得“实际输出”。系统通过比较“预期输出”和“正确输出”,判断测试用例的设计是否为Error;通过比较“预期输出”和“实际输出”,判断测试用例是Pass或Fail。当测试用例发现了一个缺陷时,系统执行BUG-V中的缺陷语句以输出缺陷编号,并根据缺陷编号所对应的修复方案、判断学生所选的修复选项是否正确。
3. 游戏评分的标准
游戏化学习将教育性和娱乐性相结合,其中教育性是核心。本系统以闯关形式展开游戏,学生在每个关卡需要获得超过阈值的得分才能通关。学生在每个关卡所获的得分会被累加,从而得到最终的游戏得分,即学生的实训分数。如表1所示,本系统从四个方面考察学生的软件测试水平,即理解能力、缺陷查找能力、缺陷修复能力和熟练程度。对每一方面,系统采用量化的评价指标(如表1第2列所示),其量化计算方法如表1第3列所示。
4. 系统的应用成效
我们在2014~2019年将本系统应用于暨南大学“软件测试与质量保证”课程的教学中。6年来,共有673名学生在课程学习中使用了本系统,深受学生好评。我们共搜集了650份调查问卷,97%的学生认为本系统非常有助于理解和运用软件测试技术,94%的学生认为系统的游戏风格能提升学习兴趣。6年来,本系统取得了良好的教学成效,学生在软件测试的课程成绩、创新创业项目和软件工程综合素质等方面都取得了显著的提升。此外,使用本系统的本科生申请了3项软件测试相关的国家发明专利,发表了3篇软件测试相关的SCI或EI学术论文。本系统有效提升了暨南大学计算机相关专业学生的软件测试水平,6年来我们向华为和腾讯等软件公司输送了大量优秀的软件测试技术人才。
我们还将此系统应用于我校学生参加“全国大学生软件测试比赛”的赛前培训中,帮助学生熟练掌握软件测试的基本技能。此系统已成为我校参赛学生必备的练习工具。自从“全国大学生软件测试比赛”举办4年以来,使用本系统的暨南大学学生共获得40个国家级奖项,92个省级奖项,比赛成绩多年居广东省高校首位。
5. 总结
综上所述,我们开发了一个游戏化的软件测试实训系统,可帮助学生增强软件测试的实践能力,加深对软件测试知识的理解,提升对软件测试技术的兴趣。本文提出了一种将游戏机制融入软件测试实训的方法,介绍了实训系统的技术架构,详述了与游戏机制相关的系统设计与实现。本系统已连续6年应用于暨南大学的软件测试教学中,取得了显著的教学成效。今后我们将扩展本系统的实训题库,完善系统界面,并在兄弟院校中推广应用。
基金项目
本研究得到暨南大学第二十一批教改研究项目资助。