目标是利用gtest,搭建UT框架,利用gcov得到函数和分支执行记录,输出覆盖率报告。

gtest

开源的C++测试框架,用于编写和执行C++代码的单元测试和集成测试。

主要优点:

简单易用,支持cmake,makefile,易集成,实现自动化测试;

满足单元测试的各种需求如参数化测试、类型参数化测试和death测试;

丰富的断言宏,检查条件是否满足,失败时提供详细的日志信息;

源代码和UT代码分离。可先写测试再编写实现代码,有助于提前考虑代码的设计和接口。

stub

单元测试和集成测试阶段,stub是一个非常重要的概念。它是一种组件替换技术。通俗讲就是函数替换,那如何实现函数替换(函数打桩)呢?

https://github.com/coolxv/cpp-stub

linux stub.h打桩原理:读取到原函数的地址和桩函数的地址,并使用jmp指令从原函数跳转到桩函数去,以实现打桩。这里就要对函数地址所在的内存进行读写,需要使用mprotect系统调用。

gcov

gcov是gcc的一个组件,在编译时添加-ftest-coverage(编译后产生gcno文件,包含程序执行流图,代码块对应的行号信息)和-fprofile-arcs(运行后产生gcda文件,记录程序中基本块和arc跳转次数,进而得到每个语句和分支的执行次数)。

lcov,genhtml

lcov读取gcda和gcno,输出可读性更强的info文件,genhtml读取info文件,输出html覆盖率报告。

集成以上到repo形成框架:

文件目录:

GitHub - ze795/unit_test: unit test framework of gtest


Reference:

https://github.com/yanxiangyfg/gcov

gcov代码覆盖率测试-原理和实践总结_gcovr覆盖率计算原理-CSDN博客

https://www.cnblogs.com/heimianshusheng/articles/13530672.html

cpp-stub使用教程(基于Gtest)-CSDN博客 

stub | Simest's Blog

更多推荐