Google Test支持的操作系统包含下面这些:
1、Linux
2、Mac OS X
3、Windows
4、Cygwin
5、MinGW
6、Windows Mobile
7、Symbian
一、google test的基本使用步骤
1、包含gtest/gtest.h头文件
2、使用TEST()宏定义测试case
3、在测试体中使用gooletest断言进行值检查
4、使用RUN_ALL_TESTS()宏运行测试
二、TEST()宏定义
TEST(TestCase,TestName)
{
//测试代码
}
其中TestCase为测试用例的名称,用于将相关的测试用例分组在一起,以便于在测试结果中更好识别和分类。TestName为具体测试的名称,一般描述测试的目的。
例如:
#include <gtest/gtest.h>
int add(int a,int b)
{
return a+b;
}
TEST(testCase2,test_GT)
{
EXPECT_GT(add(2,3),3);
}
TEST(testCase2,test_GE)
{
EXPECT_GE(add(2,3),5);
}
TEST(testCase1,test_EQ)
{
EXPECT_EQ(add(2,3),5);
}
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
测试结果:
三、断言
1、基本断言–测试失败时程序会继续执行
EXPECT_EQ(val1, val2):检查 val1 == val2
EXPECT_NE(val1, val2):检查 val1 != val2
EXPECT_LT(val1, val2):检查 val1 < val2
EXPECT_LE(val1, val2):检查 val1 <= val2
EXPECT_GT(val1, val2):检查 val1 > val2
EXPECT_GE(val1, val2):检查 val1 >= val2
2、致命断言–测试失败时程序会立即终止
ASSERT_EQ(val1, val2):检查 val1 == val2
ASSERT_NE(val1, val2):检查 val1 != val2
ASSERT_LT(val1, val2):检查 val1 < val2
ASSERT_LE(val1, val2):检查 val1 <= val2
ASSERT_GT(val1, val2):检查 val1 > val2
ASSERT_GE(val1, val2):检查 val1 >= val2
3、字符串比较断言
EXPECT_STREQ(str1,str2) : 检查str1和str2是相同的字符串
EXPECT_STRNE(str1,str2) : 检查str1和str2是不相同的字符串
EXPECT_STRCASEEQ(str1,str2) : 检查str1和str2是相同的字符串,忽略大小写
EXPECT_STRCASENE(str1,str2) : 检查str1和str2是不相同的字符串,忽略大小写
4、浮点数比较的断言
EXPECT_FLOAT_EQ(val1, val2):检查 val1 和 val2 具有相同的浮点值
EXPECT_DOUBLE_EQ(val1, val2):检查 val1 和 val2 具有相同的双精度值
EXPECT_NEAR(val1, val2, abs_error):检查 val1 和 val2 之间的差值在 abs_error 范围内
//对EXPECE_NEAR的解释
TEST(TestFloatCase, float_case01) {
float a = 2.34732, b = 2.34732;
double c = 6.75433, d = 9.634638;
EXPECT_NEAR(a, c, 5); // success --> [a - c = -4.40701 < 5]
EXPECT_NEAR(c, a, -5); // fail --> [c - a] = 4.40701 > -5]
}
5、布尔值的断言
EXPECT_TRUE(condition):检查 condition 为真
EXPECT_FALSE(condition):检查 condition 为假
生成覆盖率报告
例子:
#include <gtest/gtest.h>
int add(int a,int b)
{
return a+b;
}
int sum(int a,int b)
{
if(a > b){
return a - b;
}else{
return a * b;
}
}
TEST(testCase2,test_GT)
{
EXPECT_GT(add(2,3),3);
}
TEST(testCase1,test_GT)
{
EXPECT_EQ(add(2,3),3);
}
TEST(testCase2,test_GE)
{
EXPECT_GE(add(2,3),5);
}
TEST(testCase1,test_EQ)
{
EXPECT_EQ(sum(2,3),6);
}
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
测试结果
locv
1、在编译过程中加入 -coverage -lgcov
g++ gtest.cpp -std=c++11 -lgtest -lpthread -coverage -lgcov -o exampleTest
2、执行测试
./exampleTest
3、搜索测试覆盖率数据
Lcov -d . -c -o all.info
4、生成报告
Genhtml -o coverage all.info
当前目录下会生成一个coverage文件夹,里面包含一个index.html报告,通过浏览器打开就可以
通过浏览器打开
语句覆盖率(Lines) 函数覆盖率(Functions)分支覆盖率(Branches)
测试用例覆盖率 = (已执行的测试用例数 / 应执行的测试用例总数) * 100%
gcov
要通过gcov生成代码覆盖率。需要在编译时,增加参数 -coverage -lgcov:
g++ gtest.cpp -std=c++11 -lgtest -lpthread -coverage -lgcov -o exampleTest
此处的编译结果除了得到可执行文件exampleTest,还会得到一个文件gtest.gcno,该文件包含了代码与行号的信息,在生成覆盖率时会需要这个文件。
执行exampleTest时,还会得到每个源码文件对应的gcda后缀的文件。由gtest.gcda 和 gtest.gcno这两个文件,便可以得到代码的覆盖率结果了。
通gcov指定源文件名称就可以得到覆盖率报告结果的文件,后缀.gcov
gcov gtest
cat gtest.cpp.gcov
-: 0:Source:gtest.cpp
-: 0:Graph:gtest.gcno
-: 0:Data:gtest.gcda
-: 0:Runs:1
-: 0:Programs:1
-: 1:#include <gtest/gtest.h>
-: 2:
3: 3:int add(int a,int b)
-: 4:{
3: 5: return a+b;
-: 6:}
-: 7:
1: 8:int sum(int a,int b)
-: 9:{
1: 10: if(a > b){
#####: 11: return a - b;
-: 12: }else{
1: 13: return a * b;
-: 14: }
-: 15:
-: 16:}
5: 17:TEST(testCase2,test_GT)
-: 18:{
1: 19: EXPECT_GT(add(2,3),3);
1: 20:}
-: 21:
5: 22:TEST(testCase1,test_GT)
-: 23:{
1: 24: EXPECT_EQ(add(2,3),3);
1: 25:}
-: 26:
5: 27:TEST(testCase2,test_GE)
-: 28:{
1: 29: EXPECT_GE(add(2,3),5);
1: 30:}
-: 31:
5: 32:TEST(testCase1,test_EQ)
-: 33:{
1: 34: EXPECT_EQ(sum(2,3),6);
1: 35:}
-: 36:
1: 37:int main(int argc, char **argv) {
1: 38: ::testing::InitGoogleTest(&argc, argv);
1: 39: return RUN_ALL_TESTS();
3: 40:}
- -:表示该行代码被覆盖了
- 整数:表示被执行的次数
- #####:表示该行没有被覆盖