使用GNU Gcov Lcov生成C++单元测试代码覆盖率报告

news2024/11/27 9:56:16

最近在统计C++项目代码的单元测试覆盖率

发现通过gcov和lcov就能将代码单元测试覆盖率定量化可视化

下面是基于gtest测试框架,对gcov和lcov生成覆盖率的简单示例

工作流程

主要有三个步骤

  • 向GCC编译添加特殊的编译选项以生成可执行文件和*.gcno

  • 运行(测试)生成的可执行文件,生成*.gcda数据文件

  • 使用*.gcno和*.gcda,从源代码生成gcov文件,最后生成代码覆盖率报告

效果展示

行覆盖率和函数覆盖率统计

统计到具体文件

简单实践

1. 安装gtest和lcov

# 1 安装gtest(也可以自己编译)
apt-get install libgtest-dev
# 2 gcov工具属于gcc内置,无需单独安装
# 3 安装lcov工具,数据格式转换
sudo apt install lcov

2. 编写一个程序

首先,编写一个简单的程序,实现功能为:求三个数字中最大的一个

main.cpp

#include<iostream>
using namespace std;
int GreatestOfThree(int a,int b,int c){
  if((a>b) && (a>c)){    //for a > b and a>c case
    return a;
   }
   else if(b>c){    //for b>c case 
    return b;
   }
  else{
    return c;
  }
 return 0;
}//After checking for correctness comment main function to test //main_test.cpp
int main()
{
 // your code goes here
 int a,b,c;
 cin>>a>>b>>c;
 cout<<GreatestOfThree(a,b,c);
 return 0;
}

然后编译程序

g++ -o main main.cpp

验证测试程序正常工作

$./main 1 2 3 
$ 3

程序输出了三个数中的最大一个

3. 编写测试用例

使用gtest编写测试用例

main_test.cpp

#include "gtest/gtest.h"
#include "main.cpp"

TEST(GreaterTest,AisGreater){
EXPECT_EQ(3,GreatestOfThree(3,1,2));};
TEST(GreaterTest,BisGreater){
EXPECT_EQ(3,GreatestOfThree(1,3,2));};
TEST(GreaterTest,CisGreater){
EXPECT_EQ(3,GreatestOfThree(1,2,3));};

int main(int argc,char**argv)
{
testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

这里我们为了简单起见,没有写头文件,直接将功能源文件包含进了测试用例文件中

4. 编译并执行

编译并生成一个可执行文件main

g++ -o main main_test.cpp

执行测试用例

./main
[==========] Running 3 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 3 tests from GreaterTest
[ RUN      ] GreaterTest.AisGreater
[       OK ] GreaterTest.AisGreater (0 ms)
[ RUN      ] GreaterTest.BisGreater
[       OK ] GreaterTest.BisGreater (0 ms)
[ RUN      ] GreaterTest.CisGreater
[       OK ] GreaterTest.CisGreater (0 ms)
[----------] 3 tests from GreaterTest (0 ms total)[----------] Global test environment tear-down
[==========] 3 tests from 1 test case ran. (0 ms total)
[  PASSED  ] 3 tests.

5. 生成代码覆盖率报告

这一步会使用gcov工具,这个工具一般gcc都自带了,无需安装

5.1 生成启用覆盖率的可执行文件

g++ -o main  -fprofile-arcs -ftest-coverage main_test.cpp

5.2 运行并生成报告所需文件

./main

这一步会生成两种类型的文件(用于创建覆盖率报告)

  • .gcno结尾,包含基本构造和行号信息,在g++编译时添加了-ftest覆盖率标志后生成

  • .gcda结尾,包含评测和覆盖率信息,这些信息是由g++命令中的-fprofile arcs标志而生成。

5.3 通过gcov生成报告

gcov main_test.cpp

这一步生成了main_test.cpp.gcov命名的报告,但是这个报告不好阅读

5.4 生成html版本的报告

首先,使用lcov生成行覆盖率报告

lcov --coverage --directory . --output-file main_coverage.info

lcov自动读取当前目录下的.gcno和.gcda文件创建覆盖率报告,并将生成具有覆盖率信息的输出到文件main_coverage.info

然后,将覆盖率报告转换成html格式

genhtml main_coverage.info --output-directory out

在out目录下生成html格式的报告

5.5 最后,查看报告

在浏览器中打开报告目录下的index.html文件检查覆盖率,主要是行覆盖率和函数覆盖率

至此,我们就获取到了源文件的测试覆盖率数据

一起学习,一起进步

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

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

相关文章

Vue3 生命周期函数及其与Vue2的对比总结

Vue3 继续保留了 Vue2 的生命周期钩子&#xff0c;但在 Composition API&#xff08;setup 函数&#xff09;中&#xff0c;它们被改为了一组导入函数。以下是它们的对比&#xff1a; Vue2 生命周期钩子和 Vue3 对应的生命周期函数&#xff1a; 在 Vue3 中&#xff0c;所有的…

TJA1145休眠唤醒调试

目录 项目场景:TJA1145引脚图问题描述SPI链路验证休眠唤醒休眠唤醒配置唤醒报文配置代码相关寄存器:模式寄存器使能CAN唤醒设置唤醒边沿检测事件状态及捕获寄存器CANFD报文不会被识别为有效的唤醒帧项目场景: 最近开发过程中,选择了这颗芯片,踩了很多坑,总算是把这个芯片…

【C语言】解决C语言报错:Undefined Reference

文章目录 简介什么是Undefined ReferenceUndefined Reference的常见原因如何检测和调试Undefined Reference解决Undefined Reference的最佳实践详细实例解析示例1&#xff1a;缺少函数定义示例2&#xff1a;函数声明和定义不匹配示例3&#xff1a;未链接必要的库示例4&#xff…

UWB技术定位系统源码,智慧工厂人员定位系统,独特的射频处理,配合先进的位置算法

UWB技术定位系统源码&#xff0c;高精度人员定位系统源码&#xff0c;智慧工厂人员定位系统源码&#xff0c;室内定位系统源码 本套系统运用UWB定位技术&#xff0c;开发的高精度人员定位系统&#xff0c;通过独特的射频处理&#xff0c;配合先进的位置算法&#xff0c;可以有…

人工智能在风险管理中的创新之路

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面&#xff0c;尤其在风险管理领域&#xff0c;其展现出的巨大潜力令人瞩目。风险管理&#xff0c;作为一个涉及广泛领域的复杂系统&#xff0c;正逐渐依赖于AI技术来提升效率和准…

Linux文件系统【真的很详细】

目录 一.认识磁盘 1.1磁盘的物理结构 1.2磁盘的存储结构 1.3磁盘的逻辑存储结构 二.理解文件系统 2.1如何管理磁盘 2.2如何在磁盘中找到文件 2.3关于文件名 哈喽&#xff0c;大家好。今天我们学习文件系统&#xff0c;我们之前在Linux基础IO中研究的是进程和被打开文件…

将Jar用三种方式生成Windows的安装程序

无论是WEB(spring boot)的JAR,还是JavaFX以及swing的Jar,要生成windows方式。 打包成Windows可执行文件&#xff08;.exe&#xff09;&#xff0c;你可以使用以下三种方法&#xff1a; ### 方法1&#xff1a;使用Inno Setup 1. **构建JavaFX应用程序**&#xff1a; 使用M…

自制一个Linux live固件镜像ISO可引导系统

使用母盘镜像制作两个虚拟&#xff0c;来制作一个包含基本需求的filesystem.squashfs文件&#xff0c;具体看下面的链接 使用的安装镜像 是Linux Mint 制作好的成品 https://cloud.189.cn/t/U32Mvi7FnyA3 &#xff08;访问码&#xff1a;2nbo&#xff09; 最简单制作LIVE CD…

ChatGPT魔法背后的原理:如何做到词语接龙式输出?

介绍 我们都知道 ChatGPT 是 AIGC 工具&#xff0c;其实就是生成式人工智能。大家有没有想过这些问题 &#x1f914;️&#xff1a; 1、我们输入一段话&#xff0c;就可以看见它*噼里啪啦的一顿输出*&#xff0c;那么它的原理到底是什么&#xff1f; 2、到底它是怎么锁定这些…

【Prometheus】Prometheus的k8s部署

Kubernetes 集群部署 Prometheus 和 Grafana //实验环境 控制节点/master01 192.168.67.30 工作节点/node01 192.168.67.12 工作节点/node02 192.168.67.13 //node-exporter 安装 #创建监控 namespace kubectl create ns monitor-sa #部署 nod…

Java—装饰器模式

介绍 装饰器模式 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你动态地将行为添加到现有的对象中&#xff0c;而无需修改其代码。装饰器模式提供了比继承更灵活的功能扩展方式。 主要角色 Component&#xff1a;定义一个对…

【数据的增值之路】全生命周期的数据演化过程

引言&#xff1a;随着云计算、大数据、人工智能、区块链等新一代信息技术的快速发展&#xff0c;数据已经成为推动经济增长的重要生产要素。数据量的爆炸式增长&#xff0c;为挖掘数据价值、推动数字经济发展提供了丰富的资源基础。重要概念解析&#xff1a; 数据经济&#xf…

[图解]建模相关的基础知识-09

1 00:00:01,350 --> 00:00:03,780 首先&#xff0c;我们来看一下什么叫关系 2 00:00:05,370 --> 00:00:08,990 这个关系跟下面说的这些关系 3 00:00:09,000 --> 00:00:10,390 它不是一个东西 4 00:00:11,110 --> 00:00:14,950 比如说&#xff0c;我们UML类图上&…

【因果推断python】36_断点回归2

目录 RDD 估计 内核加权 RDD 估计 RDD 依赖的关键假设是阈值处潜在结果的平滑性。用比较正式地表述来说&#xff0c;当运行变量从右侧和左侧接近阈值时&#xff0c;潜在结果的极限应该是相同的。 如果这是真的&#xff0c;我们可以在阈值处找到因果关系 从其本身意义来说&…

RocketMQ源码学习笔记:源码启动NameServer,Broker

这是本人学习的总结&#xff0c;主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、Overview2、NameServer2.1、源码启动NameServer 3、Broker启动过程 1、Overview 这篇文章的源码的版本是release-4.9.8。在启动各个模块之前应该先对项目进行打包mvn install -Dmaven.te…

大数据实训项目(小麦种子)-04、大数据实训项目JavaWeb环境搭建

文章目录 前言运行前准备工作1、安装Hadoop3.1.0配置winutils原因描述配置方式注意点&#xff08;hadoop.dll拷贝System32目录下&#xff09; 2、hive运行报错&#xff08;The dir: /tmp/hive on HDFS should be writable. &#xff09; 项目环境搭建参考资料 前言 博主介绍&a…

【类脑计算】突触可塑性模型之Hebbian学习规则和STDP

1 引言 突触可塑性 (Synaptic plasticity)指经验能够修改神经回路功能的能力。特指基于活动修改突触传递强度的能力&#xff0c;是大脑适应新信息的主要调查机制。分为短期和长期突触可塑性&#xff0c;分别作用于不同时间尺度&#xff0c;对感官刺激的短期适应和长期行为改变…

unity数独游戏

using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class MainMenuPanel : MonoBehaviour {public Button btnPlay; // 开始按钮public Slider sldDifficulty; // 难度滑动条private void Awake(){/…

省去烦恼!轻松实现一台电脑登录多个微信号的秘诀揭秘!

你知道如何在同一台电脑上登录多个微信号&#xff0c;并实现聚合聊天吗&#xff1f; 今天&#xff0c;我将分享一个多微管理神器——个微管理系统&#xff0c;帮助你解决这一问题&#xff01; 1、多号同时登录&#xff0c;聚合聊天 无论你有多少个微信号&#xff0c;都可以一…

畅想智能美颜工具的未来:美颜SDK技术详解

美颜SDK作为技术的核心&#xff0c;承载了美颜工具的实现和创新。本篇文章&#xff0c;小编将深入探讨美颜SDK技术的细节。 一、技术原理 美颜SDK是一种软件开发工具包&#xff0c;集成了一系列图像处理算法和技术&#xff0c;旨在实现对照片和视频中人物的实时美化。其主要技…