利用代码覆盖率提高嵌入式软件的可靠性

常见的嵌入式软件白盒测试工具 本文介绍了几种常见的嵌入式软件白盒测试工具,包括单元测试工具Unity、代码覆盖率工具gcov和静态代码分析工具Cppcheck,并提供了相应的源代码示例。通过使用这些工具,开发人员可以更好地测试和验证嵌入式软件的功能,减少潜在的错误和缺陷。gcov是一个常用的代码覆盖率工具,它可以生成详细的代码覆盖率报告,帮助开发人员了解测试用例的覆盖程度。实际使用这些工具时,您需要根据自己的项目和需求进行适当的配置和调整。另外,还有其他许多嵌入式软件白盒测试工具可供选择,您可以根据自己的需求进行进一步的研究和评估。 阅读详情

简介
代码覆盖率是衡量软件测试完成情况的指标,通常基于测试过程中已检查的程序源代码比例 计算得出。代码覆盖率可以有效避免包含未测试代码的程序被发布。
代码覆盖率能不能提高软件的可靠性?答案是肯定的,代码的覆盖率分析是保证软件质量最简 便易行的方法。

代码覆盖率等级
代码覆盖率可以通过多种方法测量。最常用的是测量以下一个或多个指标:语句覆盖率,分支 覆盖率,修订的条件/判定覆盖率(MC/DC)。以下章节中将逐一详解这些代码覆盖率。
 
语句覆盖率
语句覆盖率用来度量被测代码中的可执行语句是否被执行到,它并不考虑循环或者条件语句, 只针对语句度量可执行代码。应当特别注意的是:“语句”并不等同于代码行。
一般情况下,对于  C,C++,Java或Ada,分号代表语句结束。在某些情况下,一条语句会跨越多 行代码。语句覆盖率可以有效度量可执行代码是否被执行,但同时也有一定的局限性。

语句覆盖率的局限
考虑如下图1的代码段: 

int* p = NULL;
if (condition)
p = &variable;
*p = 123;
图  1 –  语句覆盖局限代码示例

如果“condition”为true,那么就有可能达到100%的语句覆盖,然而这个测试用例忽略了另 一种情况:如果“condition”为假,程序将引用空指针,因此,虽然语句覆盖率是一个很好 的度量指标,它仍旧是入门级的代码覆盖率。理想情况下,即使“condition”为false,测试 用例也应当被计算。

分支覆盖率

分支覆盖率用来度量程序中所有的判定和分支以及相应的输出是否都被测试执行到,例如 “if”语句必须将“true”和“false”都考虑到以覆盖所有的输出。如果只有一个路径被执行,那么覆盖率将被标记为部分执行。
 
和语句覆盖率类似,分支覆盖浪费也有一些需要注意的细节,尤其在针对“惰性求值”的编程语言时,惰性求值是将代码的求值操作延迟到需要结果值时再进行的一项技术。

分支覆盖率的局限
典型的情况是当有复杂的布尔表达式的“惰性求值”出现时,如下图2的代码片段:
 
int* p = NULL;
if (condition1 && (condition2 || function1(*p)))
statement1;
else
图  2 –  分支覆盖率局限代码示例

考虑“condition1”为假的情况,惰性求值将不会度量“condition2”或,此种情况同样会导致 代码“if (condition1 && (condition2 || function1(*p)))”的分支覆盖率计算错误。
 
继续考虑“condition1”和“condition2”都为真的情况。惰性求值将再次导致“function1(*p)” 不会被度量,也同样会导致代码“if (condition1 && (condition2 || function1(*p)))”的分支覆盖率 计算错误。在此种情况下,有可能出现分支覆盖率为100%但软件中仍有潜在缺陷的情况。

修订条件/判定覆盖率(MC/DC)
MC/DC是一种特殊的分支覆盖率,它不但会使用分支覆盖率报告复杂条件下的true和false输出,同时也会报告复杂条件下的全部分支条件输出。
 
MC/DC最初由波音公司创建,用于航空软件中DO-178B的A级认证。通过对所有的子条件输出分支的独立证明,有效解决了惰性求值带来的问题。
 
继续讨论代码示例2,我们需要在“condition2”和“function1(*p)”固定的条件下验证“condition1” 的“true”和“false”判定分支,之后继续固定“condition1”和“function1(*p)”验证“condition2” 的判定分支。
 
同样的,让我们在固定“condition1”和“condition2”的条件下讨论  “function1(*p)”。在其他分支条件固定的情况下验证某个分支条件的“true”和“false”值称作“MC/DC对”。MC/DC对一般使用MC/DC真值表描述。表1就是一个MC/DC真值表示例。



 
在软件开发的不同阶段获取覆盖率
软件测试有很多种类,本文将其简要的分为三类:
> 系统/函数测试:  测试集成后的整个应用
> 集成测试::测试集成的子系统
> 单元测试:测试一个或多个文件或类
 
每个软件项目在系统测试的过程中都会模拟最终用户的操作对源代码做一些系统测试。导致软件发布后仍旧存在缺陷最重要的一个原因通常是程序在运行过程中遇到了非预期的,即没有测试的输入组合。
 
很多软件项目并不是没有做集成测试或者单元测试。只是在完成集成测试或单元测试后,开发团队可能苦于为隔离程序中的单个或多个文必须所需的大量测试代码量。
 
对于最严格的单元测试和集成测试来说,最终生成的测试代码量比待测代码量还要庞大是很经常出现的情况。因此,这两种级别的测试普遍适用于关键和高安全领域,例如:航空航天、医疗、交通运输、工业过程控制、高速汽车等。此类软件中包含大量的嵌入式应用软件。
 
关键领域的结构化测试流程一般会将需求的级别高低作为重点,代码覆盖率因而会在这种“基于需求”的测试中进行分析。在许多项目中,高等级的需求最先被测试。此时代码覆盖率可以被用来检测和报告所达到的覆盖比例。
 
然而不幸的是,在系统测试和功能测试阶段想要达到100%的代码覆盖率几乎是不可能的。通常情况下系统测试和功能测试只能达到60%-70%的代码覆盖率,剩余30%-40%的代码覆盖率需要在单元测试和集成测试阶段才能够完成。
 
单元测试使用包含驱动和桩的测试代码隔离系统中的特定函数,同时使用测试用例模拟这些函数的执行。这些所谓的“低等级测试需求”  对被测试代码提供了更高的控制,可以提高先前执行的系统测试覆盖率(甚至能达到100%)。因此,在不同的测试之间共享覆盖率数据是非常有必要的。

 嵌入式环境中获取覆盖率带来的挑战
常言道“有得必有失”,在嵌入式环境获取代码覆盖率的问题上,要付出的代价是对待测代码额外的插桩工作。
插桩是将额外的代码添加到程序中,从而实现测试过程中的覆盖率收集和分析操作。
由于插桩的相关操作将导致程序源代码增多,进而延长程序的执行时间,因而需要预测插桩后的源代码的覆盖范围预测,尤其当测试实时嵌入式系统环境时,此项工作就更为重要。
事实上,要精准的预测程序文件插桩的影响几乎是不可能的。没有算法支持(也不可能有)。 每个系统都包含很多的变量,具有独立唯一的复杂性。当然,对于典型的示例系统来说,获取一组准确的估计还是可能实现的。

在共享环境中获取覆盖率数据
在嵌入式环境下管理代码覆盖率的主要问题在于如何配置内存以容纳额外的插桩代码。
VectorCAST针对大量示例代码评估后发现添加了上文中提出的各种覆盖率额外配置之后,源代码量增长量普遍达到了10%。对于绝大多数的32位目标板,这并不是一个很大的问题,但对于存储容量有限的8位或者16位目标板来说,几乎可以肯定这会是一个问题。 

为了降低可执行文件的大小,各种各样的代码插桩技术被发明出来,针对不同大小的存储区域有不同的数据采集技术。植入存储器内部的收集系统可以用于监测被检测到的代码。这是插桩技术中保证使用最少RAM的关键技术。


代码覆盖率驱动的测试 代码覆盖率驱动的测试.pdf,官方详细介绍代码覆盖率驱动的测试经典文档 立即下载

相关推荐

嵌入式系统的稳定性

如何从硬件、软件的角度对系统进行设计,提高系统的稳定性

利用代码覆盖率提高嵌入式软件的可靠性 - VectorCAST

简介 代码覆盖率是衡量软件测试完成情况的指标,通常基于测试过程中已检查的程序源代码比例 计算得出。代码覆盖率可以有效避免包含未测试代码的程序被发布。 代码覆盖率能不能提高软件的可靠性?答案是肯定的,代码的覆盖率分析是保证软件质量最简 便易行的方法。 代码覆盖率等级 代码覆盖率可以通过多种方法测量。最常用的是测量以下一个或多个指标:语句覆盖率,分支 覆盖率,修订的条件/判定覆盖率(MC/DC)。以下...

weixin_33971130的博客 333

BEV感知技术全景解析:从纯视觉到多传感器融合的实战指南

本文全面解析了自动驾驶中的BEV感知技术,从纯视觉到多传感器融合的实战应用。文章深入探讨了BEV如何提供“上帝视角”,对比了IPM、Lift-Splat-Shoot及Transformer等核心实现范式,并详细阐述了多传感器融合(尤其是中融合)的工程实践与优势,为开发者提供了从理论到原型搭建的完整指南。

win55的博客 1140

代码覆盖率分析 - VectorCAST/CBA

转载自:博主——Trinitytec;网址:https://blog.youkuaiyun.com/trinity_techologies/article/details/73188078 一.用途 (1)通过分析来提高代码覆盖率   利用VectorCAST/CBA,用户可以标记出经过分析覆盖的代码。这样,高安全行业的开发工程师就能够通过覆盖率分析来提高测试所达到的覆盖率了,使覆盖率按照规定达到100%。...

软件领域 3545

STM32 RC522串口驱动程序 (简单直接)

rc522作为使用非常多的读写卡芯片,使用SPI芯片读写应用已经非常广了。但有些时候我们只有串口可以使用,或者我们觉得串口使用更加方便,那么就必须要编写串口的驱动程序。不过很难找到可以直接使用的串口程序。所以在此将我这边写好的串口驱动写好如下: 直接上代码 下面是RC522.C的驱动文件。支持读写卡号8位数据。rc522用的是stm32 的串口3,调试显示是串口1; #include "rc522.h" #include "delay.h" /////////////////////////////////

qq_42074368的博客 9001

解决linux 2.5G网卡驱动问题

解决linux 2.5G网卡驱动问题 关键词:2.5G网卡驱动,ubuntu,安装,2.5G Ethernet LINUX driver,Realtek网卡驱动 由于2.5G网卡较新,各linux发行版的通用驱动已不适用,新装的系统会出现无法上网问题,由于国内网络环境去Realtek官网很难下载到驱动文件,故本文提供github上的2.5G Ethernet LINUX driver r8125 for kernel up to 5.6的版本驱动文件r8125-9.003.05.tar.bz2各位可以自

poorguy_aos的博客 1万+

VectorCAST对外部函数打桩和查看覆盖率

如果要对外部函数打桩,在界面找到<<SBF>>并展开,找到需要打桩的外部函数,勾选前面的复选框, 即对函数打桩,实际调用外部函数时会执行桩函数而不是原本的函数。对于一个外部函数,如果在添加到环境的文件没有函数的定义,会自动为此外部函数打桩,如果在添 加到环境的文件中有函数的定义,可选对此函数打桩或不打桩。测试用例执行完成后,会生成一份执行报告,这份报告包含的内容是执行结果,执行路径,实际值与 期望值的对比。每个执行过的测试用例前面都有一个复选框,复选框被勾选上,才能看到对应测试用例的覆盖率。

嵌入式之斋 2862

【军标】《军用软件计价规范(试行)》和GJB 10162-2021《军用软件计价功能项识别方法》-费用标准解读系列37

2021年2月1日实施的《军用软件计价规范(试行)》(替代了2019年版本)以及2021年3月1日实施的《军用软件计价功能项识别方法》(GJB 10162-2021),是我们平时在军用软件造价咨询中进行软件规模度量、计价和审价的主要依据。《军用软件计价规范(试行)》(4号文)的附件1为《军用软件功能规模度量方法》,即4号文本身包含对软件规模测试的方法(功能点方法主要参考NESMA等国际标准)、规模度量过程、功能点计数和计算规则等相关说明。(四)软件研发费用=软件研发工作量x软件研发人月综合费率。

xiaosenyouli的博客 6123

【嵌入式】gcov/lcov/gcovr代码覆盖率交叉编译使用解析

gcov是一个测试代码覆盖率的程序,正确地使用它搭配GCC可以分析、帮助你将代码写得更高效。帮助你优化程序。类似于一个profiling tool,使用gcov或者gprof,可以收集到一些基础的性能统计数据。每一行代码执行的频度每个代码文件中实际被执行到的行数每一个代码块执行使用的时间gcov创建一个logfile叫做 源文件名称.gcxx (这里的源文件名称指的是.c或者.cc文件的文件名),表示的是这个 源文件.c 中每一行所被执行的次数。这些文件可以配合gprof使用。

heroybc的博客 8857

鸿蒙5应用真机调试超详细教程

本文详细介绍了鸿蒙5应用的真机调试全流程,包括开发环境搭建(安装DevEcoStudio、配置SDK)、真机调试准备(开启USB调试、配置自动/手动签名)、调试实战(生成HAP包、断点调试技巧)以及多设备协同调试方法。文中提供了设备连接、签名配置等常见问题的解决方案,并包含示例代码展示分布式设备联动功能。通过本教程,开发者可快速掌握鸿蒙5应用的调试技能,建议结合官方文档深入学习高级调试技巧。

2301_79392153的博客 2196

Win11+Ubuntu18.04+Ubuntu20.04三系统安装与卸载

以下情况均为个人情况:1.插入启动 U 盘后,登录时可以按F12(拯救者Y7000,不同电脑不同)进入BIOS,选择从启动盘启动。2.。3.5.在win基础上,安装第一个Ubuntu系统后,系统启动界面类似如下第一张图,Ubuntu不显示版本号。安装第二个Ubuntu系统后,系统启动界面如下第二张图,如果想更改启动项的名称,可自行查阅相关资料。

weixin_61686291的博客 2539

Gcov,lcov测试嵌入式平台的代码覆盖率

嵌入式平台上测试代码覆盖率

W546556的博客 2132

脉冲变压器电感选型参数,结构原理,工艺与注意问题总结

脉冲变压器电感简称脉冲变压器,是一种特殊类型的变压器,主要用于处理脉冲信号。它的主要特性是能够在短时间内承受高电压和大电流。脉冲变压器主要用于开关电源、脉冲功率放大、雷达脉冲调制等领域。本文对脉冲变压器的工作原理,结构特点,工艺流程,选型参数及设计注意事项进行总结。

fydar的博客 1344

arm的代码量大_高手总结:利用代码覆盖率提高嵌入式软件可靠性

代码覆盖率是衡量软件测试完成情况的指标,通常基于测试过程中已检查的程序源代码比例计算得出。代码覆盖率可以有效避免包含未测试代码的程序被发布。代码覆盖率能不能提高软件的可靠性?答案是肯定的,代码的覆盖率分析是保证软件质量最简便易行的方法。代码覆盖率等级代码覆盖率可以通过多种方法测量。最常用的是测量以下一个或多个指标:语句覆盖率,分支 覆盖率,修订的条件/判定覆盖率(MC/DC)。以下章节中...

weixin_39738273的博客 395

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Zephyr RTOS代码覆盖率测试完整指南:提高嵌入式软件质量

Zephyr RTOS作为新一代可扩展、优化的安全实时操作系统,为嵌入式开发提供了强大的测试框架支持,其中代码覆盖率测试是确保软件质量的关键技术。通过GCOV工具集成,Zephyr能够帮助开发者精确测量测试用例对代码的覆盖程度,显著提升嵌入式软件的可靠性和稳定性。🚀 ## 什么是Zephyr代码覆盖率测试? Zephyr RTOS内置了GCOV(GNU Coverage)工具支持,通过配置C

gitblog_00175的博客 433

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

嵌入式软件测试的十大方法

在嵌入式软件开发过程中,一般来说,花在测试和花在编码的 时间比为3:1(实际上可能更多)。这个比例随着你的编程和测试水平的提高而不断下降,但不论怎样,软件测试对一般人来讲很重要。很多年前,一位开发人员为了在对嵌入式有更深层次的理解,向Oracle询问了这样的一个问题:我怎么才能知道并懂得我的系统到底在干些什么呢?  Oracle面对这个问题有些吃惊,因为在当时没有人这么问过,而同时代的嵌入式开发人

彼岸花 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

100%的代码覆盖率指标为何同事就能轻松达到?原来他是用了这个工具!

软件测试是软件开发的组成部分。开发和执行代码的每个行业都可以从使用结构化代码覆盖率测试工具中受益。这些工具在安全性至关重要的应用程序的嵌入式开发行业中特别有用,因为在这些应用程序中,软件系统不会发生故障,否则将会丧生。Parasoft C/C++test2020.2附带了Coverage Advisor,可帮助用户创建难以确定且耗时的难以理解的测试用例。 代码覆盖率是重要的必要条件 在嵌入式安全性和安全性至关重要的系统中获得100%的代码覆盖率指标可以达到多种目的。主要目的是符合DO-178...

Pokemogo的博客 1066

嵌入式软件常用测试工具

以上测试工具和方法在嵌入式软件测试中各有侧重,结合使用可以更有效地提高嵌入式软件的质量和可靠性。

了不起的小白君的博客 1818

关于嵌入式软件系统测试策略和方案设计详解

嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,是专为应用系统量身打造、是对功能、可靠性、成本、体积、功耗有严格要求的专用的计算机系统。嵌入式系统一般指非PC类标配系统,它也包括硬件和软件两部分。硬件包括处理器微处理器、存储器及外设器件和I/O端口、图形控制器等。软件部分包括操作系统软件(OS)(要求实时和多任务操作)和应用程序。有时设计人员把这两种软件组合在一起。应用程序控制着系统的运作和行为,而操作系统控制着应用程序编程与硬件的交互作用。嵌入式设计已经成为工业现代化、智能。

wangchen900705的博客 1047

嵌入式软件调试技巧有哪些?

关注、星标公众号,直达精彩内容来源:网络素材整理:技术让梦想更伟大 | 李肖遥在嵌入式软件开发过程中,一般来说,花在测试比花在编码的时间要多很多,通常为3:1(甚至更多)。这个比例随着你的编程和测试水平的提高而不断下降,但不论怎样,软件测试对一般人来讲很重要。很多年前,一位开发人员为了在对嵌入式有更深层次的理解,询问了这样的一个问题:我怎么才能知道并懂得我的系统到底在干些什么呢?面对这个问...

李肖遥的专栏 675

嵌入式软件架构测试的特点、方法与实践

摘要:本文探讨了嵌入式软件架构测试的独特性与方法。嵌入式系统具有资源受限、实时性高、硬件相关性强等特点,使得其软件架构测试面临特殊挑战。文章详细介绍了适用于嵌入式系统的单元测试、集成测试和系统测试方法,强调需结合硬件环境设计测试用例。通过具体工业控制系统的测试实践案例,展示了如何解决测试过程中遇到的资源限制、实时性验证等问题。实践表明,合理运用分层测试策略与专用测试工具,能有效提升嵌入式软件架构的可靠性与性能。 关键词:嵌入式系统;软件架构测试;实时性测试;测试方法;工业控制系统

youngerwang的博客 566

嵌入式软件测试10条秘诀

嵌入式调试也是一门艺术。就想其它的艺术一样,如果你想取得成功,你必须具备智慧、经验并懂得使用工具。只要我们能够很好地领悟Oracle这十条秘诀,我相信我们在嵌入式测试方面就能够取得成功。

m0_75277660的博客 605

构建稳健的嵌入式软件的五个基本技巧和窍门

我所见过的几乎所有程序员都希望编写出坚如磐石的软件。如果你的工作是编写软件,你当然是希望软件能够正常运行。我从未见过有人在项目开始时说:“让我们编写人类已知的最糟糕的、紧密耦合的、有缺陷的、昂贵的代码吧。”(当然,“我们都希望写出优秀的代码,使我们的产品能够无缝运行,并获得大众的称赞,或者至少是我们老板的称赞。不幸的是,编写嵌入式软件经常会陷入错误、或其他爬行动物的泥潭。因此,让我们来打破这个僵局!

lyd0813的博客 350
上一篇: 通过静态分析和持续集成 保证代码的质量 (Helix QAC)2
下一篇: 为什么要对测试过程进行详细记录?
Trinitytec
博客等级 码龄11年 165粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值