0 引 言
软件测试是软件工程知识体系的一个重要组成部分[1].四川大学软件学院从 2008 年开始为本科学生开设软件测试课程,目的是使学生系统地掌握软件测试的基本概念和技术,培养学生的软件质量意识,提高学生在软件开发中的综合能力,进一步帮助学生在软件开发中减少缺陷的产生。
为了提高学生学习该门课程的兴趣,全面提高学生的实践能力,从 2013 年开始,课程组对实践教学环节进行建设和改革,通过参考国内外众多大学和培训机构的软件测试课程[2-5]实践教学内容,结合实际情况,建设完成了一套完整的课程实践体系。实践项目设计的主要目标是真实:一是使用真实的、企业级(或接近企业级)的测试工具;二是使用真实的被测系统(systems undertest, SUTs )。这样可以使学生在学习本课程后,具有解决实际工作中软件系统测试问题的能力。
1 课程特点及实践教学存在的问题
1.1 软件测试课程的特点]
(1)基本概念多。软件测试知识体系中基本概念繁多,如单元测试、集成测试、系统测试、黑盒测试、白盒测试、回归测试、配置测试等。这些概念是课程的基础,学生必须首先弄清这些概念的含义。实际上,对于每个教师来说,要把各个概念解释清楚并不困难,令学生听懂也不难,但是很多学生在课堂上学习完这些概念后,很快就忘记各个概念的含义和区别,也就是说这些概念没有变成他们真正掌握的知识,其主要原因是学生没有通过实际动手加深对各个概念的理解,因此要想学好这门课,就必须重视课程的实践部分。
(2)实践性强。通过对实际系统的各种测试实践,学生可以体会理论教学中的各种概念、技术和理论并实际使用各种测试技术和测试工具,这样可以极大地加强对理论知识的掌握和理解。
建设有效的实践教学体系,对于提高软件测试课程的教学效果很有必要。
1.2 实践教学存在的问题
(1)学生不重视。很多学生对软件测试的认识不够,对软件测试工作有一种错误观念,认为编码能力不够的人才会去做软件测试或者女生才适合做软件测试。这样导致的结果就是很多学生排斥该门课程,有的学生只是为了混学分才选这门课,对于实践部分也是抱着蒙混过关的想法。
(2)内容陈旧。要求学生完成的实验题目都是几年前的,不能跟上软件测试近几年的发展。例如,只是使用手动方式进行黑盒测试,在Word 或 Excel 中记录测试结果,没有任何自动化工具的使用,导致学生没有兴趣完成实验。
(3)被测系统没有实际意义。很多被测系统都是极小型的、只有几十行代码的实例程序,对学生能力的提高帮助不大。编写一个几十行代码的系统与编写一个上万行代码的系统相比,需要的技术天壤之别。同样地,对于软件测试来说,学生只有通过测试大型的实际系统,才能学会如何测试。
(4)测试工具不实用或不可得。以前软件自动化测试工具很少且大多数是商用软件,因此实践项目设计中缺乏对自动化工具的使用。
(5)所用工具的广度不够。一些学校的软件测试实践教学中,只是让学生练习使用单元测试工具,缺少其他流行的自动化测试工具的使用。这些问题的存在使得学生学习完这门课后,实际能力没有本质上的提高,直接导致学生进行实际软件测试时不知道如何下手进行测试。
2 主要实践项目介绍
课程实践的主要目的是使学生在有限的实验时间内,通过理论结合实际,提高实践动手能力。实验题目选择的原则是体现基础性和前沿性,参考国内外着名大学的课程体系和教学内容,密切结合软件测试技术的最新发展。
在设计实验题目时,教师应主要考虑如下 4个因素:①覆盖面。不一定大而全,但要覆盖重点需要掌握的一些知识点。②实用性。所使用的工具应是业界或接近业界所用工具,使学生通过实验能够感受到企业级的软件测试。③综合性。
在有限的几个实验中,综合课程的多个知识点。④工作量。实验基本内容设计应难度适中和循序渐进,另外还可设计一些加分内容,难度原则是使学生“跳起来够得着”.具体来讲,70% 的学生能够在课内完成基本实验;10% 左右能力差的学生需要课外自己找时间完成;20% 左右能力强的学生可以在课内完成基本实验和加分实验内容。
实验工具尽量选择开源软件工具。近几年,随着开源软件的普及,越来越多开源、实用的自动化软件测试工具出现。很多工具在业界得到广泛使用和好评,如 JUnit、EclEMMA、BugZilla 等。
实验项目中大多数使用的是开源软件工具。最早的实验项目主要借鉴 Vahid Garousi[6]博士开设的软件测试实验课内容。在 2013 年和 2014 年两次使用后,我们根据学生的成绩情况和反馈、工具的可用性等进行修改,最终确定如下 5 个实验项目:①动态黑盒测试;②静态白盒测试;③单元测试;④ Web 测试;⑤测试覆盖率。
软件测试课程的实验课为 16 学时(2 学时 /次 ×8 次)。实验①③④分别用 2 次实验课完成,实验②⑤分别用 1 次实验课完成。这几个实验覆盖了理论课学习中主要要求掌握的知识点。
2.1 实验项目介绍
1)实验 1 :动态黑盒测试。
实验目的:了解软件测试的几个基本概念,包括黑盒测试、随机测试、回归测试、测试用例、手工测试、缺陷的生命周期等;通过使用缺陷记录工具 BugZilla,了解业界对于缺陷管理的过程。
知识点:重点是黑盒测试,其他还有测试用例、回归测试、缺陷生命周期等。使用的工具:开源工具 BugZilla.被测系统:ATM 模拟系统[7].
2)实验 2 :静态白盒测试。
实验目的:在业界,静态白盒测试是高级的缺陷查找技术。静态白盒测试能够找出一些特殊的缺陷,这些缺陷是大多数编译器不能发现的,也是程序员进行人工代码检查时不容易发现的;有的缺陷是动态软件测试也很难发现的,如内存泄漏。该实验能够让学生理解静态白盒测试的重要性,使用静态测试工具进行代码静态分析并理解静态分析工具所得结果。
知识点:重点是静态白盒测试,其他还有代码分析、代码复杂度等。
使用的工具:商业工具 PC-Lint,实验使用的是此工具的网页试用版本。
被测系统:学生在学习 C/C++ 程序设计课程时编写的代码或者在开发其他项目时自己编写的代码。
对自己的代码进行检测,每个学生都很有兴趣;特别是发现原本编译和运行正确的代码居然还有错误时,大多数学生感触很深。
3)实验 3 :单元测试。
实验目的:JUnit 是目前业界使用最为广泛的应用于 Java 的单元测试工具。JUnit 框架允许开发人员快速、轻松地创建单元测试和测试套件。
该实验让学生熟悉单元测试的基本概念和技术,学习使用 JUnit 进行单元测试用例的编写。
知识点:重点是单元测试,其他还有驱动模块、桩模块、测试套件、断言、测试 Oracle 等。
使用的工具:开源工具 JUnit.
被测系统:JFreeChart,是 Java 平台上一个开源的图表绘制类库。实验中选取其中 2 个类的10 个方法进行测试。
4)实验 4 :Web 测试。
实验目的:目前大量系统是 Web 应用系统,了解这类系统的测试技术,对于学生日后的实际工作有很大帮助。该实验让学生熟悉 Web 应用程序的功能测试过程,同时熟悉“录制-回放”
类测试工具的基本操作,为以后进行 GUI 程序测试奠定基础。
知识点:重点是 Web 测试,其他还有 GUI测试、测试脚本等。
使用的工具:开源工具 Selenium.
被测系统:学生自己选择熟悉的网站,如百度、淘宝、学校的课程中心等。
5)实验 5 :测试覆盖率。
实验目的:测试覆盖率是度量测试完整性的一个重要手段,是测试有效性的一个度量。通过该实验,加深学生对于测试度量和测试覆盖的理解,帮助学生回答测试的“完全程度如何”;同时让学生体会为了达到尽量完全的测试,应该如何编写有效的测试用例。
知识点:重点是测试度量和测试覆盖率,其他还有单元测试,语句覆盖、分支覆盖、条件覆盖等不同的覆盖准则。
使用的工具:开源工具 EclEMMA.
被测系统:JFreeChart.
该实验要求学生基于实验 3 的结果,查看自己所写测试用例的覆盖情况,然后基于规定的测试覆盖率要求,增加相应的测试用例。
2.2 实验成绩评定
在布置每个实验时,教师除了详细地指导实验,还应公布详细的评分标准,让学生知道哪些地方是得分点。教师进行评定时,要严格执行评分标准。成绩公布后一周内,学生可以对自己的分数提出异议并与教师沟通。每个实验的分数由实际操作和实验报告两部分构成。对于每个实验报告,教师给出基本框架,这样可以令格式统一,也可以让学生清楚各实验的重点在哪里。学生的最后得分由实验室操作、测试用例编写、实验报告 3 部分组成。每一部分的要求和分数分布都要详细给出。单元测试评分标准如下。
1)实验室操作(10%)。
在实验室内完成所有实验步骤并可以运行自己写的测试脚本。
2)测试用例开发(50%)。
在课程网站中提交自己开发的 10 个 JUnit 测试用例,每个用例 5 分,评分标准如下:清晰(代码格式规范,可读性好),占 1%;与需求一致(只测试需求中描述的功能),占 1.5%;完整(测试需求中描述的所有内容),占 1.5%;正确(测试真正需要测试的属性),占 1%.
3)实验报告(40%)。
请根据给出的实验报告模板撰写实验报告,你可以根据自己的情况,修改其中的部分标题内容。要求报告中至少包括如下内容:引言,占 5%;测试用例描述,占 25%;测试时遇到的困难或挑战,占 3%;实验的收获或结论,占 3%;意见和建议(该实验有用吗 ? 能否根据实验指导完成?实验时间太多 / 太少吗?你还希望增加 / 减少什么内容),占 4%.
3 使用效果分析
所设计的实验项目在 2013 年和 2014 年春季学期软件测试课程中使用,面向的是本科 3 年级学生,分别是 143 名和 80 名学生。学生已经学习过 C/C++/Java 程序设计、软件工程、数据结构等大多数专业基础课程,具有小型程序开发设计经历;少量学生已开发过一些实际的软件项目,在软件工程课程中学习了软件测试的基本概念。
期末统计实验成绩各分数段比例,结果见表 1.
可以看出,2013 年成绩总体偏低,原因是部分实验难度和工作量偏大;2014年进行了调整,成绩有很大提升,基本符合教学预期,其中发现静态白盒测试的难度偏低,目前已进行了调整。
从学生反馈的情况看,大部分学生对于实验的难度、工作量、获得的能力等比较满意,当然也提出一些很好的改进建议。
4 结 语
笔者根据近几年的教学经验,对软件测试课程实践教学环节存在的问题进行分析,介绍了所设计的实验项目情况,提出了相应的改革措施。
从实际的使用效果看,达到了让学生巩固理论知识和提高动手能力的目标,提高了教学质量,在教学实施过程中取得很好的效果,激发了学生的学习兴趣,为软件测试课程的实践教学环节提供参考。目前的实验设计并非完美,在以后的教学中,还有一些问题需要解决。
(1)前沿性不够。一些新型应用不断普及,但实验项目中没有针对这些应用的测试,如移动应用测试、云测试等。
(2)覆盖面不够。性能测试、配置测试等都是教学主要内容,但由于课程的实践时间有限,没有设计这方面的测试内容。
(3)理论性不够。所设计的实验题目侧重于简单的动手实践,没有能够让学生在理论上进一步提高的内容。
(4)部分工具功能有限。所选用的工具与商业工具相比,在功能及性能上还有一定差距。例如 PC-Lint,实验使用的只是其网上试用版本,功能很有限,不能很好地体现静态白盒测试的某些功能。
参考文献:
[1] Bourque P, Richard E, Fairley R E. Guide to the software engineering body of knowledge(SWEBOK(R)): version 3.0[M].Washington D C: IEEE, 2014: xxxi-xxxii.
[2] Atif Memon. CMSC737: fundamentals of software testing (Fall 2012)[EB/OL]. [2015-09-18].
[3] CS 490 software Testing Spring 2011[EB/OL]. [2015-09-18].
[4] 陈振宇。 软件测试方法与技术[EB/OL]. [2015-09-18].
[5] Testing Education. About the lab[EB/OL]. [2015-09-18].
[6] Garousi V. An open modern software testing laboratory courseware–an experience report[C]//2010 23rd IEEE Conference onSoftware Engineering Education and Training (CSEE&T)。 Washington D C: IEEE, 2010: 177-184.
[7] Bjork R C. ATM simulation links[EB/OL]. [2015-09-18].