搭建gtest环境

1. 前言

在前面涉及C++代码的测试时,都是编写了一个简单的test()函数。现在,是时候介绍gtest了。


gtest的详细文档可以参考:

  • 玩转Google开源C++单元测试框架Google Test系列
  • Linux环境中简单清爽的Google Test (GTest)测试环境搭建


这两个文档讲解非常详细,不需要再啰嗦了。下面是对搭建gtest环境的一个快速介绍,算作笔记而备用。


2. 下载gtest

上面第一个链接给出了gtest的官网,但由于众所周知的原因,那个网站很难访问。好在有网友放了一个版本在csdn上,可以直接取用,这个版本也是写这篇文章时最新的版本。链接:http://download.csdn.net/detail/mister_exia/7608947


3. 构建gtest库

本文讨论的是Ubuntu环境下面的一些操作,对于Windows+VS,上面的第一个链接讲得非常详细。


3.1 解压缩压缩包

flying-bird@flyingbird:~/software$ ll gtest*
-rw-rw-r-- 1 flying-bird flying-bird 1164254  8月 12 19:59 gtest-1.7.0.zip
flying-bird@flyingbird:~/software$ unzip gtest-1.7.0.zip -d .
Archive:  gtest-1.7.0.zip
   creating: ./gtest-1.7.0/
   creating: ./gtest-1.7.0/build-aux/
  inflating: ./gtest-1.7.0/build-aux/config.h.in  
...................
  inflating: ./gtest-1.7.0/CMakeLists.txt  
flying-bird@flyingbird:~/software$ ll
总用量 187288
drwxrwxr-x  7 flying-bird flying-bird      4096  8月 12 20:01 ./
drwxrwxrwx 54 flying-bird flying-bird      4096  8月 12 19:38 ../
...............
drwxr-xr-x 15 flying-bird flying-bird      4096  9月 19  2013 gtest-1.7.0/
-rw-rw-r--  1 flying-bird flying-bird   1164254  8月 12 19:59 gtest-1.7.0.zip
...............
flying-bird@flyingbird:~/software$ 

3.2 编译gtest库

gtest库包括两个:libgtest.a和libgtest_main.a。


编译gtest库的方法,在README文件中有详细的介绍;——gtest_main的生成方法要参考make/Makefile。
下面是把lib文件生成在gtest-1.7.0目录下面。命令如下:

export GTEST_DIR=/home/flying-bird/software/gtest-1.7.0

#libgtest.a
g++ -isystem ${GTEST_DIR}/include -I${GTEST_DIR} -pthread -c ${GTEST_DIR}/src/gtest-all.cc
ar -rv libgtest.a gtest-all.o

#libgtest_main.a
g++ -isystem ${GTEST_DIR}/include -I${GTEST_DIR} -pthread -c ${GTEST_DIR}/src/gtest_main.cc
ar -rv libgtest_main.a gtest_main.o gtest-all.o


命令执行结果:
flying-bird@flyingbird:~/software/gtest-1.7.0$ ll
总用量 776
drwxr-xr-x 15 flying-bird flying-bird   4096  9月 19  2013 ./
drwxrwxr-x  7 flying-bird flying-bird   4096  8月 12 20:01 ../
-rw-r--r--  1 flying-bird flying-bird  43769  9月 19  2013 aclocal.m4
...............

drwxr-xr-x  7 flying-bird flying-bird   4096  9月 19  2013 xcode/
flying-bird@flyingbird:~/software/gtest-1.7.0$ mkdir lib
flying-bird@flyingbird:~/software/gtest-1.7.0$ cd lib
flying-bird@flyingbird:~/software/gtest-1.7.0/lib$ export GTEST_DIR=/home/flying-bird/software/gtest-1.7.0
flying-bird@flyingbird:~/software/gtest-1.7.0/lib$ g++ -isystem ${GTEST_DIR}/include -I${GTEST_DIR} -pthread -c ${GTEST_DIR}/src/gtest-all.cc
flying-bird@flyingbird:~/software/gtest-1.7.0/lib$ ar -rv libgtest.a gtest-all.o
ar: creating libgtest.a
a - gtest-all.o
flying-bird@flyingbird:~/software/gtest-1.7.0/lib$ g++ -isystem ${GTEST_DIR}/include -I${GTEST_DIR} -pthread -c ${GTEST_DIR}/src/gtest_main.cc
flying-bird@flyingbird:~/software/gtest-1.7.0/lib$ ar -rv libgtest_main.a gtest_main.o
ar: creating libgtest_main.a
a - gtest_main.o
flying-bird@flyingbird:~/software/gtest-1.7.0/lib$ ll
总用量 1720
drwxrwxr-x  2 flying-bird flying-bird   4096  8月 12 20:16 ./
drwxr-xr-x 16 flying-bird flying-bird   4096  8月 12 20:15 ../
-rw-rw-r--  1 flying-bird flying-bird 808220  8月 12 20:15 gtest-all.o
-rw-rw-r--  1 flying-bird flying-bird   2800  8月 12 20:16 gtest_main.o
-rw-rw-r--  1 flying-bird flying-bird 932802  8月 12 20:15 libgtest.a
-rw-rw-r--  1 flying-bird flying-bird   2964  8月 12 20:16 libgtest_main.a
flying-bird@flyingbird:~/software/gtest-1.7.0/lib$ 


注意到,在gtest的make/Makefile中,gtest_main.a是把gtest_main.cc和gtest-all.cc都打包到一起的,这是为了简化构建可执行程序的命令代码:即只需要把一个.a文件链接进去,而不用链接2个。——当然,如果愿意,用几个.a都是可以的。

为此,再重新打包gtest_main.a,如下:
flying-bird@flyingbird:~/software/gtest-1.7.0/lib$ ll
总用量 1720
drwxrwxr-x  2 flying-bird flying-bird   4096  8月 12 20:16 ./
drwxr-xr-x 16 flying-bird flying-bird   4096  8月 12 20:15 ../
-rw-rw-r--  1 flying-bird flying-bird 808220  8月 12 20:15 gtest-all.o
-rw-rw-r--  1 flying-bird flying-bird   2800  8月 12 20:16 gtest_main.o
-rw-rw-r--  1 flying-bird flying-bird 932802  8月 12 20:15 libgtest.a
-rw-rw-r--  1 flying-bird flying-bird   2964  8月 12 20:16 libgtest_main.a
flying-bird@flyingbird:~/software/gtest-1.7.0/lib$ rm libgtest_main.a
flying-bird@flyingbird:~/software/gtest-1.7.0/lib$ ar -rv libgtest_main.a gtest_main.o gtest-all.o
ar: creating libgtest_main.a
a - gtest_main.o
a - gtest-all.o
flying-bird@flyingbird:~/software/gtest-1.7.0/lib$

3.3 使用示例

下面用一个小程序来演示如何使用。


被测代码和测试代码:

flying-bird@flyingbird:~/examples/cpp/gtest$ ll
总用量 24
drwxrwxr-x 2 flying-bird flying-bird 4096  8月 12 20:45 ./
drwxrwxr-x 8 flying-bird flying-bird 4096  8月 12 20:17 ../
-rw-rw-r-- 1 flying-bird flying-bird   64  8月 12 20:19 math.cc
-rw-rw-r-- 1 flying-bird flying-bird    0  8月 12 20:18 math.cc~
-rw-rw-r-- 1 flying-bird flying-bird   67  8月 12 20:19 math.h
-rw-rw-r-- 1 flying-bird flying-bird    0  8月 12 20:18 math.h~
-rw-rw-r-- 1 flying-bird flying-bird  226  8月 12 20:39 test-math.cpp
-rw-rw-r-- 1 flying-bird flying-bird  226  8月 12 20:21 test-math.cpp~
flying-bird@flyingbird:~/examples/cpp/gtest$ cat math.h
#ifndef __MATH_H
#define __MATH_H

int add(int x, int y);

#endif

flying-bird@flyingbird:~/examples/cpp/gtest$ cat math.cc
#include "math.h"

int add(int x, int y)
{
    return x + y;
}

flying-bird@flyingbird:~/examples/cpp/gtest$ cat test-math.cpp
#include "gtest/gtest.h"
#include "math.h"

TEST(MathTest, FirstCase)
{
    EXPECT_EQ(2, add(1, 1));
    EXPECT_EQ(8, add(3, 5));
}

TEST(MathTest, SecondCase)
{
    EXPECT_EQ(20, add(10, 10));
    EXPECT_EQ(80, add(3, 5));
}
flying-bird@flyingbird:~/examples/cpp/gtest$ 


测试用例执行结果:

flying-bird@flyingbird:~/examples/cpp/gtest$ g++ -isystem ${GTEST_DIR}/include -pthread math.cc test-math.cpp ${GTEST_DIR}/lib/libgtest_main.a -o test-math
flying-bird@flyingbird:~/examples/cpp/gtest$ ll
总用量 472
drwxrwxr-x 2 flying-bird flying-bird   4096  8月 12 20:46 ./
drwxrwxr-x 8 flying-bird flying-bird   4096  8月 12 20:17 ../
-rw-rw-r-- 1 flying-bird flying-bird     64  8月 12 20:19 math.cc
-rw-rw-r-- 1 flying-bird flying-bird      0  8月 12 20:18 math.cc~
-rw-rw-r-- 1 flying-bird flying-bird     67  8月 12 20:19 math.h
-rw-rw-r-- 1 flying-bird flying-bird      0  8月 12 20:18 math.h~
-rwxrwxr-x 1 flying-bird flying-bird 456658  8月 12 20:46 test-math*
-rw-rw-r-- 1 flying-bird flying-bird    226  8月 12 20:39 test-math.cpp
-rw-rw-r-- 1 flying-bird flying-bird    226  8月 12 20:21 test-math.cpp~
flying-bird@flyingbird:~/examples/cpp/gtest$ ./test-math
Running main() from gtest_main.cc
[==========] Running 2 tests from 1 test case.
[----------] Global test environment set-up.
[----------] 2 tests from MathTest
[ RUN      ] MathTest.FirstCase
[       OK ] MathTest.FirstCase (0 ms)
[ RUN      ] MathTest.SecondCase
test-math.cpp:13: Failure
Value of: add(3, 5)
  Actual: 8
Expected: 80
[  FAILED  ] MathTest.SecondCase (0 ms)
[----------] 2 tests from MathTest (0 ms total)

[----------] Global test environment tear-down
[==========] 2 tests from 1 test case ran. (1 ms total)
[  PASSED  ] 1 test.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] MathTest.SecondCase

 1 FAILED TEST
flying-bird@flyingbird:~/examples/cpp/gtest$

4. 重构

前面只是把gtest的关键步骤打通了,构建了gtest库、写了一个测试用例。

但如果经常要用gtest,前面搭建环境的一些步骤需要重构/优化,主要就是环境变量。为此,在/etc/profile的最后添加如下:

# gtest
GTEST_DIR="/home/flying-bird/software/gtest-1.7.0"
GTEST_LIB_DIR=$GTEST_DIR/lib
GTEST_MAIN_LIB=$GTEST_DIR/lib/libgtest_main.a
export GTEST_DIR
export GTEST_LIB_DIR
export GTEST_MAIN_LIB

记得要重启机器。


然后生成测试用例的命令可以下面中的任何一个:

g++ -isystem ${GTEST_DIR}/include -pthread math.cc test-math.cpp ${GTEST_DIR}/lib/libgtest_main.a -o test-math
g++ -isystem ${GTEST_DIR}/include -pthread math.cc test-math.cpp ${GTEST_LIB_DIR}/libgtest_main.a -o test-math
g++ -isystem ${GTEST_DIR}/include -pthread math.cc test-math.cpp ${GTEST_MAIN_LIB} -o test-math


你可能感兴趣的:(C/C++)