简介

GoogleTest(简称 gtest),是 Google 开发的 C/C++单元测试框架。

GoogleTest 本身是用 C++编写的,主要用于测试 C++代码。要用其测试 C 语言代码,需要使用 extern "C"

通常是在 Linux 环境下使用 GoogleTest。如果要在 Windows 下使用,则需要MinGW或直接使用WSL

本文介绍了 Linux 下安装 GoogleTest 的方法,并给出了其测试 C 代码和 C++代码的例子。

GoogleTest 编译连接

GoogleTest 包含 3 个基础组件:

  • gtest/gtest.h
  • gtest 库
  • gtest_main 库

GoogleTest 对业务代码的测试是非侵入式的,即被测代码不需要做任何修改。单元测试时,会将被测试的业务代码、单元测试代码、GoogleTest 库编译连接成独立的可执行程序。

设想有一个项目,包含 calc.h,calc.cpp 和其他代码,那么业务代码和单元测试的关系如下:

描述 代码文件 业务可执行程序 单元测试可执行程序
业务代码主函数 main.cpp -
暂不测试的业务代码 other.cpp -
要测试的业务代码 calc.cpp
单元测试代码 calc_test.cpp -
GoogleTest 头文件 gtest/gtest.h -
GoogleTest 库 gtest -
GoogleTest 库 gtest_main -

通常,单元测试代码和业务代码一起进入版本控制系统。

Linux 下安装 GoogleTest

CentOS

1
# sudo yum install -y gtest

检查:

1
2
3
4
5
6
# whereis gtest
gtest: /usr/include/gtest
# whereis libgtest
libgtest: /usr/lib64/libgtest.so
# whereis libgtest_main
libgtest_main: /usr/lib64/libgtest_main.so

Ubuntu

1
# sudo apt-get install -y libgtest-dev

检查:

1
2
3
4
5
6
# whereis gtest
gtest: /usr/include/gtest
# whereis libgtest
libgtest: /usr/lib/x86_64-linux-gnu/libgtest.a /usr/local/lib/libgtest.a
# whereis libgtest_main
libgtest_main: /usr/lib/x86_64-linux-gnu/libgtest_main.a /usr/local/lib/libgtest_main.a

用 GoogleTest 测试 C++代码

如果要测试这样的代码:

1
2
3
4
5
6
7
// calc.hpp
#pragma once

class Calc {
public:
    int add(int a, int b);
};
1
2
3
4
5
6
// calc.cpp
#include "calc.hpp"

int Calc::add(int a, int b) {
    return a + b;
};

单元测试就要这样写:

1
2
3
4
5
6
7
8
// calc_test.cpp
#include <gtest/gtest.h>
#include "calc.hpp"

TEST(calc, add) {
    ASSERT_EQ(7, Calc().add(3, 4));
    ASSERT_EQ(150, Calc().add(50, 100));
}

然后编译连接

1
2
3
# g++ -c calc.cpp -o calc.o
# g++ -c calc_test.cpp -o calc_test.o
# g++ calc.o calc_test.o -lgtest -lgtest_main -pthread -o thetest

执行

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# ./thetest
Running main() from /build/googletest-j5yxiC/googletest-1.10.0/googletest/src/gtest_main.cc
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from calc
[ RUN      ] calc.add
[       OK ] calc.add (0 ms)
[----------] 1 test from calc (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0 ms total)
[  PASSED  ] 1 test.

用 GoogleTest 测试 C 代码

由于 GoogleTest 本身是 C++的,要测试 C 代码就要使用 extern "C"

如果要测试这样的代码:

1
2
3
4
// calc.h
#pragma once

int add(int a, int b);
1
2
3
4
5
6
// calc.c
#include "calc.h"

int add(int a, int b) {
    return a + b;
};

这时需要在 calc_test.cpp 里,用 extern "C" 包裹 #include "calc.h"

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// calc_test.cpp
#include <gtest/gtest.h>
extern "C" { // 在这里包裹
#include "calc.h"
}

TEST(calc, add) {
    ASSERT_EQ(7, add(3, 4));
    ASSERT_EQ(150, add(50, 100));
}

编译连接:

1
2
3
# gcc -c calc.c -o calc.o
# g++ -c calc_test.cpp -o calc_test.o
# g++ calc.o calc_test.o -lgtest -lgtest_main -pthread -o thetest

执行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# ./thetest
Running main() from /build/googletest-j5yxiC/googletest-1.10.0/googletest/src/gtest_main.cc
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from calc
[ RUN      ] calc.add
[       OK ] calc.add (0 ms)
[----------] 1 test from calc (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0 ms total)
[  PASSED  ] 1 test.

总结

本文介绍了 GoogleTest 在 Linux 安装和使用方法。

本文提到的代码可在seedjyh/googletest-example取得。

在实际项目中使用 GoogleTest 的方法,可以参阅下面这本书:

  • 修改代码的艺术:将大型、难懂、难修改的遗留代码^[遗留代码(Legacy code):指的是没有单元测试的代码]逐步改进为高内聚、低耦合、易测试的良好代码基的一整套步骤。