0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

软件代码结构化覆盖测试-分支覆盖

上海控安 来源:上海控安 作者:上海控安 2023-09-01 11:34 次阅读

作者 |李伟 上海控安安全测评部总监

来源 |鉴源实验室

社群 |添加微信号TICPShanghai”加入“上海控安51fusa安全社区”

引言:上一篇开始我们介绍白盒的代码结构覆盖率测试,已经完成了语句覆盖测试的讲解,本篇我们介绍分支覆盖。

01

关于定义

从测试技术对代码的测试程度上来说,在复杂代码中,分支覆盖比语句覆盖效果要好。很多时候分支覆盖也被叫做判定覆盖。语句覆盖是要求设计的测试用例可以让所有的语句都能够被执行测试。分支覆盖是要求设计用例对代码中所有的逻辑判定分支都被执行测试,也就是每次判定逻辑上真假两种的分支执行情况都覆盖。从定义上我们就可以看出两种方法的测试度量角度是不一样的。计算方法上,语句覆盖的分母是代码总行数,分支覆盖的分母是代码中所有判断的分支总数。

02

分支覆盖测试的举例

我们使用下面一段简单代码来举例说明:

wKgaomTxW8uAIw73AABErXYC5tE096.jpg

这段代码总共11行,一个逻辑判断的条件,即x<10为真或假,我们可以看到输入的变量a和b决定了输出值y。对于这段代码的分支覆盖测试设计,我们令a=5或a=15,对应x<10为真或假两种情况。a=5时x<10为真,测试用例执行了代码的第1-6行进入了逻辑真的分支,a=15时x<10为假,代码执行了第1、2和8至11行,执行了逻辑为假的分支。这两条测试用例覆盖全部的两个判定分支,分支覆盖率为100%。

这上面这段代码中,我们针对分支覆盖设计了两条测试用例,达到了覆盖率100%,我们可以发现同样是这两条测试设计,语句覆盖率一样达到了100%,那语句覆盖跟分支覆盖的区别如何体现呢,同样是这段代码我们实际中很多时候是用下面的习惯编写,如:

wKgZomTxW8uAbVhoAAAdr5PILNY156.jpg

这段代码的效果跟前面举例中代码的效果是一样的,对于分支覆盖设计也是一样,因为同样只有一个判定条件,需要分别测试x<10为真或假的两种分支情况,但是语句覆盖设计就不一样了,语句覆盖设计只需要设计一条用例,令a=5即可以覆盖所有的代码语句。这里我们就可以看出分支覆盖的结构化程度高于语句覆盖。

上面的例子相对简单,我们把这段代码稍微变动,来深入探讨一下分支覆盖。示例代码如下:

wKgaomTxW8uAcHACAAASnIQxQ1E489.png

我们可以看到这段代码的逻辑判断了一次,代码同样有两个分支,针对分支覆盖测试我们只需要针对x < 10 && y > 10 == 0 为真或假两种情况,即我们可以令a=15或b=5时代码判断进入条件真的分支,令a=5且b=15代码判断进入条件假的分支。

上面的例子我们也可以看出,分支覆盖测试我们仅在if后面的整体判定语句上取了真和假两种情况,并未深入到该行代码语句中每个判定条件来取真假。

03

使用工具来进行分支覆盖测试

本章节我们继续使用SmartRocket TestGrid这款工具进行代码的分支覆盖测试分析,给大家介绍工具是如何生成测试用例完成测试任务的。

3.1工具测试举例

针对如下代码:

wKgZomTxW8yAbsDOAAA_7UbaBkI087.png

这段代码我们可以看到函数的形参有两个,分别是lua_State *L、init idx,代码逻辑也较为简单,当more为真时执行api_incr_top(L),为假时执行L->top -= 1。more为代码块中定义的局部变量,被赋值为luaH_next(L, hvalue(t), L->top - 1)。

工具自动分析后会生产控制流图如下:

wKgaomTxW8yAS4x8AAAi4Zjw-Fw702.png

控制流图可以直观地看到在本例中两条分支情况,我们可以设计测试用例令more分别为真和假,分别覆盖两条分支,这样就可以完成分支100%覆盖。

我们通过查看项目头文件可以得到函数luaH_next()的形参hvalue(t)已有定义,通过宏替换变为luaH_next (L, ((&((((union GCUnion *)((((t)->value_).gc))))->h))), L->top - 1),可以通过工具来生成用例中的桩函数,下图为工具自动生成的测试用例1:

wKgZomTxW82AF5wPAADwTUvg-jg608.png

本条用例中桩函数的返回值控制了判断条件的真或假,本条测试用例覆盖的是代码中为真的分支语句。代码中函数的最终返回值也是由more变量决定,我们在用例的输出也可以看到实际返回值跟桩函数的返回值是一样的。

下图为测试用例2:

wKgaomTxW82AOJaXAADw5LZvUO4972.png

本例中桩函数luaH_next()的返回值设置为0,所以覆盖的是代码中判断结果为假语句分支代码。对于用例中的输入形参,在执行过程中影响了桩函数和执行语句,间接影响本例中的判断条件取值。

我们可以看到工具通过这两条测试用例分别覆盖了两个判断的分支,所以这段代码的测试分支覆盖率就是100%。

04

测试小结

在执行分支覆盖测试时我们有以下建议供大家参考。

1. 通常sil等级不同要求执行的结构覆盖方法会不一样,但是语句覆盖通常会和分支覆盖一起出现在低sil等级的测试要求中。

2. 语句覆盖和分支覆盖的覆盖率统计维度是不一样的,语句覆盖是以代码行数为分母,分支覆盖是以代码中逻辑判断的分支总数为分母。

3. 在合并执行语句覆盖和分支覆盖时测试用例是可以复用的,我们可以在语句覆盖的基础上叠加用例来完成未被测试的分支部分覆盖。

审核编辑 黄宇


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 测试
    +关注

    关注

    8

    文章

    4448

    浏览量

    125122
  • 代码
    +关注

    关注

    30

    文章

    4555

    浏览量

    66766
收藏 人收藏

    评论

    相关推荐

    代码覆盖测试工具BullseyeCoverage在嵌入式软件系统中的应用研究

    代码覆盖分析是一种白盒测试方法,因为覆盖分析需要访问测试代码本身,且经常需要重新编译程序,以程序
    的头像 发表于 09-21 17:36 3338次阅读
    <b class='flag-5'>代码</b><b class='flag-5'>覆盖</b>率<b class='flag-5'>测试</b>工具BullseyeCoverage在嵌入式<b class='flag-5'>软件</b>系统中的应用研究

    软件代码结构化覆盖测试-MC/DC覆盖

    MC/DC的全称是Modified Condition/Decision Coverage,修正条件判定覆盖率。很多文章对于定义的解释都比较专业,通常也会让人感觉理解困难,本文我们用通俗易懂的说明给大家做介绍。
    的头像 发表于 12-15 15:22 2535次阅读
    <b class='flag-5'>软件</b><b class='flag-5'>代码</b><b class='flag-5'>结构化</b><b class='flag-5'>覆盖</b><b class='flag-5'>测试</b>-MC/DC<b class='flag-5'>覆盖</b>

    怎么设计基于路径覆盖的嵌入式软件动态测试

    测试结果的有效性;而仅在目标机上进行测试,由于软件运行的不可视性,又使得测试者难以知晓程序当前运行状态,以及代码
    发表于 08-26 07:45

    基于路径覆盖的嵌入式软件动态该怎么测试

    测试结果的有效性;而仅在目标机上进行测试,由于软件运行的不可视性,又使得测试者难以知晓程序当前运行状态,以及代码
    发表于 08-28 07:38

    如何对嵌入式软件进行覆盖测试

    嵌入式软件覆盖测试原理是什么?嵌入式实时操作系统的覆盖测试工具是什么?Logiscope在嵌入式操作系统DeltaCORE
    发表于 05-13 07:30

    嵌入式仿真平台SkyEye的覆盖率分析相关资料下载

    随着嵌入式系统也越来越复杂,功能迭代越来越多,代码中就可能就会存在部分无用代码,或者在执行过程中无法测试覆盖分支,这可能就会给
    发表于 12-17 07:27

    嵌入式软件覆盖测试

    覆盖测试是验证软件功能结构正确性以及查找问题的非常重要的方法和手段,它要借助一定的工具才能取得较好的效果, 满足软件在质量和时间上的双重要求
    发表于 05-14 15:09 17次下载

    基于分支覆盖的回归测试路径选择

    测试数据。从而降低了回归测试的效率.研究了回归测试分支覆盖问题,通过利用已有测试数据的路径
    发表于 01-15 11:08 0次下载

    嵌入式代码覆盖率统计方法和经验

    代码覆盖率是衡量软件测试完成情况的指标,通常基于测试过程中已检查的程序源代码比例计算得出。
    的头像 发表于 01-06 15:06 2839次阅读
    嵌入式<b class='flag-5'>代码</b><b class='flag-5'>覆盖</b>率统计方法和经验

    统计嵌入式代码覆盖率的方法和经验

    代码覆盖率是衡量软件测试完成情况的指标,通常基于测试过程中已检查的程序源代码比例计算得出。
    的头像 发表于 03-29 11:58 1611次阅读
    统计嵌入式<b class='flag-5'>代码</b><b class='flag-5'>覆盖</b>率的方法和经验

    代码覆盖工具的重要性

      它支持语句覆盖分支覆盖和圈复杂度。它提供了分别选择低、中、高和完整级别的代码覆盖率的规定。它非常易于使用和快速,也可用于开源和商业许可
    的头像 发表于 06-30 10:36 662次阅读
    <b class='flag-5'>代码</b><b class='flag-5'>覆盖</b>工具的重要性

    选择代码覆盖工具的 10 个标准

    为了开发安全可靠的软件测试是质量保证不可或缺的一部分。如果没有充分的记录测试,就不可能确定软件是否安全且功能是否正确。在这种情况下,代码
    的头像 发表于 07-20 18:06 1071次阅读
    选择<b class='flag-5'>代码</b><b class='flag-5'>覆盖</b>工具的 10 个标准

    代码覆盖检测

    1 代码覆盖率概述 覆盖率(code coverage rate)是反映测试用例对被测软件覆盖
    的头像 发表于 05-12 22:26 2487次阅读
    <b class='flag-5'>代码</b><b class='flag-5'>覆盖</b>检测

    软件代码结构化覆盖测试-语句覆盖

    本篇将深入到代码层面,讲解单元测试中的一项重要工作-软件代码测试
    的头像 发表于 08-25 11:50 387次阅读
    <b class='flag-5'>软件</b><b class='flag-5'>代码</b><b class='flag-5'>结构化</b><b class='flag-5'>覆盖</b><b class='flag-5'>测试</b>-语句<b class='flag-5'>覆盖</b>

    代码覆盖率记录

    为确保具体的产品(例如,医疗或航空电子市场)质量合格, 通常需要提供语句覆盖与判定覆盖认证证明。对于各种嵌 入式系统,规范要求高度优化的代码需要实时测试。禁止
    发表于 11-03 11:02 0次下载
    <b class='flag-5'>代码</b><b class='flag-5'>覆盖</b>率记录