Gtest Github
使用 gtest(gmock) 方便我们编写组织 c++ 单元测试。
编译 lib
到 github 拉取代码或者下载某个版本的 zip 包到本地目录,参考 gtest 中的 README.md 如何编译库和编译自己的代码,下面简单介绍下编译方法
手动编译
$ g++ -isystem ${GTEST_DIR}/include -I${GTEST_DIR} \
-pthread -c ${GTEST_DIR}/src/gtest-all.cc
$ ar -rv libgtest.a gtest-all.o
cmake 编译
gtest 已经提供了 cmakelist,可以直接使用cmake 生成 makefile, 编译库和 sample
$ mkdir mybuild # Create a directory to hold the build output.
$ cd mybuild
$ cmake ${GTEST_DIR} # Generate native build scripts.
$ make
然后就可以在编译自己的测试程序时链接 gtest 了。
$ g++ -isystem ${GTEST_DIR}/include -pthread path/to/your_test.cc libgtest.a -o your_test
跟多详细内容参考 readme 和代码中提供的例子(samples ; make 目录下),比如如何解决重复定义宏等问题。
gtest 测试程序
通过 编程参考 和 源码中 sample 目录下的示例
,我们可以很快上手 gtest。gtest 定义了宏供我们写断言语句,一个或者多个断言组成我们的测试用例 case,多个测试用例有时候需要共享一些通用对象,可以把这些用例放在同一个 fixture 中。
断言和 case
gtest 断言提供两个版本
* ASSERT_*
版本断言,在同一个 case 中(测试函数)中,ASSERT_* 失败就会终止当前用例,开始其他 case ;
* EXPECT_*
版本,当断言失败时,会报错,但是会继续执行剩余语句。
完整的 宏定义, 或见源码 include/gtest/gtest.h
使用哪种语句断言取决自己用例场景,如当前语句失败时后续语句没有继续执行意义,则可以直接使用 ASSERT 终止,否则使用 EXPECT 可以发现更多错误。
如果用例之间不需要什么公用资源,相互独立,可以使用如下方式定义每一个 case
TEST(套件名,用例名)
{
//套件名和用例名自定义
//断言语句
//如一般的c++ 函数,不 return value
}
进入目录 sample 中, 以 sample1_unittest.cc 为例子
#include "sample1.h" // 测试对象头文件,接口
#include "gtest/gtest.h" // gtest 头文件
TEST(IsPrimeTest, Negative) {
EXPECT_FALSE(IsPrime(-1)) << "这样子失败时打印自己的信息";
EXPECT_FALSE(IsPrime(-2)); // 如果此断言失败,还会继续执行下一个
EXPECT_FALSE(IsPrime(INT_MIN));
}
TEST(IsPrimeTest, Negative) {
EXPECT_FALSE(IsPrime(-1));
ASSERT_FALSE(IsPrime(-2)); // 如果此断言失败,下一条不