C++ 单元测试与代码覆盖率测试方法

前言
测试是软件开发过程中一个必须的环节 , 测试确保软件的质量符合预期 。
对于工程师自己来说 , 单元测试也是提升自信心的一种方式 。
直接交付没有经过测试的代码是不太好的 , 因为这很可能会浪费整个团队的时间 , 在一些原本早期就可以发现的问题上 。而单元测试 , 就是发现问题一个很重要的环节 。
本文以C++语言为基础 , 讲解如何进行单元测试并生成测试报告 。
在工具上 , 我们会使用下面这些:
参考演示项目:
项目结构
演示项目的目录结构如下:
.├── CMakeLists.txt├── googletest-release-1.8.1.zip├── include│└── utility.h├── make_all.sh├── src│└── utility.cpp└── test└── unit_test.cpp
这里演示的内容是:以测试一个我们要提供的软件库为例 , 讲解如何对其进行单元测试并生成测试报告 。
为了简单起见 , 这个软件库只有一个头文件和一个实现文件 。
当然 , 在实际上的项目中 , 一个软件库会通常包含更多的文件 , 不过这并不影响我们要说明的问题 。
关于CMake
演示项目中的.txt内容如下:
cmake_minimum_required(VERSION 2.8.11) ①project(utility) ②?set(CMAKE_CXX_STANDARD 11) ③?set(GTEST googletest-release-1.8.1) ④include_directories("./include" "${GTEST}/googletest/include/")link_directories("build/gtest/googlemock/gtest/")?SET(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS} --coverage") ⑤?add_library(${CMAKE_PROJECT_NAME}_lib src/utility.cpp) ⑥?add_executable(unit_test test/unit_test.cpp) ⑦target_link_libraries(unit_test ${CMAKE_PROJECT_NAME}_lib gtest gtest_main pthread) ⑧
以编号为序 , 这段代码说明如下:
设置使用的CMake最低版本号为2.8.11 。
指定项目的名称为”” , 项目名称可以通过${}进行引用 。
指定使用C++11 。
这里的三行是编译 test , 并将其头文件路径和编译结果的库文件路径添加到环境中 。因为后面在编译单元测试代码的时候需要用到 。
添加--到编译器flag中 , 这个参数是很重要的 , 因为这是生成代码覆盖率所必须的 。
编译我们的软件库 , 这里将生成.a库文件 。
编译单元测试的可执行文件 。
单元测试的可执行文件需要链接我们开发的软件库以及 test的库 。另外 ,  test依赖了 , 所以这个库也需要 。
关于测试
软件测试有很多种分类方式 。从测试的级别来说 , 可以大致分为:
这其中 , 单元测试是最局部和具体的 。它通常需要对代码中的每一个类和函数进行测试 。
单元测试通常由开发者完成 , 需要针对代码逻辑进行测试 。所以它是一种白盒测试 。
关于xUnit
xUnit是几种单元测试框架的总称 。最早源于的单元测试框架SUnit , 它是由Kent Beck开发的 。
除此之外 , 还有针对Java语言的JUnit , 针对R语言的RUnit 。
在本文中 , 我们使用开发的xUnit框架: Test 。
Test介绍
Test的项目主页在上 。
实际上 , 这个项目中同时包含了和两个工具 , 本文中我们只会讲解第一个 。
Test支持的操作系统包含下面这些:
目前有很多的项目都使用了 Test , 例如下面这些:
编译 Test

C++ 单元测试与代码覆盖率测试方法

文章插图
为了便于读者使用 , 我们在演示项目中包含了 Test 1.8.1的源码压缩包 。并且在CMake文件中 , 同时包含了 Test的编译和使用配置工作 。