在前面涉及C++代码的测试时,都是编写了一个简单的test()函数。现在,是时候介绍gtest了。
gtest的详细文档可以参考:
这两个文档讲解非常详细,不需要再啰嗦了。下面是对搭建gtest环境的一个快速介绍,算作笔记而备用。
上面第一个链接给出了gtest的官网,但由于众所周知的原因,那个网站很难访问。好在有网友放了一个版本在csdn上,可以直接取用,这个版本也是写这篇文章时最新的版本。链接:http://download.csdn.net/detail/mister_exia/7608947
本文讨论的是Ubuntu环境下面的一些操作,对于Windows+VS,上面的第一个链接讲得非常详细。
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$
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$
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$
下面用一个小程序来演示如何使用。
被测代码和测试代码:
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$
前面只是把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