图 1 软件测试多维评估系统架构图
1. 项目意义软件测试作为软件开发过程中必不可少的部分,尤其在开发和交付高质量的软件的情况下,其重要性不言而喻。随着市场对软件质量的要求不断提高,企业对高质量测试工程师的需求量越来越大。面对工业界软件测试人才需求日益增长的现状,各大高校和在线教育平台纷纷开设软件测试课程。由于软件测试是以理论为主导,注重实际应用的学科,因此在课程期末考核时,除了基本的理论考试之外,学校通过在软件测试教学平台上组织考试练习来鼓励学生提交测试代码,结合实战综合考察学生对软件测试的掌握程度。然而针对学生实际编写的测试代码,如何有效地考察测试代码,评估其测试效果,以便给出指导建议从而实现进一步的提高,成为了一个值得关注的问题。
覆盖率作为传统评估测试充分性的标准,但仅通过覆盖率来评估测试效果是不充分的。达到相同的覆盖率,测试代码的冗余情况、运行时长、兼容性以及学生的编码时长等要素都不尽相同。因此需要结合多方面因素,综合地对测试效果进行评估。根据建设性调整(Constructive Alignment)理论的要求,要重视教学评估标准的设计,评估结果会给学生带来反馈,对学习过程产生一定的影响,因此科学地设立软件测试的评估标准可以推动学生学习测试知识的积极性。系统通过多维度、多粒度地展现测试评估效果,为学生指引提升测试效果的方向。
2. 项目内容本文基于慕测教学平台,以平台支持的开发者单元测试、移动应用自动化测试和Web应用自动化测试为具体的测试实例类型,针对学生参与线上考试提交测试代码的场景,结合其测试产物和测试行为提出多个评估指标,建立测试多维评估体系,对测试效果进行多维度评估,并提供评估结果的直观展示。由于系统建立在评估体系的基础之上,因此本文首先对测试多维评估体系进行介绍。
测试多维评估体系从覆盖召回率、覆盖准确率、缺陷检测率、测试兼容性、测试运行效率、测试可维护性、测试编码效率七个维度对测试效果进行评估。覆盖召回率和覆盖准确率是将机器学习中的混淆矩阵概念与传统代码覆盖率相结合,覆盖召回率即传统代码覆盖率,引入覆盖准确率来考察学生测试代码的冗余问题。缺陷检测率通过在源代码中执行变异算子生成变异体,根据变异体杀死的比例评价测试代码的缺陷检测能力。测试兼容性考察测试代码在不同硬件、软件环境下运行成功的情况,计算运行成功次数与总次数的比值。测试运行效率考察测试代码达到相同的覆盖召回率与其运行时长的相关性。测试编码效率考察学生达到相同的覆盖召回率的单位编码时长,由于学生测试框架及语法掌握的熟练程度不同等原因,其编码时长不同。测试可维护性主要对编码风格进行考察,培养良好的编码风格,可以提高代码的可读性、可理解性、可维护性。具体将代码规范的违反情况进行归类并计数,与所有学生违反该类次数的最大值进行比较。如图1为系统架构图,主要对应如下三个阶段:测试代码分析阶段、测试效果评估阶段和评估结果可视化阶段。详细介绍如下:
测试代码分析阶段。
此阶段是对测试代码进行多方面地分析,根据不同的测试类型,选取相应的代码分析工具提取代码特性的过程。由于一场考试涉及到的测试代码数量大、分析种类多,考虑系统的稳定性以及高可用性,系统采用Celery分布式系统实现分析任务的异步调度执行。分析工具通过Docker容器化技术封装,保证了执行过程的高效、不受干扰,部署环境的可移植以及后期维护的便捷。以开发者单元测试为例,利用PIT工具进行变异分析,具体表现为操作字节码生成变异体引入缺陷并运行测试,解析生成的测试报告获取变异体的杀死存活数量;利用JCov工具进行运行效率分析,具体表现为执行代码覆盖分析的过程,获取整个过程的运行时间;利用Checkstyle工具进行编码风格分析,解析报告获取代码违反规则的名称及对应的次数等。在异步任务回调逻辑中查询并解析分析结果,通过RestHeart的接口存储至MongoDB中,方便后续阶段使用。测试效果评估阶段。
此阶段是以测试行为数据(即学生在考试过程中的提交记录)及上个阶段获得的分析结果作为输入,执行数据预处理、计算评估指标得分、应用标准化方法的过程。预处理涉及到数据清洗、数据转换和数据整理,对时间类型的数据的格式进行转换,统一为时间戳的方式,方便计算编码时长即提交时间与考试开始时间的差值。其后将数据整理为学生ID与对应的测试代码分析结果的形式,统一处理为Pandas的DataFrame格式。通过应用测试评估指标对应的公式计算评估指标得分。由于不同指标分数初步计算得到后处于不同的值域内,为了使各指标处于同一数量级,适合综合对比评价,因此对分数应用标准化方法。这里选取最小值-最大值标准化方法对各指标分数进行线性归一,同一考试同一试题中学生在每个维度上的表现分数最高的为100分,最低的为0分。评估结果可视化阶段。
此阶段是将上述工作得到的评估结果进行可视化渲染并区分粒度展现的过程。大粒度对应学生历次考试的评估记录总结性地展现测试效果,主要以测试评估总体图、多测试类型分布图方式展现。中等粒度对应学生在一场考试中的测试评估结果展现,包括考试得分排名等基础信息、每个试题对应的测试效果多维雷达图以及各维度分数在总体学生中的定位情况。小粒度对应学生在一场考试中的一个试题的某一维度的详情信息展现,如缺陷检测率中变异体杀死和存活的分布情况以及具体对应的原代码和变异代码列表等。总之,系统支持用户直观清晰地查询到测试评估的结果,以便教师提出下一步教学提高计划以及学生有针对性地练习从而提高测试效果。图 2 评估结果展示界面图
3. 项目效益系统从用户在慕测教学平台考试过程中收集的测试产物和测试行为数据入手,根据测试类型针对性分析测试代码,结合分析结果应用评估指标计公式对测试效果进行多方面的评估,将评估结果通过可视化直观丰富地展现给用户。系统提供的多维度、多粒度评估结果展示界面如图2所示。
为了进一步验证本系统在真实场景的可用性,本文结合教学平台丰富的考试案例进行评估,从教学平台的历史考试中选取了14场考试,其中开发者单元测试10场,移动应用自动化测试3场,Web应用自动化测试1场,涉及参与考试学生718人次,提交记录26666条。
图 3 学生测试效果对比图
基于测试评估得分应用标准化方法后得到的是相对得分,因此在对各维度分析的过程中,通过对比学生的维度得分进行分析。由于开发者单元测试的兼容性主要体现在JDK版本不同引起的差异,而教学平台已指定JDK版本规避此问题,因此兼容性不纳入为其评估项,为了雷达图的可观性,兼容性评分都取100分。我们选取学生A、学生B以及学生C在试题“SearchGraph”中的测试效果分析,他们在此试题中的得分分别为69.67、69.13和68.77,与之对应的测试效果多维雷达图如图3所示。教学平台通过代码覆盖和变异分析得分加权相加计算分数,可以看到三位学生在得分相似的前提下,在测试可维护性、编码效率及运行效率上三个维度上有明显的差异性。系统以分析测试代码及测试行为数据为支撑,多维度地评估测试效果并展现评估结果,更加针对性地为教师和学生提供反馈。
系统目前已经与慕测教学平台集成,提供软件测试评估的服务,可以有效地根据学生参与考试提交的测试代码以及提交记录数据多维度地评估其测试效果,提供反馈。系统旨在更全面地评估学生的测试效果,其评估指标在教学平台主办的软件测试大赛中得到广泛的应用,评估结果得到大赛专家组的一致认可。