目标是利用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