APP下载

软件测试课程实验教学体系设计与实践

2019-08-15

实验室研究与探索 2019年7期
关键词:单元测试测试人员测试用例

辜 萍 萍

(厦门大学 嘉庚学院 信息科学与技术学院,福建 漳州 363105)

0 引 言

我国的软件测试行业是伴随着软件工程领域的研究而逐步发展起来的。随着产业的蓬勃发展以及对软件质量的重视,带动了软件测试行业的快速发展,已逐步与国际先进水平拉近差距,软件测试在国内正在逐步成为一个新兴的产业[1]。最新的行业调查报告显示,目前在经济转型的过程中互联网行业和金融行业正迅猛壮大,企业用人需求连年上升,软件测试人才缺口巨大,因此,各所高等院校纷纷在软件工程专业开设软件测试课程,以求培养一批掌握测试技术以适应职业特定需要的年轻人。然而,大部分学生并未意识到测试的作用与重要性,在平时的学习中是将更多的精力投入编程的学习而忽视测试,导致降低了软件测试课程的学习质量。因此,为了实现软件测试人才的培养目标,必须扭转当前的不合理现象,对课程内容及授课形式加以改进,以求引起学生对该课程的重视,进而增强对软件测试领域相关工作的兴趣,最后能够具备专业技术能力以填补市场空缺。

1 软件测试课程特点

(1)貌似简单实则复杂。软件测试是软件工程领域的一个分支。一般情况下,高校在设置本科培养方案时会让低年级学生先行修读软件工程,在后期才会深入学习软件质量与测试。在软件工程课程中会讲解软件测试的基本概念,如回归测试、自动化测试、黑盒测试、白盒测试,也会涉及手工测试的基础方法。这些概念虽然繁多,但是理解起来并不难,因此学生就片面地认为软件测试简单易学,相比于编程的学习轻松得多也不具有挑战性,在升入高年级时自然对软件测试课程不重视。但是,只停留在对概念的理解而没有应用于实践是不可能真正掌握相关技术的,面对实际的项目测试任务,这些单纯的概念并不能转化为解决问题的能力。更何况,实际上软件测试的流程复杂、测试类型多样、自动化工具难学,都需要在后续的测试课程深入学习才能体会何为真正的软件测试。

(2)阶段性强,实验众多。软件测试的核心流程包括测试计划、测试用例设计、测试执行以及测试结果记录4个部分,从软件开发周期的角度又可以划分为单元测试、集成测试、系统测试、验收测试4个阶段。如图1所示的测试与开发的关系模型H-mode来看,软件测试应当贯穿于软件开发的整个过程,才能合理地安排开发资源并规避开发后期的风险[2]。因此,在课程中应该分阶段设计各种测试实验,学生可以体会软件测试的流程划分,可以理解理论教学中的各种概念、技术,可以实际使用各种测试技术和测试工具,这样就能极大地加强对理论知识的掌握和理解。所以,建设有效的实验教学体系,对于提高软件测试课程的教学效果很有必要。

图1 测试与开发关系模型H-model

(3)与其他课程关联紧密。软件开发包含需求、设计、编码、测试等诸多环节,软件测试既独立又与其他阶段性工作密切相关[3]。例如,测试计划的编写需要依赖需求说明书,测试用例的设计需要参照需求与设计说明书,编码阶段需要执行单元测试与集成测试,系统成型后需要开始系统测试。因此,除了软件工程之外,也同步开设软件需求、软件设计以及程序设计等课程,为软件测试课程打基础做准备,同时这些课程的学生作品应该被充分利用成为软件测试实验中的依据材料,如此将不同时期的课程串联成线以模拟软件项目开发的不同阶段,让学生更好地体会公司中项目运作的实际场景。

2 课程实验体系

2.1 实验分组

在安排学生参与实验时,尽量尊重学生个人意愿,坚持团队合作,引入角色扮演模式。近年的行业调查报告显示,目前国内的大多数公司在测试部门设置明确的分工,对于测试流程的不同阶段以及软件产品的不同测试类型都有专项负责小组,以此确保每个成员各施所长通力合作。所以,在教学实验中,也应该鼓励学生正确认识自我,根据自身兴趣特长参与测试相关工作。例如,热爱编程的同学负责单元测试工作,擅长文档读写的负责测试计划工作,喜欢研究工具的就负责自动化测试等。任务包干到人之后也能增强学生的主人翁意识与责任感。

另外,一般情况下如果由学生自行组队,可能出现各项强弱差距较大的局面。为了避免出现这种现象,在本实验体系中,将采用随机组合的形式,即分别从各专项负责小组中抽取相应人数进行组队。当队伍中的成员相互之间没有合作过,那么在实验初期彼此之间的磨合与沟通也将提高学生的适应能力。

2.2 实验内容设计

(1)关于实验项目的确定。为了将时间与精力都集中于测试的相关工作,应当鼓励学生选择之前的软件课程里已经基本完成的软件产品(包括软件需求设计文档和源代码)作为本实验体系中的测试对象及测试依据。从近几年的行业调查数据中发现,软件测试从业人员比较多从事的是Web项目的测试工作,因此,学生可以挑选自己作业成果中的J2EE项目、.Net项目或者PHP等项目。基于此,在相关的软件课程制定教学大纲时,就与任课教师进行沟通合作,确保实验资源的可用性,也可构建软件工程系列课程组,促进知识体系的连贯性。

(2)必须详细制定实验步骤。结合软件测试的核心流程及现有资源,在本实验体系中,将实验流程划分为4个阶段,如表1所示。

2.3 实验任务执行

如图2所示,目前从业人员最希望提升的技能是自动化和性能测试,软件测试行业经过10年的高速增长之后,高端测试人才急缺,市场产生了自动化和性能测试工程师提升培训需求[1]。多年的摸索实践表明,自动化测试不仅可以在软件持续集成和改进过程中的回归测试时节省重复手工操作工作量,也可以通过自动化工具的录制回放及数据驱动来执行测试以提高测试覆盖率,还可以利用一致性的测试脚本更好地重现软件缺陷来提高缺陷修复效率。因此,本实验体系中大量引入当前在企业中应用比较广泛的测试工具,力求做到自动化与手工的完美结合,锻炼学生分析设计的逻辑思维能力以及自动化测试的实践动手能力。

表1 实验流程安排表

图2 软件测试从业人员调查统计图

(1)单元测试与集成测试。单元测试与集成测试主要采用白盒测试的方法,主要分为静态测试与动态测试两种[4]。

在静态测试中,将对代码执行编程规则检查。该项测试向学生们展示了程序语法之外的规则问题,编程语法是学习语言的基础,在集成开发环境中也能够被自动检测,而编程规则是常常被忽略又不该忽略的部分,只有符合规范的代码才能称为质量级的,才能减少潜在的错误。然而,现行的大部分编译器并没有检查规则的功能,完全人工筛查工作量过大效率低下,所以,实验中引入自动化的规则检查工具,能够快速扫描代码并清晰地提示违反规则的地方以便修改[5]。不同的语言有相应的工具选择,例如,针对Java语言有开源软件PMD,针对C/C++有PC-Lint等。

在动态测试中,先学习如何依据软件设计文档仔细分析代码的逻辑结构,然后人工设计出白盒测试用例,在集成测试中学习及应用渐增式集成策略,再借助自动化测试框架JUnit4.0执行测试用例,并使用ElcEmma工具检查测试代码的覆盖率。JUnit4.0是XUnit系列成员,XUnit是一套基于测试驱动开发的测试框架,其包含用于Python单元测试的PythonUnit、C++单元测试的CppUnit以及C#单元测试的NUnit,应用十分广泛[6]。因此,学生通过JUnit4.0的训练可以很容易举一反三应用其他语言的XUnit框架。同时,JUnit4.0引入参数化机制,在执行测试驱动程序时可以很方便地对多组测试数据轮询调用并分别报告测试结果,既简化测试代码的编写工作又提高测试效率。ElcEmma能够结合JUnit框架对测试代码进行覆盖测试,能够在工作平台中启动直接对代码覆盖进行分析,覆盖结果将立即被汇总并在Java源代码编辑器中高亮显示,也可程序运行的结果生成详尽的覆盖测试报告,如图3所示。对于覆盖率检测结果不合格的,就需要让学生补充白盒测试用例继续测试,以此提高测试的深度[7]。

图3 JUnit+ElcEmma应用界面

(2)系统测试设计与测试执行。系统测试不同于单元测试与集成测试。该阶段中测试人员根据软件需求设计文档进行测试用例的设计与执行。测试人员将利用一系列经典的黑盒方法如等价分类法、场景法设计用例数据[8]。一般情况下,测试项的提取以及黑盒测试用例的编写都使用文档编辑器记录,但是这种方法不便于后续的使用及维护。测试用例的设计与执行最好集中管理,因此,实验中选用TestWriter作为自动化辅助工具。TestWriter是一款零编码,测功能、测回归、测兼容性的软件,对于自动化系统测试的初学者尤其适用。工具中对测试对象、测试步骤、用例等层层封装映射,清晰理清业务关系,易于更新与维护。测试人员根据软件需求文档中的软件特性描述设计出一批测试用例,然后填入TestWriter,如图4所示。当测试数据填写好之后就可以利用工具的调用回放功能自动运行测试。而且,TestWriter官方技术支持每天在TW论坛及时答疑解惑,并且经常举办直播等活动讲解如何使用此工具,借助此平台也可以培养学生的课堂之外的自学习惯。对于每个小组拥有各自的项目而言,TestWriter也正是以项目为单位进行数据管理的,在服务器端建立了每个项目之后再分配对应的成员权限,每个成员只能登录自身所属的项目进行任务操作,所以,虽然项目都存取在同一台数据库服务器,但是项目与项目之间相互独立互不干扰。

图4 TestWriter测试用例编辑界面

(3)性能测试。软件产品的质量取决于功能与性能两项十分重要的因素。本文中的TestWriter主要针对软件产品的功能进行测试,除此之外用户也非常重视软件的性能问题。因此,团队中的测试人员还可以更细分为功能测试组与性能测试组,两个小组可以各自选用相应的自动化工具并行作业。

软件性能广义上涵盖健壮性、安全性、兼容性、高效性等一系列非功能特征[9]。本实验体系中的性能测试主要关注的是系统响应时间、吞吐量、并发用户数、资源利用率等性能指标。自动化的性能测试是通过测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。在自动化性能测试技术使用之前,手动测试是大部分测试人员的首选。当时为了测试并发负载的性能指标,还必须召集一定数量的操作人员和同样数目的电脑,在同一时刻进行操作访问被测系统以求模拟高峰期的负载状况,然后拿秒表记录下反应时间,这样的手工作坊式的测试方法费时费力不切实际且无法捕捉程序内部变化情况[10]。目前,性能测试工具的代表当属Mercury LoadRunner,它可以通过创建大量的虚拟用户来实行并发的负载的实现及同一时刻进行性能监测的方式来找出和确定系统中的问题,从中发现准确的系统瓶颈,从而得出相应的性能调优方案[11-12]。性能测试流程主要包括制定测试方案、创建虚拟用户脚本、设计测试场景、运行场景以及分析测试结果。软件需求文档中关于产品的性能方面同样编写了非常详细的要求,因此,负责性能测试的组员必须严格依照文档设定性能指标,例如文档中约定100个用户并发查询同一报表的交易响应时间不超过30 s,那么实验中就必须创建100个虚拟用户、编辑查询报表的操作步骤,然后通过LoadRunner记录的时间来进行验证。图5所示为LoadRunner运行场景界面图,其中显示了虚拟用户从初始化到操作完成的过程中软件服务器端的实时性能数据。

图5 LoadRuuner运行场景界面

(4)缺陷跟踪管理。测试人员找出缺陷的最终目的是使每个缺陷得到最合适的处理。缺陷的处理过程需要团队中不同角色的成员协同运作,从缺陷最初被发现到最后被关闭的过程中可能经历各种不同的状态,常见的缺陷状态包括:新建、反馈、认可、已确认、已分派、继续跟踪、已解决和已关闭[13]。主干的管理流程如图6所示,首先由测试人员记录缺陷的详细信息,而后测试组长审核缺陷报告合格再分派给编码人员进行缺陷的修复工作,最后由测试人员回归测试确保缺陷真正被修复。在主干流程之外,还根据缺陷报告质量与缺陷修复等情况会出现其他分支流程,导致缺陷处于不同的状态。

图6 缺陷管理的主干流程

根据缺陷管理需求,缺陷跟踪管理系统必须能对缺陷信息进行科学管理,形成规范的缺陷处理流程,才能保证缺陷得到及时恰当的处理。本实验体系中选用Mantis作为缺陷管理工具,Mantis是一款能够添加、修改、排序、查看、存储软缺陷的数据库程序,其采用PHP语言开发,基于B/S架构,可以跨地域操作,具有完整的缺陷跟踪管理功能,是适合大部分软件开发团队的轻量级缺陷管理工具[14-15]。实验中测试人员需要搭建及配置Mantis后台数据库及前端页面,需要在系统中创建不同角色,然后才能进入缺陷处理流程。图7所示为测试人员在Mantis系统登录项目之后查看缺陷信息的界面。

图7 Mantis中查看缺陷界面

3 结 语

软件测试已不再是软件生命周期里最后一个阶段,而是贯穿始终的一项任务。软件测试作为软件工程系列中独立的一门课程承担着为软件行业培养一批强有力测试人才的重任。为了扭转学生对测试工作的偏见,必须对课程教学进行改革,在课程中建立实验教学体系。实验以团队形式展开,人员安排参考学生的意愿进行角色扮演,实验题目可追溯到已修读完毕的课程作品,实验步骤按照软件测试的核心流程来设定,实验内容将人工操作与自动化测试有机融合。实践证明,该实验过程能更加提高学生对软件测试的兴趣,更加提升软件测试的重要性,更加增强测试技术学习的效率,更加符合测试岗位对人员招聘的标准。

猜你喜欢

单元测试测试人员测试用例
回归测试中测试用例优化技术研究与探索
基于SmartUnit的安全通信系统单元测试用例自动生成
软件测试误区分析
浅析软件测试中的心理学应用
基于依赖结构的测试用例优先级技术
一年级上册第五单元测试
一年级上册一、二单元测试
犯罪心理测试人员素质要求分析
犯罪心理测试人员素质要求分析
第五单元测试卷