googletest
googletest 是一个由 Google 的测试技术团队开发的测试框架,它考虑到了谷歌的特定需求和限制。无论你使用的是 Linux、Windows 还是 Mac,只要你编写 C++ 代码,googletest 都可以帮到你。它支持任何类型的测试,不只是单元测试。
googletest安装
#下载gtest,release-1.8.0
git clone https://github.com/google/googletest
# gtest编译
cd googletest
#生成Makefile文件(先安装cmake,brew install cmake),继续输入命令编译:
cmake CMakeLists.txt
#执行make,生成两个静态库:libgtest.a libgtest_main.a
make
#拷贝到系统目录,注意,如果下诉目录位置在不同版本位置有变动,用find . -name "libgtest*.a" 找到位置
sudo cp libgtest*.a /usr/lib
sudo cp –a include/gtest/ /usr/include
定义测试函数
应用 googletest 编写单元测试时,使用 TEST() 宏来声明测试函数:
TEST(GlobalConfigurationTest, configurationDataTest)
第一个参数是测试套件的名字,第二个参数是测试用例中测试的名字。这两个名字都必须是有效的 C++ 标识符,且它们都不应该包含下划线(_)。测试的 完整名字 由包含它的测试套件和它自己的独立名字组成。不同的测试套件中的测试可以具有相同的独立名字。
定义测试函数
gtest中,断言是用以检查条件是否为真。
ASSERT_* 版本的断言失败时会产生致命失败,并结束当前函数;
EXPECT_* 版本的断言失败时产生非致命失败,但不会中止当前函数。
信息输出
在gtest中,一个测试用例(test case)可以包含一个或多个测试。一个测试程序可以包含多个测试用例。
可以通过操作符”<<”将一些自定义的信息输出,如:
EXPECT_EQ(add(2,3),5) << "Error message ";
举个例子:
#include<gtest/gtest.h>
int add(int a,int b){
return a+b;
}
TEST(testCase,test0){
EXPECT_EQ(add(2,3),5) << "Error message ";
}
int main(int argc,char **argv){
testing::InitGoogleTest(&argc,argv);
return RUN_ALL_TESTS();
}
编译:
g++ -std=c++11 gtest.cpp -lgtest -lpthread -o gtest.out
./gtest.out
常见断言
致命断言 | 非致命断言 | 验证 |
---|---|---|
ASSERT_TRUE(condition); | EXPECT_TRUE(condition); | condition 是 true |
ASSERT_FALSE(condition); | EXPECT_FALSE(condition); | condition 是 false |
ASSERT_EQ(val1, val2); | EXPECT_EQ(val1, val2); | val1 == val2 |
ASSERT_NE(val1, val2); | EXPECT_NE(val1, val2); | val1 != val2 |
ASSERT_LT(val1, val2); | EXPECT_LT(val1, val2); | val1 < val2 |
ASSERT_LE(val1, val2); | EXPECT_LE(val1, val2); | val1 <= val2 |
ASSERT_GT(val1, val2); | EXPECT_GT(val1, val2); | val1 > val2 |
ASSERT_GE(val1, val2); | EXPECT_GE(val1, val2); | val1 >= val2 |
ASSERT_STREQ(str1, str2); | EXPECT_STREQ(str1, str2); | 两个 C 字符串具有相同的内容 |
ASSERT_STRNE(str1, str2); | EXPECT_STRNE(str1, str2); | 两个 C 字符串具有不同的内容 |
ASSERT_STRCASEEQ(str1, str2); | EXPECT_STRCASEEQ(str1, str2); | 两个 C 字符串具有相同的内容,忽略大小写 |
ASSERT_STRCASENE(str1, str2); | EXPECT_STRCASENE(str1, str2); | 两个 C 字符串具有不同的内容,忽略大小写 |