一种Java代码覆盖率工具的应用研究

2020-04-24 14:50陈小雁李雨江
电脑知识与技术 2020年5期
关键词:测试用例软件测试

陈小雁 李雨江

摘要:为提高软件测试效率,分析了代码覆盖率种类,探讨了Java代码覆盖率工具ElcEmma的工作原理,并将其应用到Ja-va游戏实例中。应用情况表明,ElcEmma能有效地从不同层面定位代码的覆盖及未覆盖情况,帮助开发人员设计出高质量的测试用例,有助于保障软件测试工作的充分性。

关键词:软件质量;软件测试;代码覆盖率;白盒测试;测试用例

中图分类号:TP393文献标识码:A

文章编号:1009-3044(2020)05-0065-02

开放科学(资源服务)标识码(OSID):

随着现代信息技术的飞速发展,软件普遍深入到人类日常生活的各个领域,发挥着重要的作用。与此同时,人们对软件质量也越来越重视。软件质量是软件产品的生命线[1]。然而随着软件规模的不断增长,程序复杂度不断提高,由于不合理的设计和软件开发人员的疏忽而致使软件中隐藏的缺陷也越来越多,由此引发的软件故障给国家、给企业带来了不可估量的损失[2]。

在软件开发领域中,软件测试作为保证软件质量的重要手段[3],贯穿于整个软件的生命周期,发挥着越来越重要的作用。统计表明,在典型的软件开发项目中,软件测试的工作量往往占据软件开发总工作量的40%以上,而在软件开发总成本中,用在测试上的开销高达30%_40%[4]。为了保证软件质量,通常使用手工测试或自动化测试来运行并验证某个应用系统的过程是否满足规定的需求,并了解预期结果和实际结果之间的差异。

由于软件测试工作在软件生产过程中的重要地位,软件测试得到了软件工程研究人员和从业人员的广泛关注,很多软件自动化测试工具应运而生。根据测试应用的角度的不同,一般可分为白盒测试工具(动态测试,静态测试)、黑盒测试工具(功能测试,性能测试)、测试管理(测试流程管理、缺陷跟踪管理、测试用例管理)等几大类[5]。这些软件自动化测試工具能提高软件测试的速度和效率,节省软件测试成本,缩短产品发布周期,同时可以减少人工干预,避免人为原因给测试工作带来的误差,因而在软件开发领域得到了广泛应用[6-7]。本文探讨了基于白盒测试技术的软件自动化测试工具ElcEmma的原理和实际应用。

1 代码覆盖率分析

在软件测试工作中,代码覆盖测试是测试的底线,能明显提高软件的可靠性,从而保证软件的质量[8]。代码覆盖测试是软件白盒测试的主要方法,利用它可在代码层面定位测试过程中所找出的缺陷,发现被测程序的逻辑结构异常等缺陷信息,检验软件测试充分性,是保证测试质量的有效方法之一[9]。该覆盖测试技术采用代码覆盖率代表被测代码的覆盖程度,用于检验测试的完整性和充分性。代码覆盖率由测试过程中已被执行过的源代码的数目来衡量,其值等于至少被执行一次的项目数/软件中的项目总数。

代码覆盖程度的度量方式有很多种,如语句覆盖、判定覆盖、条件覆盖和路径覆盖等。其中,语句覆盖用于判断软件中的每条可执行代码是否都被执行,不考虑分支和条件表达式的各种组合。判定覆盖用于判断软件中的每一条判定分支是否被执行,它把所测试的判定分支作为一个整体,仅判断该整体的真假值是否被测试到。条件覆盖则用于判断每一条判定分支中的每个子表达式(如果存在)的真假值是否被执行,但不考虑每个子表达式的真假值所构成的排列和组合。路径覆盖用于判断函数的每一个分支是否都被执行,当函数有多个分支嵌套时,需要对多个分支进行排列组合。显然,路径覆盖能将所有可能的分支都执行一遍,是这四种覆盖中粒度最细的覆盖。

2 ElcEmma工作原理

目前,主流程序开发语言C、C++、Ja-va、PHP等都有相应的代码覆盖率工具。其中,ElcEmma是一款基于Emma的Java代码覆盖率搜集及报告生成工具。它以Eclipse插件的形式在工作平台中启动,提供了很多与Eclipse紧密结合的功能。它既支持各种不同级别的代码覆盖,也支持与其他技术集成,因此广泛应用于大型企业级别的项目中。

Emma提供了两种方式来对被执行的代码进行修改,即预插入模式和即时插入模式。EcIEmma仅使用了Emma的预插入模式来工作,即通过Emma定制的Class-loader类载入器对代码进行修改,而不必提前修改软件代码和执行任何安装。El-cEmma能够直接分析代码的覆盖情况并在Java源代码编辑器中高亮显示,且能生成详尽的覆盖测试报告,使得开发人员能够直观、简洁地掌握具体测试结果。

EcIEmma的具体工作过程为:首先把统计代码插入已经编译好的“.class”文件,生成“coverage.em”文件,自动搜集软件中已测试代码和未测试代码的具体情况,从而计算出代码覆盖率的各项相关数据。接着在这些代码覆盖率数据的基础上生成“coverage. ec”文件。最后根据coverage. em”文件和“coverage. ec”文件,生成HTML、XML、Text和Emma Session这些不同格式的代码覆盖率报告,以满足测试人员的多种需要。

3 实例应用

本文应用EcIEmma工具对一个由JAVA语言开发的“贪吃蛇”游戏来进行代码覆盖测试。该游戏包含类和相关函数共计395行。首先设置测试用例1:一直使用右方向键,使蛇往右移动直到撞墙导致游戏结束。对应的EcIEmma代码覆盖率报告如图1所示。

由图1可以清楚、准确地看出整个类和各个函数的代码覆盖率、已覆盖代码行数和未覆盖代码行数等信息。其中,整个SnakxxGame类的覆盖率为79.2%,而keyPressed函数的覆盖率仅为41.5%,该函数尚有24行代码未被覆盖。双击图1中的keyPressed函数,可以深入查看该函数的具体覆盖情况,结果如图2所示。

EcIEmma软件将不同的覆盖情况分别用不同的颜色高亮显示。图2中的绿色高亮显示的代码已经被完全被执行,黄色高亮显示的代码仅是部分被执行,红色高亮显示的代码尚未被执行。从图2可以直观看出keyPressed函数未被测试用例1完全覆盖到的相关代码。

针对该情况,设置测试用例2:反复循环使用上下左右四个方向键,直到蛇撞墙导致游戏结束。用例2对应的EcIEmma代码覆盖率报告如图3所示。

由图3可知,keyPressed函数达到1000-/0的覆盖率,而此时整个SnakeGame类的覆盖率明显增高,达到了95.4%。

4 结束语

本文研究了针对Java语言的代码覆盖率工具ElcEmma的工作原理,并以普及化的“贪吃蛇”游戏为例,根据EclEmma提供的代码覆盖率报告和代码运行结果,有针对性地设置测试用例,显著提高了游戏的代码覆盖率。实例应用结果表明,El-cEmma工具能有效地从不同层面定位代码的覆盖及未覆盖情况,帮助开发人员准确地定位到那些特殊的、只有在特定情况下才被触发的代码,有助于开发人员设计出高质量的测试用例,切实提高软件代码覆盖率,从而为软件测试的完整性和充分性提供保障。

参考文献:

[1]李舟军,张俊贤,廖湘科,等.软件安全漏洞检测技术[J].计算机学报,2015,38(4):717-732.

[2]李丽媛,江国华.一种面向软件缺陷预测的特征聚类选择方法[J].计算技术与自动化,2018,37(2):126-131.

[3]史娇娇,姜淑娟,韩寒,等.自适应粒子群优化算法及其在测试 数据生成中的应用研究[J].电子学报,2013,8(8):1555-1559.

[4]刘琪,赵东东.高负荷条件下MBMS-GW功能测试的研究[J].电子测量技术,2014,37(7):27-31.

[5]邓青华.软件自动化测试工具研究[Jl.同济大学软件院,2011,10(1):57-59.

[6]朱少民,軟件测试方法和技术[M].北京:清华大学出版社,2014:1-90.

[7]牛璐.手机软件自动化测试方法研究与应用[D].郑州:信息工程大学,2012.

[8]浦云明,张杰敏,林颖贤.代码覆盖测试技术在MODE-S应答机中的应用[J].计算机应用与软件,2008,25(7):131-133,148.

[9]马云云,张弛,王金波,等.嵌入式航天软件汇编代码覆盖测试方案[Jl.航天控制,2017,5(35):68-73.

【通联编辑:梁书】

作者简介:陈小雁(1996-),女,广东汕头人,岭南师范学院数学与统计学院本科生,主要研究方向为软件工程;李雨江,通讯作者。

猜你喜欢
测试用例软件测试
基于SmartUnit的安全通信系统单元测试用例自动生成
基于OBE的软件测试课程教学改革探索
基于MBD模型自动生成测试用例的软件测试方法
EXCEL和VBA实现软件测试记录管理
基于混合遗传算法的回归测试用例集最小化研究
关于软件测试技术应用与发展趋势研究
基于需求模型的航天软件测试用例生成方法
基于依赖结构的测试用例优先级技术
智能电能表软件测试技术概述
《软件测试》课程教学策略研究