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

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

3天内不再提示

代码覆盖检测

嵌入式大杂烩 2023-05-12 22:26 次阅读

1 代码覆盖率概述

覆盖率(code coverage rate)是反映测试用例对被测软件覆盖程度的重要指标,也是衡量测试工作进展情况的重要指标。在代码逻辑比较复杂的情况下,测试工作往往只能覆盖到显而易见的逻辑分支,而更多的深层次的逻辑分支则不容易被测试人员发现。为了保证测试的覆盖率,有些开发人员会尝试协助测试人员写出所有的测试用例,这不仅会牺牲大量的宝贵的开发时间,同时也拥有一定的难度,最重要原因就是因为测试难以量化。而代码覆盖工具就是用来量化代码测试的覆盖率,让测试人员可以直观的发现那些没有覆盖到的代码分支。

代码覆盖率是评价单元测试的效果的一个重要指标。在实际的工作中,通常使用代码覆盖率来评价单元测试的效果。

代码覆盖率可以由语句覆盖率和分析分析率两个方面来进行评估。

  • 语句覆盖率是指在测试过程中实际得到执行的语句数和代码总语句数之间的比值。比如总共有 100 条语句,在测试过程中有 80 条语句得到执行,那么语句覆盖率就是 80%。
  • 分支覆盖率是指在程序的控制流图中实际得到执行的分支数和总分支数据之间的比值。例比如总共有 100 个分支,在测试过程中实际有 80 个分支得到执行,那么分支覆盖率就是 80%。 可以简单的理解为控制流图中每一条线性无关路径即为一个分支。

2 Windows 下覆盖率分析工具

OpenCppCoverage是Windows平台下开源的C++代码覆盖率工具,使用简单,功能齐全而强大。

使用起来非常简单,它不需要在编译时插桩,只需要有pdb文件,运行时插桩,通过OpenCppCoverage启动进程即可。功能也比较全,主要特点有:

  • 不需要重新编译被测程序,只需要使用penCppCoverage运行程序
  • 性能开销比较小
  • 按模块、代码路径过滤
  • 自动生成html覆盖率结果报告
  • 支持多个覆盖率结果合并
  • 集成Jenkins

OpenCppCoverage 是与Visual Studio 配合使用的一个代码覆盖率分析工具,当测试程序使用Visual Studio编译时,就可以使用这个工具进行代码覆盖率分析,为了能够进行分析,应用程序必须编译为Debug版本。

源码地址:https://github.com/OpenCppCoverage/OpenCppCoverage

OpenCppCoverage可以单独下载安装,也可以作为插件在VisualStudio的进行安装。这里以单独下载安装为例。

2.1 OpenCppCoverage单独安装与使用

2.1.1 下载安装

OpenCppCoverage下载地址:https://github.com/OpenCppCoverage/OpenCppCoverage/releases

1683896507401mx2z6w8lvu

根据自身环境选择x86或者x64版本进行安装。

安装过程比较简单,只需要注意一点:勾选将运行目录添加到环境变量中(默认也是勾选)。

1683896508063b7a9mifmji

2.1.2 使用

OpenCppCoverage最简单的运行格式为:

OpenCppCoverage.exe --sources MySourcePath* -- YourProgram.exe arg1 arg2

以如下的TestOpenCppCoverage工程为例,工程由utils.c、utils.h和main.c组成。

工程的代码目录为:

C:\\Users\\ouxiaolong\\Desktop\\TestOpenCppCoverage\\TestOpenCppCoverage\\src

工程的输出程序为:

C:\\Users\\ouxiaolong\\Desktop\\TestOpenCppCoverage\\Debug\\TestOpenCppCoverage.exe

运行CMD,运行命令:

OpenCppCoverage --sources C:\\Users\\ouxiaolong\\Desktop\\TestOpenCppCoverage\\TestOpenCppCoverage\\src -- C:\\Users\\ouxiaolong\\Desktop\\TestOpenCppCoverage\\Debug\\TestOpenCppCoverage.exe

1683896508403ngwots5qcm

输出信息说明,生成的html文件(index.html)位于:

C:\\Users\\ouxiaolong\\Desktop\\TestOpenCppCoverage\\CoverageReport-2022-12-09-11h47m10s。

1683896508807faddxf62ai

单击C:\\Users\\ouxiaolong\\Desktop\\TestOpenCppCoverage\\Debug\\TestOpenCppCoverage.exe即可对文件进一步分析。

1683896509198dzk6adil4b

绿色部分表示已覆盖到的部分,红色部分表示未覆盖的部分。

2.2 作为Visual Studio插件

2.2.1 插件安装

打开VisualStudio --> 工具 --> 扩展和更新 --> 联机 --> 右上角输入OpenCppCoverage,在下面的结果会出现“OpenCppCoverage Plugin”点击安装即可(安装中需要将VisualStudio重启)。

1683896509563b31tru3jws

2.2.2 使用

程序写好,编译执行之后,点击“工具 --> Run OpenCppCoverage”,程序运行。

1683896509866syvc1f67oj

将命令行窗口关掉,则代码会出现红色或者绿色的阴影,下面会出现Coverage的报告,如下图。

168389651018419dwkszx7f

3 Linux下覆盖率分析工具

3.1 Lcov简介

gcov是一个测试代码覆盖率的程序,正确地使用它搭配 gcc 可以分析、帮助你将代码写得更高效。帮助你优化程序。类似于一个profiling tool,使用 gcov 或者 gprof,可以收集到一些基础的性能统计数据。比如:

  • 每一行代码执行的频度
  • 每个代码文件中实际被执行到的行数
  • 每一个代码块执行使用的时间

gcov创建一个logfile叫做 源文件名称.gcxx (这里的源文件名称指的是.c或者.cc文件的文件名),表示的是这个 源文件.c 中每一行所被执行的次数。这些文件可以配合gprof使用。

gcov要工作只能用gcc编译这些代码。和其他的profiling 或者 测试代码覆盖率的机制不兼容。

fprofile-arcs参数使gcc创建一个程序的流图,之后找到适合图的生成树。只有不在生成树中的弧被操纵(instrumented):gcc添加了代码来清点这些弧执行的次数。当这段弧是一个块的唯一出口或入口时,操纵工具代码(instrumentation code)将会添加到块中,否则创建一个基础块来包含操纵工具代码。

Lcov是GCC覆盖率测试工具gcov的前端图形工具。它通过收集多个源文件的 行、函数和分支的代码覆盖信息并且将收集后的信息生成HTML页面。生成HTML需要使用genhtml命令。

3.2 Lcov安装

在Linux 中安装 lcov 非常简单,只要使用如下命令即可完成 lcov 的安装。

$ sudo apt-get install lcov

安装完成后,后续就可以使用 lcov 生成代码覆盖率报告。

3.3 Lcov使用

Step1 : 使用 GCC 以 -fprofile-arcs 和-ftest-coverage 选项编译程序。

$ gcc -fprofile-arcs -ftest-coverage -o test test.c

则会在当前目录下生成test.gcno和test.gcda文件

注:一般情况,gcda和gcno会在同一个目录,假如在编译机器上面是test/path,编译的时候会在这个目录下生成*.gcno文件,那么在执行机器上也会生成*.gcda文件在test/path目录下。如果要使用lcov统计覆盖率,必须将gcno和gcda放在同一个目录,并且有源代码,且源代码的目录和编译时的目录一样,否则不能生成。

Step2: 运行程序

$ ./test

Step3: 然后该目录下执行lcov

$ lcov --directory . --capture --output-file app.info

其中:

--directory 或者-d 表示的是目录,也就是gcno和gcda目录

--capture 或者 -c 表示获取覆盖率信息

--output-file 或者 -o 表示输出文件

Step4: 获取 HTML 输出

生成 html 格式的报告比较简单, 只要在 coverage 目录下使用以下的命令就可以生成html 格式的报告。

$ genhtml -o results app.info

results是一个目录,index.html为导航文件,使用 web 浏览器打开 index.html 文件查看代码覆盖结果。

1683896510542nhotq0tepp

也可查看更加详细的信息。

1683896511139aq74zu3cct

如要查看某个文件具体的信息,点击对应的文件名即可,打开的文件详细信息页面。

1683896511459roduv58jwt

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

    关注

    3

    文章

    3545

    浏览量

    88690
  • 代码
    +关注

    关注

    30

    文章

    4788

    浏览量

    68607
收藏 人收藏

    评论

    相关推荐

    一文详解Modelsim代码覆盖率功能使用

    作者:默宸  Modelsim代码覆盖率功能Code coverage,能报告出statement(语句)、branch(分支)、condition(条件)、expression(表达
    的头像 发表于 12-09 11:45 5829次阅读

    代码覆盖分析过程包含哪些方面?

    代码覆盖分析过程包含哪些方面覆盖分析在嵌入式系统上的问题BullseyeCoverage的实现方式嵌入式操作系统Nucleus的具体应用
    发表于 04-26 06:16

    Verilog代码覆盖率检查

    Verilog代码覆盖率检查是检查验证工作是否完全的重要方法,代码覆盖率(codecoverge)可以指示Verilog代码描述的功能有多少
    发表于 04-29 12:35 8430次阅读

    Linux的内核级代码复用攻击检测

    近年来,代码复用攻击与防御成为安全领域研究的热点.内核级代码复用攻击使用内核自身代码绕过传统的防御机制.现有的代码复用攻击检测与防御方法多面
    发表于 12-27 15:14 0次下载

    基于Voronoi图的覆盖空洞检测算法

    针对无线传感器网络(WSN)中节点随机部署或部分节点能量耗尽带来的覆盖空洞(CH)问题,提出了一种基于Voronoi图的覆盖空洞检测算法。该算法利用节点的位置信息在覆盖区域范围内构建V
    发表于 01-14 15:29 0次下载
    基于Voronoi图的<b class='flag-5'>覆盖</b>空洞<b class='flag-5'>检测</b>算法

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

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

    嵌入式代码覆盖率如何进行统计有哪些方法和经验

    代码覆盖率是衡量软件测试完成情况的指标,通常基于测试过程中已检查的程序源代码比例 计算得出。代码覆盖率可以有效避免包含未测试
    的头像 发表于 01-09 11:12 3079次阅读
    嵌入式<b class='flag-5'>代码</b><b class='flag-5'>覆盖</b>率如何进行统计有哪些方法和经验

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

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

    MPLAB代码覆盖用户指南

    MPLAB代码覆盖用户指南资料免费下载。
    发表于 04-29 10:25 13次下载

    覆盖率的Verilog代码的编写技巧

    设计工程师需要关心的主要有行覆盖率(Block),条件覆盖率(Expression),翻转覆盖率(Toggle),状态机覆盖率。本文从ASIC设计的角度上来讨论,如何写出高
    的头像 发表于 05-26 17:30 4281次阅读

    代码覆盖工具的重要性

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

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

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

    代码覆盖率工具的重要性

    测试覆盖率是软件质量的重要指标,也是软件维护的重要组成部分。它通过提供不同承保项目的数据来帮助评估测试的有效性。这种洞察力允许通过为未经测试的代码定义新的测试用例来改进测试,从而提高代码质量,最终增加
    的头像 发表于 12-08 15:13 1466次阅读
    <b class='flag-5'>代码</b><b class='flag-5'>覆盖</b>率工具的重要性

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

    本篇我们介绍分支覆盖,从测试技术对代码的测试程度上来说,在复杂代码中,分支覆盖比语句覆盖效果要好。
    的头像 发表于 09-01 11:34 675次阅读
    软件<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>率记录