对代码进行单元测试是几乎每个软件工程师都要完成的工作。本文以C++语言为基础,讲解如何进行单元测试并生成测试报告。
前言
测试是软件开发过程中一个必须的环节,测试确保软件的质量符合预期。
对于工程师自己来说,单元测试也是提升自信心的一种方式。
直接交付没有经过测试的代码是不太好的,因为这很可能会浪费整个团队的时间,在一些原本早期就可以发现的问题上。而单元测试,就是发现问题一个很重要的环节。
本文以C++语言为基础,讲解如何进行单元测试并生成测试报告。
在工具上,我们会使用下面这些:
- GCC
- CMake
- Google Test
- gcov
- lcov
演示项目
演示项目
为了方便本文的讲解,我专门编写了一个演示项目作为代码示例。
演示项目的源码可以在我的Github上获取:paulQuei/gtest-and-coverage。
你可以通过下面几条命令下载和运行这个项目:
要运行这个项目,你的机器上必须先安装好前面提到的工具。如果没有,请阅读下文以了解如何安装它们。git clone https://github.com/paulQuei/gtest-and-coverage.git cd gtest-and-coverage ./make_all.sh
如果你使用的是Mac系统,下文假设你的系统上已经安装了brew包管理器。如果没有,请通过下面这条命令安装它:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
项目结构
演示项目的目录结构如下:
这里演示的内容是:以测试一个我们要提供的软件库为例,讲解如何对其进行单元测试并生成测试报告。.├── CMakeLists.txt├── googletest-release-1.8.1.zip├── include│ └── utility.h├── make_all.sh├── src│ └── utility.cpp└── test└── 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:
