鉴源实验室丨软件代码结构化覆盖测试-语句覆盖

news2024/11/22 14:19:16

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

来源 | 鉴源实验室

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

引言: 之前我们一直在讲功能、性能、以及专项等相关的测试,这些测试主要集中在集成测试,系统验证等阶段,从本篇开始我们将深入到代码层面,讲解单元测试中的一项重要工作-软件代码测试。

01

代码测试对功能安全的意义

在行业内功能安全越来越多地被提起,对于测试人员来说项目落地时的工作量是趋于增加的。单元测试的执行,在功能安全整体设计要求中是不可缺少的环节,而通常情况下测试工程师对单元测试阶段的任务设计是相对较少和覆盖不全面的。

功能安全标准ISO 26262-6中提供了不同Asil等级的零部件单元测试推荐使用验证方法,同时也对不同安全等级要求代码的结构化覆盖测试给出不同的测试方法。如下图所示:

图片

ISO 26262-6:2018(E) Table 9

从本篇开始我们给大家介绍软件功能安全代码结构化覆盖度量测试的3种方法,本篇将介绍语句覆盖。

02

语句覆盖测试能测试哪些东西

上一章节讲的3种覆盖方法(statement coverage、branch coverage、MC/DC)是从不同维度对被测试代码进行测试设计。我们知道代码是从第一行开始由上向下来执行的,在执行过程中遇到某些循环或者逻辑判断时部分行会跳过,简单理解语句覆盖就是要求所有代码被执行一遍,从这个维度做测试设计进行测试。

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

图片

这段代码总共19行,我们可以看到输入的变量a和b决定了输出值y,对于这段代码的语句覆盖率计算是看我们的代码执行到了哪一行,然后除以19得到的。如我们设计a=9,b=10,那么得到y=y+10=20,语句执行到第9行,跳到第19行结束,总共运行10行,这条测试用例的语句覆盖率就是50%。

如果我们设计a=15,b=10,会执行到第10至第14行。所以我们再设计第三条测试用例令a=30,b=10的时候,这3条测试执行会覆盖所有的语句,此时语句的覆盖率就达到了100%。

在实际的工作测试中,我们碰到的代码不可能这么简单,当然通常我们也都是借助工具来进行代码的测试工作,不会纯人工来对代码进行测试设计和手动测试。目前大多数测试工具都会自动生成一部分的用例来对代码进行测试,但覆盖率不会达到100%,此时就需要我们通过分析代码以及已生成的覆盖用例,手动添加完成剩余覆盖。

03

使用工具来进行语句覆盖测试

本章节我们使用SmartRocket TestGrid这款工具进行代码的语句覆盖测试分析,给大家介绍工具是如何生成测试用例完成测试任务的。工具的操作使用说明篇幅过大,且不属于我们文章分享的目的,在此我们不做过多介绍。

3.1 工具测试举例

针对如下代码:

图片

这段代码我们可以看到函数的形参有两个,分别是lua_State *L、init op,代码逻辑也较为简单,当op!= LUA_OPUNM且op!= LUA_OPBNOT为真时执行api_checknelems(L, 2),判断为假时执行其他操作。

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

图片

控制流图可以帮助我们分析代码复杂逻辑下执行的路径情况,对于覆盖统计有非常大的帮助。在本例中我们可以设计两条测试用例分别覆盖判读逻辑为真和为假的情况,这样就可以完成语句100%覆盖。这两天测试用例分别是1.op!= LUA_OPUNM为真,op!= LUA_OPBNOT为真,2.上述两个判断条件一真一假,或者两个都是假。

我们通过查看项目头文件可以得到LUA_OPUNM、LUA_OPBNOT两个常量的值分别为12和13,下图为工具自动生成的测试用例1:

图片

我们主要看输入形参的赋值和输出指针目标的预期赋值,本函数中未编写对判断做出相应的返回值,只是针对不同判断结果执行了一些操作,因此工具没有对实际值和预期值分别进行赋值。本例中变量op赋值了14,所以这条测试用例覆盖的是代码中为真的分支语句。

下图为测试用例2:

图片

本例中变量op赋值12,判断条件一真一假,所以覆盖的是代码中判断结果为假语句分支代码。对于形参L的赋值,需要查看代码中对于lua_State的定义,虽然这段代码没有返回值,但是两个分支都执行了某些操作执行,这些执行都涉及到了形参L。

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

04

测试小结

在实际的代码覆盖度测试中,测试对象为软件代码,在代码测试的层面我们有几点总结跟大家分享,希望给大家带来帮助。

1. 工具自动生成的测试用例在某些情况下不能自动达到100%,此时就需要我们分析代码,以及已有用例的覆盖情况,对未覆盖部分进行人工补充。

2. 在代码中有部分是天然达不到100%覆盖的,这部分代码有些是做了故意的设计,对系统在代码层面做保护,对于这种情况需要手动补充说明,如设计中止函数自动退出此处代码执行等。

3. 使用测试工具的不同会遇到代码测试统计结果上的差异,如代码总行数会因为空行、注释、头文件等统计方法的不同,得到的最终代码总行数不同,还有覆盖率计算,有部分工具对于代码中函数“{}”等的统计方法不同,会出现即使同样测试语句覆盖用例设计,但最终工具给出的统计结果不一样。

4. 使用工具自动测试过程中通常会提示各种错误,这些错误通常是由头文件、宏定义、数组越界等问题导致,经过调整后会大大提升工具的自动测试覆盖率。

5. 既然测试对象是纯代码,所以严格意义上来说,对于测试人员代码覆盖度测试是没有很大的行业壁垒划分的。也就是我们的测试标准可以分为汽车行业软件功能安全标准、轨交行业功能安全标准、航空行业软件功能安全标准等等,但这些软件可能都是基于C、C++语言编写,对于测试人员只要是同一种语言编写的软件我们不会因为行业不同会遇到不同的测试技术上的问题,测试人员在代码测试的跨行业通用性上特别有利。

6. 测试行业在近几年互联网、计算机、软件工程等专业爆火的同时得到了快速发展,功能测试、性能测试、自动化测试、兼容性测试、健壮性测试等等测试技术也日趋完善,测试期待着新的技术普及点。代码测试以前在很多行业会省略这个验证过程,或者是由开发人员自测,现在伴随着功能安全乘势而起,对于提高测试工程师个人能力也有极大的帮助,我们也希望通过本课程更大家带来更多的提升。

参考资料:

[1] ISO 26262-6-2018 Road vehicles - Functional safety - Part 6 Product development at the software

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/910866.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【快速傅里叶变换(fft)和逆快速傅里叶变换】生成雷达接收到的经过多普勒频移的脉冲雷达信号(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

颜值爆表!这款开源的API工具用起来更优雅!

作为一名后端开发者,我们经常会使用API工具来调试接口,之前一直使用的Postman,用多了感觉它有点不够轻量级,有时候打开也比较慢。最近发现了一款轻量级的开源API工具Insomnia,界面挺炫酷,功能也很实用&…

井下空气质量检测预警系统,煤矿生产、事故应急检测和实时监测

井下空气质量检测预警系统,煤矿生产、事故应急检测和实时监测 在煤矿生产中,空气质量是关系到矿工生命安全的重要因素。煤矿内部存在着各种有害气体,如甲烷、一氧化碳等,高浓度的有害气体会导致矿工中毒、窒息等危险情况,因此煤矿…

Linux journalctl命令详解(journalctl指令)(systemd服务默认日志管理工具)

文章目录 Linux Journalctl命令详解1. Journalctl简介2. Journalctl基础使用3. 过滤日志条目4. 时间戳和日志轮转5. 高级应用6. journalctl --help指令文档英文中文 注意事项journal日志不会将程序输出的空行显示,日志会被压缩得满满当当。journal日志不会自动持久化…

HTML5+CSS3+JS小实例:环形文字动画特效

实例:环形文字动画特效 技术栈:HTML+CSS+JS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content=&quo…

排序算法之详解冒泡排序

引入 冒泡排序顾名思义&#xff0c;就是像冒泡一样&#xff0c;泡泡在水里慢慢升上来&#xff0c;由小变大。虽然冒泡排序和冒泡并不完全一样&#xff0c;但却可以帮助我们理解冒泡排序。 思路 一组无序的数组&#xff0c;要求我们从小到大排列 我们可以先将最大的元素放在数组…

关于图像分类、图像识别和目标检测异同

计算机视觉是人工智能领域的一个重要分支&#xff0c;它旨在构建能够理解和处理图像、视频等视觉信息的计算机系统。在计算机视觉领域中&#xff0c;图像分类、图像识别和目标检测是三个重要的任务&#xff0c;当然目标跟踪、图像生成也是新的方向和延伸。 其实下面这幅图已经非…

A. Two Semiknights Meet

题目描述 可知走法为中国象棋中的象的走法 解题思路 利用结构体来存储两个 K K K的位置 x , y x,y x,y&#xff0c;因为两个 K K K同时走&#xff0c;所以会出现两种情况 相向而行&#xff0c;两者距离减少 相反而行&#xff0c;两者距离不变 我们完全可以不考虑格子是好…

记一次从Redis弱口令到RCE

Fscan扫描网段发现了一些开启了6379的服务器&#xff0c;逐个尝试了下未授权&#xff0c;然后尝试了下爆破 hydra爆破redis hydra -P [字典目录] redis://xxx.xxx.xxx.xxx结果还真让爆出来一个 得到密码后&#xff0c;连接上去&#xff0c;这里用的是Another Redis Desktop M…

polar si9000使用---1

1、软件界面 2、表面单端信号 表层单端走线&#xff1a;1、走线表面未覆盖绿油&#xff1b;2、参考表面为完整的地平面&#xff1b;3、走线同层不进行铺铜操作&#xff0c;或者同层铺铜的距离大于参考地到走线距离H1&#xff1b; 表层单端走线&#xff1a;1、走线表面覆盖绿油…

【自适应稀疏度量方法和RQAM】疏度测量、RQAM特征、AWSPT和基于AWSPT的稀疏度测量研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

wps 画项目进度甘特图

效果如上 步骤一&#xff1a; 创建excel 表格 步骤二&#xff1a; 选中开始时间和结束时间两列数据&#xff0c;右键设置单元格格式 步骤三&#xff1a; 选择数值&#xff0c;点击确定&#xff0c;将日期转成数值。 步骤四&#xff1a;插入图表 选中任务&#xff0c;开始时间…

什么是程序化交易接口?执行三步曲是什么?

在股市中的发展过程中&#xff0c;通过不断的更新迭代&#xff0c;从手动交易到自动交易的过程就有了历史的蜕变&#xff0c;那么对于程序化交易接口&#xff08;Application Programming Interface, API&#xff09;其实就是指为程序化交易提供的一组定义和规范&#xff0c;允…

【BASH】回顾与知识点梳理(三十九)

【BASH】回顾与知识点梳理 三十九 三十九. make、tarball、函数库及软件校验39.1 用 make 进行宏编译为什么要用 makemakefile 的基本语法与变量 39.2 Tarball 的管理与建议使用原始码管理软件所需要的基础软件Tarball 安装的基本步骤一般 Tarball 软件安装的建议事项 (如何移除…

概率和统计,最大似然估计(MLE),大后验概率估计(MAP)

目录 1、概率和统计是一个东西吗&#xff1f; 2、贝叶斯公式到底在说什么&#xff1f; 3、似然函数 4、最大似然估计&#xff08;MLE&#xff09; 5、最大后验概率估计&#xff08;MAP&#xff09; MLE VS MAP 总结 贝叶斯公式分成两派&#xff1a;唯物主义的频率学派&a…

变频器和plc之间无线MODBUS通讯

在工业现场由PLC远程控制变频器的应用非常常见&#xff0c;如果挖沟布线不便或者变频器在移动设备上&#xff0c;那么采用无线通讯就是最佳方案。 这里我们选用最常用的三菱 FX2N PLC和三菱变频器为例&#xff0c;并结合日系plc专用无线通讯终端DTD435M来说明PLC与变频器之间的…

LeetCode 0849. 到最近的人的最大距离

【LetMeFly】849.到最近的人的最大距离 力扣题目链接&#xff1a;https://leetcode.cn/problems/maximize-distance-to-closest-person/ 给你一个数组 seats 表示一排座位&#xff0c;其中 seats[i] 1 代表有人坐在第 i 个座位上&#xff0c;seats[i] 0 代表座位 i 上是空的…

Consistency Models终结扩散模型

最近看到一篇论文&#xff0c;觉得特别有意思&#xff0c;并且在学术界引起了不小的动静&#xff0c;他就是一致性模型&#xff0c;据说图像生成效果快、质量高&#xff0c;并且还可以实现零样本图像编辑&#xff0c;即不进行一些视觉任务训练&#xff0c;可以实现图像超分、修…

MySQL的select ... where ...会加锁吗?

先说答案&#xff1a;不会。但select … where … lock in share mode会加锁。实验如下。 存储引擎innodb&#xff0c;MySQL版本5.7。 1&#xff1a;select … where … 如下图&#xff1a; 1&#xff1a;select … where … lock in share mode 如下图&#xff1a; 接着我…

sed替换命令

用sed编辑流时&#xff0c;最强大的命令莫过于它的替换命令。它有许多参数选项&#xff0c;可以完成诸多复杂的工作。 1. 替换命令的语法 sed [address-range|pattern-range] s/original-string /replacement-string/[substitute-flags] inputfile 注意&#xff0c;上面的换…