Skip to content

hurx/CoverSer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

C++服务端覆盖率自动化获取方案

在传统覆盖率收集方案中,C++ 编译时,添加覆盖率参数 -fprofile-arcs -ftest-coverage。 编译后能生成 gcno 文件。 在执行机上执行进程和测试脚本后,退出进程时,获取到覆盖率执行文件 gcda。通过 lcov 工具根据 源码、gcda、gcno 文件生成覆盖率数据。再使用 genhtml 生成覆盖率报告。

传统方案中的问题:

  1. 需要修改 makefile 或者 cmake 文件;
  2. 需要停止进程才能获取到覆盖率;
  3. 对于源码不同 commit id 的覆盖率数据无法累加;
  4. 无法获取到相对于 master 到增量覆盖率。

希望通过非入侵到方式,在不停服到情况下自动获取到覆盖率。

通过工具脚本、计算服务等,将整个覆盖率获取流程自动化。另一方面,解决了传统方案中遇到的问题。

覆盖率后端架构

架构 简要说明:

  1. 在编译前使用插桩脚本对源码插桩。编译完成后,通过脚本将 gcno 文件上传至cos;
  2. 在执行机上启动服务,定时获取覆盖率文件 gcda 上传至 cos,并触发覆盖率任务,将任务信息放入 kafka;
  3. 覆盖率计算服务(可多台部署)通过获取 kafka 中任务,并从 git拉取源码,从 cos 拉取源数据进行覆盖率计算、累加等,最后生成覆盖率结果写入数据库,覆盖率报告上传至cos;
  4. 通过 API 获取到指定 commit id 的覆盖率数据以及报告的 cos 地址

代码相关模块

./script/instrumentation.py 覆盖率插桩脚本

./CreaTask 创建覆盖率任务API

./GetCover 获取覆盖率结果API

./DoTask 覆盖率计算服务

关键逻辑说明

1、 如何实现不停服?

通过在入口函数(比如 main)添加信号量捕获方法 signal(),当获取到指定信号量时,调用 __gcov_flush() 刷新本地 gcda 文件。

2、 如何累加覆盖率数据?

a. 如果之前的覆盖率数据与当前覆盖率数据对于源码到 commit id 相同,则通过 lcov 命令直接整合; b. 如果 commit id 不同,则根据 git diff 的变更,通过计算将前一次覆盖率数据映射到当前结果中。

3、 如果计算增量覆盖率?

通过 git diff 计算出所有增量代码,再通过覆盖率数据标记增量代码中的覆盖情况。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages