大型项目单元测试与代码覆盖率分析全流程指南(基于gtest、lcov及genhtml)

Gtest输出单元测试报告和输出覆盖率报告 gtest本身仅能输出xml或者json格式的测试报告,所以采用。编译工具:选择Cmake,单元测试使用Gtest。(2)CMake添加编译以及链接选项、库。(1)ubuntu环境直接安装lcov。地三方工具输出html的报告。环境:gtest已经可以使用。使用gcc的lcov。 阅读详情

使用 Google Test (gtest) 进行单元测试及生成测试报告的完整流程手册


1. 环境准备

1.1 安装依赖

  • gtest:Google 测试框架

    sudo apt-get install libgtest-dev  # Ubuntu/Debian
    # 或手动下载并编译
    cd /usr/src/gtest
    sudo cmake .
    sudo make
    sudo cp *.a /usr/lib
    
  • lcov:代码覆盖率工具

    sudo apt-get install lcov
    
  • CMake:构建系统管理

    sudo apt-get install cmake
    

1.2 项目结构示例

my_project/
├── CMakeLists.txt
├── src/
│   └── calculator.cpp
│   └── calculator.h
└── tests/
    └── calculator_test.cpp

2. 编写单元测试用例(gtest)

2.1 测试用例编写规范

  • 文件命名:*_test.cpp(如 calculator_test.cpp)
  • 测试类命名:TestClassName(如 CalculatorTest)
  • 测试函数命名:TEST(TestCaseName, TestName)(如 TEST(CalculatorTest, Add_TwoNumbers))

2.2 示例测试代码

// tests/calculator_test.cpp
#include <gtest/gtest.h>
#include "calculator.h"

TEST(CalculatorTest, Add_TwoNumbers) {
    Calculator calc;
    EXPECT_EQ(calc.Add(2, 3), 5);
    EXPECT_EQ(calc.Add(-1, 1), 0);
}

TEST(CalculatorTest, Multiply_Zero) {
    Calculator calc;
    EXPECT_EQ(calc.Multiply(5, 0), 0);
}

3. 配置 CMakeLists.txt

3.1 添加 gtest 依赖

# my_project/CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
project(MyProject)

# 添加源文件
add_subdirectory(src)

# 配置测试
enable_testing()

find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})

# 添加测试目标
add_executable(calculator_tests tests/calculator_test.cpp)
target_link_libraries(calculator_tests ${GTEST_LIBRARIES} pthread)

# 添加测试执行命令
add_test(NAME calculator_tests COMMAND calculator_tests)

3.2 启用代码覆盖率

# 在 CMakeLists.txt 中添加以下内容
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 --coverage")

4. 构建与执行测试

4.1 构建项目

mkdir build && cd build
cmake ..
make

4.2 执行测试

./calculator_tests

5. 生成代码覆盖率报告

5.1 使用 lcov 捕获覆盖率数据

# 初始化 lcov(清空旧数据)
lcov --directory . --zerocounters

# 捕获新覆盖率数据
lcov --capture --directory . --output-file coverage.info

# 排除第三方库和测试代码
lcov --remove coverage.info '*/tests/*' '*/usr/*' --output-file coverage_filtered.info

5.2 生成 HTML 报告

genhtml -o coverage_report coverage_filtered.info

5.3 查看报告

xdg-open coverage_report/index.html

6. 持续集成(CI)集成示例(GitHub Actions)

# .github/workflows/ci.yml
name: Unit Tests and Coverage

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4

    - name: Install Dependencies
      run: sudo apt-get install cmake g++ lcov

    - name: Configure CMake
      run: |
        mkdir build
        cd build
        cmake ..

    - name: Build and Test
      run: |
        cd build
        make
        ctest --output-on-failure

    - name: Generate Coverage Report
      run: |
        cd build
        lcov --directory . --zerocounters
        lcov --capture --directory . --output-file coverage.info
        lcov --remove coverage.info '*/tests/*' '*/usr/*' --output-file coverage_filtered.info
        genhtml -o coverage_report coverage_filtered.info

    - name: Upload Coverage Report
      uses: actions/upload-artifact@v4
      with:
        name: coverage-report
        path: build/coverage_report

7. 完整实例:计算器项目

7.1 项目代码(src/calculator.cpp)

#include "calculator.h"

int Calculator::Add(int a, int b) {
    return a + b;
}

int Calculator::Multiply(int a, int b) {
    return a * b;
}

7.2 项目头文件(src/calculator.h)

#ifndef CALCULATOR_H
#define CALCULATOR_H

class Calculator {
public:
    int Add(int a, int b);
    int Multiply(int a, int b);
};

#endif

7.3 运行全流程

# 步骤 1:构建项目
cd build
cmake ..
make

# 步骤 2:执行测试
./calculator_tests

# 步骤 3:生成覆盖率报告
lcov --directory . --zerocounters
lcov --capture --directory . --output-file coverage.info
lcov --remove coverage.info '*/tests/*' '*/usr/*' --output-file coverage_filtered.info
genhtml -o coverage_report coverage_filtered.info

# 步骤 4:查看报告
xdg-open coverage_report/index.html

8. 最佳实践与注意事项

8.1 测试覆盖率阈值

  • 在 CI 中设置覆盖率阈值(如 lcov 结合 coveralls 或 codecov)。
  • 示例:lcov --list coverage_filtered.info | grep 'lines' 查看覆盖率。

8.2 排除非代码文件

  • 在 lcov 命令中排除第三方库、测试代码和生成文件:
    lcov --remove coverage.info '*/tests/*' '*/vendor/*' --output-file coverage_filtered.info
    

8.3 多测试二进制文件处理

  • 如果有多个测试二进制文件,需合并覆盖率数据:
    lcov --add-tracefile test1.info --add-tracefile test2.info --output-file merged.info
    

8.4 持续集成报告存储

  • 使用 codecov 或 coveralls 上传覆盖率报告:
    bash <(curl -s https://codecov.io/bash) -f coverage_filtered.info
    

附录:常见问题

Q: 覆盖率报告显示 0%?

  • 原因:未正确添加 --coverage 编译参数。
  • 解决:在 CMakeLists.txt 中确保:
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 --coverage")
    

Q: genhtml 生成的 HTML 为空?

  • 原因:未正确捕获覆盖率数据。
  • 解决:检查 lcov 命令是否覆盖了所有源文件路径。

通过以上步骤,团队成员可快速在大型项目中实现单元测试与覆盖率分析,并通过自动化工具提升代码质量。

Gtest集成Lcov代码覆盖率测试 配置环境 安装 下载lcov:http://ltp.sourceforge.net/coverage/lcov.php,有rpm包和源码包。(以源码包为例) 解压lcov-x.xx.tar.gz,进入源码包,执行make install 在命令行执行lcov -v,正确输出版本号即安装成功 增加Lcov编译选项 在项目顶层目录CmakeLists.txt中添加以下编译指令: # coverage option OPTION (ENABLE_COVERAGE "Use gcov" ON) MESSAGE( 阅读详情

相关推荐

android下 C++单元测试 及 代码覆盖率

一、简单介绍 gtest是一款google提供的强大的测试框架,测试案例的编写也比较简单,gtest案例的编写可以参考系列博文:http://www.cnblogs.com/coderzh/archive/2009/03/31/1426758.html。 Gcov是进行代码运行的覆盖率统计的工具,它随着gcc的发布一起发布的,它的使用也很简单,需要在编译和链接的时候加上-fprofile-ar...

u013366022的专栏 3651

C++测试框架gtest;如何生成覆盖率:lcov使用

不会用gtest写测试用例?不知道如何看自己的代码覆盖率?一文全搞定。

weixin_45761030的博客 3821

C++单元测试覆盖率统计实战:基于gtest/gcov/lcov的完整配置与避坑指南

单元测试是保障软件质量的关键实践,而代码覆盖率则是衡量测试完备性的核心指标。其原理是通过编译器插桩,在代码执行路径中插入探针,从而统计测试用例对源码的覆盖情况。这项技术对于提升代码可靠性、发现潜在缺陷具有重要价值,广泛应用于持续集成、代码评审和重构等工程场景。本文聚焦于C++生态,深入解析如何结合gtest测试框架与gcov/lcov工具链,解决编译选项配置、报告生成与合并等常见难题,并分享多模块项目处理与CI/CD集成的实战经验,帮助开发者构建高效的覆盖率统计体系。

weixin_34005042的博客 412

单元测试之 - gtest(构建、安装、demo,覆盖率测试)

一、简介 我们熟悉的单元测试框架有很多,比如 gtest, boost.test, catch等,今天以功能完备,文档丰富,比较常用的 gtest 为例子,包括构建、安装、demo, 覆盖率展示等。文章主要面向对单元测试了解不多的小白,更多单元测试内容自己百度吧,内容很多。 注 1、如下内容在个人的腾讯计算云上完成,linux ubuntu系统 2、自行百度的意思是搜索,不是真的百度,能用google最好不要用百度,做开发的都懂。 二、gtest构建和安装 1、源码下载 github.

一只羊 3819

C++单元测试与代码覆盖率实战:Google Test + gcov/lcov完整指南

单元测试是软件工程中保障代码质量的核心实践,通过为最小可测试单元(如函数、类)编写自动化验证用例,确保其行为符合预期。其原理在于隔离被测代码,模拟各种输入与边界条件,验证输出与副作用。这项技术的核心价值在于提升代码可靠性、支持重构并促进设计优化,是持续集成和敏捷开发的重要环节。在C++这类系统级语言开发中,结合代码覆盖率分析(如gcov/lcov工具链),可以量化测试完整性,精准定位未覆盖的代码区域。本文以Google Test框架为例,详细演示了如何在CMake项目中集成测试、编写遵循FIRST原则的高质

angw337679452的博客 458

基于gtest与gcov/lcov的C++项目自动化测试与覆盖率统计实践

本文详细介绍了如何为C++项目搭建基于gtest与gcov/lcov的自动化测试与覆盖率统计体系。通过实战演示,从测试框架搭建、覆盖率工具配置到生成可视化HTML报告,手把手教你量化代码测试质量,并实现一键自动化流水线,有效提升代码可靠性与维护性。

weixin_29230865的博客 539

基于gtest与gcov/lcov的C++单元测试与覆盖率统计实践指南

本文详细介绍了如何在C++项目中集成gtest单元测试框架,并结合gcov/lcov工具链进行代码覆盖率统计。通过从环境搭建、编写测试用例到生成可视化HTML报告的完整实践指南,帮助开发者构建可靠的代码质量保障体系,重点关注白盒覆盖率的分析与提升。

apple5的专栏 1022

C++单元测试与覆盖率统计实战:Google Test + gcov/lcov完整指南

单元测试是验证代码最小可测试单元正确性的基础实践,通过隔离依赖和自动化验证确保逻辑准确性。其核心原理在于模拟各种输入和边界条件,执行目标代码并断言预期行为。在C++这类强类型、手动内存管理的语言中,单元测试尤其重要,它能显著提升代码质量、减少回归错误,并增强重构信心。结合代码覆盖率统计,可以量化测试的完整性,识别未覆盖的逻辑分支和错误处理路径。Google Test框架凭借丰富的断言、固件机制和参数化测试功能,成为C++单元测试的主流选择。gcov作为GCC内置的覆盖率工具,通过编译器插桩记录代码执行情况,

dechen6073的博客 470

搭建gtest单元测试框架,输出代码覆盖率统计

gtest搭建UT框架,输出覆盖率报告。

wz764110621的博客 1322

C++单元测试覆盖率统计实战:基于gtest与gcov/llvm-cov的完整指南

单元测试覆盖率是衡量软件测试完备性的关键指标,它通过代码插桩技术,在测试执行过程中记录哪些代码行、分支和函数被实际执行,从而生成量化的覆盖报告。其技术价值在于为开发团队提供客观的代码质量度量,精准定位测试盲区,尤其在资源管理、多线程和异常安全要求极高的C++系统开发中,能有效提升软件的健壮性。典型的应用场景包括持续集成流水线、代码审查和重构保障。本文聚焦于C++项目,详细解析如何高效整合Google Test框架与覆盖率工具链,并针对**gcov**与**llvm-cov**两套主流方案,提供从编译插桩、C

weixin_30851867的博客 466

gtest单元测试以及代码覆盖率详解

最近在写so库相关的项目,由于so是针对接口的代码编程,因此需要写大量的测试代码,因此使用gtest来进行测试自己的代码是很好的一个方式。 当然测试还可以使用valgrind测试代码中是否有内存泄露。总之很爽。 操作系统为Debian操作系统。 需要安装gtest sudo apt-get install libtest-dev 动态库编写 新建项目 项目目录如下: ...

啊渊的专栏 7622

避坑指南:GTest覆盖率统计中branch coverage丢失的5种解决方法(基于lcov 1.10+)

本文深入探讨了GTest在lcov 1.10+版本中分支覆盖率统计丢失的问题,提供了五种实用解决方案,包括命令行参数激活、配置文件持久化、CMake集成等,帮助开发者优化单元测试报告和覆盖率报告生成流程。

xxx12的博客 931

gtest单元测试(unit test)及覆盖率

下载google test 下载地址:https://github.com/google/googletest/tree/v1.10.x (我用的是1.10.x版本) main.cc #include #include “gtest/gtest.h” int Add(int a, int b) { return a + b; } int Sub(int a, int b){ return a - b; } TEST(testCase, test0){ EXPECT_EQ(14, Add(4, 10)); } TEST(testCase, test1){ ASSE

CMake+GTest+lcov三件套:如何一键生成可视化覆盖率报告(附完整配置命令)

本文详细介绍了如何使用CMake、GTest和lcov工具链一键生成C++项目的可视化单元测试覆盖率报告。通过完整的配置命令和实践指南,开发者可以快速实现从代码编译到生成带高亮显示的HTML报告的全流程自动化,有效提升代码质量监控效率。

rum55的博客 428

华为AR3260路由器NAT回流配置实战:从WEB界面到命令行的完整避坑指南

本文详细解析了华为AR3260路由器NAT回流(Hairpin NAT)的配置原理与实战方法。针对内网用户无法通过公网地址访问内部服务器的常见问题,文章不仅剖析了WEB界面配置的常见报错原因,更提供了清晰、可靠且一劳永逸的命令行(CLI)配置方案与排错指南,帮助企业网络工程师彻底解决内外网访问不一致的难题。

u6v7w8x的博客 874

MOOS-ivp 实验三 MOOS简介(1)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例

weixin_44151170的博客 7434

Ubuntu14.04 gtest+gcov+lcov/gcovr简单使用

单元测试 gtest、gcov、lcov/gcovr的简单使用介绍

vivisoul的专栏 1479

90nm CMOS工艺下6μW超低功耗LDO设计实战:从原理图到版图全解析

本文详细解析了在90nm CMOS工艺下设计一款静态功耗仅为6μW的超低功耗LDO(低压差线性稳压器)的全过程。文章深入探讨了如何通过改进型翻转电压跟随器(FVF)架构实现无输出电容设计,在满足极低功耗和芯片面积高效(chip-area-efficient)要求的同时,确保环路稳定性与快速瞬态响应,为物联网、可穿戴设备等应用提供关键电源管理解决方案。

weixin_29196613的博客 274

在VS上用Gtest/Gmock配置UT环境

Step1:build unit test projects with gtest/gmock 1.Download gtest source  Go to the Site:https://code.google.com/p/googletest/downloads/list download the source. 2.Build gtest source Go the msvc ...

kuanshang的专栏 1658

M2DGR数据集在主流SLAM框架中的实战配置指南:从ORB-SLAM到FAST-LIO的完整流程

本文提供了M2DGR多传感器数据集在主流SLAM框架中的实战配置指南。详细介绍了从ORB-SLAM、VINS-Mono等视觉/视觉惯性框架,到A-LOAM、FAST-LIO等激光/激光惯性框架的完整配置流程、参数调整要点及常见问题解决方案。通过实际测试对比,分析了各算法在M2DGR数据集上的表现,为机器人定位与建图研究提供了宝贵的实战经验。

k9l0m1的博客 481

从Google到LLVM:5种主流clang-format预设风格横向对比(含代码对比图)

本文横向对比了LLVM、Google、Chromium、Mozilla和WebKit五种主流的clang-format预设代码风格。通过同一段C++代码的格式化效果对比图,直观展示了它们在指针对齐、大括号换行、缩进等关键细节上的差异,并提供了基于团队背景与项目基因的选型决策指南。

weixin_28828243的博客 442

C++单元测试第一公里:gtest实战避坑指南

C++单元测试是保障代码质量的基础工程实践,其核心在于理解测试框架原理与编译链接机制。gtest作为主流C++测试框架,其价值不仅体现在断言语法上,更在于对C++标准兼容性、ABI稳定性、链接顺序等底层细节的精准控制。从Ubuntu的apt版本陷阱到Windows MSVC的运行时库冲突,从CMake集成中的target依赖顺序到死亡测试的进程隔离机制,每一步都涉及编译器、标准库与测试框架的协同。本文聚焦真实工程场景中的高频问题,如EXPECT_EQ类型流输出缺失、TEST_F初始化时机偏差、参数化测试注册

weixin_33910137的博客 560

避坑指南:GROMACS模拟中.tpr、.xtc、.edr、.cpt文件你用对了吗?从生成到分析全流程解析

本文详细解析GROMACS分子动力学模拟中.tpr、.xtc、.edr、.cpt等核心文件的使用技巧,从文件生成到轨迹优化、能量分析的全流程避坑指南。重点介绍拓扑文件校验、轨迹格式选择、周期性边界处理等实战经验,帮助科研人员高效管理模拟数据并准确提取关键能量信息。

weixin_30631587的博客 118

如何统计测试代码的覆盖率

程序员应该对自己写的代码做好自测试,而自测试的一个有效的手段就是写单元测试或者LLT。对此,可以借助于测试框架,c/c++的如Google Test,CPPUnit; Java的如JUnit等。 在单元测试中,覆盖率是用于衡量测试好坏的指标,能在一定程度上说明测试的完善度。但覆盖率和代码正确率是两码事,覆盖率高并不保证代码写的没bug,这点就不详细展开了。但覆盖率低了,肯定是用例不全。下面进入本...

专注探索c++,Linux等后台开发相关机制,欢迎关注,欢迎交流 4309

汽车UDS诊断之诊断会话控制服务(0x10)深度剖析

DiagnosticSessionControl就是诊断会话控制。 请求消息定义 A_Data类型 参数名称 Cvt 字节值 助记符 #1 诊断会话控制请求SID M 0x10 DSC #2 子功能=[诊断会话类型] M 0x00-0xFF LEV_DS_ ...

心骗小白话的博客 7419

4D毫米波雷达:高度信息与微多普勒效应

4D毫米波雷达:高度信息与微多普勒效应​ ,人工智能,计算机视觉,大模型,AI,本文深入解析4D毫米波雷达的高度信息获取与微多普勒效应。4D毫米波雷达通过MIMO技术、垂直天线布局及相位差计算等获取高度信息,相较传统雷达更精准。微多普勒效应由目标微运动引发,可用于目标识别、分类和运动监测。文中结合自动驾驶、安防监控案例,分析技术挑战与未来趋势,如信号干扰、数据处理复杂,未来将向高精度、与其他传感器融合发展,展现出在多领域的巨大应用潜力。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 9万+
上一篇: genhtml 工具使用说明
下一篇: Google Test 与 Google Mock:C++ 测试与模拟的完美结合
未来创世纪
博客等级 码龄18年 960粉丝 209原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值