《C++语言的单元测试与代码覆盖率》 by 保罗的酒吧

对代码进行单元测试是几乎每个软件工程师都要完成的工作。本文以C++语言为基础,讲解如何进行单元测试并生成测试报告。

前言

测试是软件开发过程中一个必须的环节,测试确保软件的质量符合预期。
对于工程师自己来说,单元测试也是提升自信心的一种方式。
直接交付没有经过测试的代码是不太好的,因为这很可能会浪费整个团队的时间,在一些原本早期就可以发现的问题上。而单元测试,就是发现问题一个很重要的环节。
本文以C++语言为基础,讲解如何进行单元测试并生成测试报告。
在工具上,我们会使用下面这些:

  • GCC
  • CMake
  • Google Test
  • gcov
  • lcov

    演示项目

    演示项目

    为了方便本文的讲解,我专门编写了一个演示项目作为代码示例。
    演示项目的源码可以在我的Github上获取:paulQuei/gtest-and-coverage
    你可以通过下面几条命令下载和运行这个项目:
    1. git clone https://github.com/paulQuei/gtest-and-coverage.git cd gtest-and-coverage ./make_all.sh
    要运行这个项目,你的机器上必须先安装好前面提到的工具。如果没有,请阅读下文以了解如何安装它们。
    如果你使用的是Mac系统,下文假设你的系统上已经安装了brew包管理器。如果没有,请通过下面这条命令安装它:
    1. /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

    项目结构

    演示项目的目录结构如下:
    1. .
    2. ├── CMakeLists.txt
    3. ├── googletest-release-1.8.1.zip
    4. ├── include
    5. └── utility.h
    6. ├── make_all.sh
    7. ├── src
    8. └── utility.cpp
    9. └── test
    10. └── unit_test.cpp
    这里演示的内容是:以测试一个我们要提供的软件库为例,讲解如何对其进行单元测试并生成测试报告。
    为了简单起见,这个软件库只有一个头文件和一个实现文件。

    当然,在实际上的项目中,一个软件库会通常包含更多的文件,不过这并不影响我们要说明的问题

演示项目中的文件说明如下:

文件名称 说明
make_all.sh 入口文件,会执行:编译,测试和生成报告等所有工作
CMakeLists.txt 项目的编译文件
googletest-release-1.8.1.zip google test源码压缩包
utility.h 待测试的软件库的头文件
utility.cpp 待测试的软件库的实现文件
unit_test.cpp 对软件库进行单元测试的代码

测试环境

演示项目在如下的环境中测试过。

  • MacBook Pro
    • 操作系统:macOS Mojave 10.14.1
    • 编译器:Apple LLVM version 10.0.0 (clang-1000.11.45.2)
    • CMake:cmake version 3.12.1
    • Google Test: 1.8.1
    • lcov: lcov version 1.13
  • Ubuntu
    • 操作系统:Ubuntu 16.04.5 LTS
    • 编译器:gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
    • CMake:cmake version 3.5.1
    • Google Test:1.8.1
    • lcov:lcov version 1.12

关于CMake

为了简化编译的过程,这里使用CMake作为编译工具。关于CMake的更多内容请参见请官网:https://cmake.org
关于如何安装CMake请参见这里:Installing CMake
另外,你也可以通过一条简单的命令来安装CMake: