C++ googletest的使用

随笔3个月前发布 大风歌
37 0 0

概念介绍

什么是gtest

gtest是一个跨平台的(Liunx、Mac OS X、Windows、Cygwin、Windows CE and Symbian)C++单元测试框架,由google公司发布。gtest是为在不同平台上为编写C++测试而生成的。它提供了丰富的断言、致命和非致命判断、参数化、”死亡测试”等等。

TEST宏




TEST(test_case_name, test_name)


TEST_F(test_fixture,test_name)  //多个测试场景需要相同数据配置的情况,用TEST_F。TEST_F  test fixture,测试夹具,测试套,承担了一个注册的功能。

EST宏的作用是创建一个简单测试,它定义了一个测试函数,在这个函数里可以使用任何C++代码并使用提供的断言来进行检查。

断言

要测试一个类或函数,我们需要对其行为做出断言。当一个断言失败时,Google Test会在屏幕上输出该代码所在的源文件及其所在的位置行号,以及错误信息。也可以在编写断言时,提供一个自定义的错误信息,这个信息在失败时会被附加在Google Test的错误信息之后。

GoogleTest的断言是一种类似于函数调用的断言机制。我们可以在GoogleTest本身的断言消息后面定义自己的测试失败信息。下面说明几种不同断言方式:

ASSERT_*产生fatal failures,直接终止当前函数的运行
EXPECT_*: 产生nonfatal failures,不会终止当前函数运行
EXPECT_*: 最常用的一种方式,可以允许报告产生一个或者多个failer

即,ASSERT_*版本的断言失败时会产生致命失败,并结束当前函数。EXPECT_*版本的断言产生非致命失败,而不会中止当前函数。通常更推荐使用EXPECT_*断言,因为它们运行一个测试中可以有不止一个的错误被报告出来。但如果在编写断言如果失败,就没有必要继续往下执行的测试时,你应该使用ASSERT_*断言。 因为失败的ASSERT_*断言会立刻从当前的函数返回,可能会跳过其后的一些的清洁代码,这样也许会导致空间泄漏。

常用的断言类型




bool值检查


1>、 ASSERT_TRUE(参数),期待结果是true


2>、ASSERT_FALSE(参数),期待结果是false


数值型数据检查


3>、ASSERT_EQ(参数1,参数2),传入的是需要比较的两个数  equal


4>、ASSERT_NE(参数1,参数2),not equal,不等于才返回true


5>、ASSERT_LT(参数1,参数2),less than,小于才返回true


6>、ASSERT_GT(参数1,参数2),greater than,大于才返回true


7>、ASSERT_LE(参数1,参数2),less equal,小于等于才返回true


8>、ASSERT_GE(参数1,参数2),greater equal,大于等于才返回true


字符串检查


9>、ASSERT_STREQ(expected_str, actual_str),两个C风格的字符串相等才正确返回


10>、ASSERT_STRNE(str1, str2),两个C风格的字符串不相等时才正确返回


11>、ASSERT_STRCASEEQ(expected_str, actual_str)


12>、ASSERT_STRCASENE(str1, str2)

注:以上ASSERT_关键字替换为EXPECT_即为EXPECT_系列宏,同样可以使用。

断言补充日志

如果你对自动输出的错误信息不满意的话,也是可以通过operator<<能够在失败的时候打印日志,将一些自定义的信息输出。如下:




ASSERT_EQ(x.size(), y.size()) << "Vectors x and y are of unequal length";


 


for (int i = 0; i < x.size(); ++i) {


  EXPECT_EQ(x[i], y[i]) << "Vectors x and y differ at index " << i;


}

注意,任何可以写入流ostream的,都可被写入断言宏,比如C的字符串、string对象,甚至可以是广义上的字符(流):Windows的Unicode下的wchar_t*、 TCHAR*或者C++的std::string。所有流的输入都会转化成UTF-8的格式。

断言使用实例

以下测试,实现一个求绝对值的函数,并在TEST宏里面使用ASSERT来进行测试不同类型的数据。




#include <iostream>


#include <gtest/gtest.h>


 


using namespace std;


 


int Abs(int x)


{


    return x > 0 ? x : -x;


}


 


TEST(IsAbsTest, HandlerTrueReturn)


{


    ASSERT_TRUE(Abs(1) == 1) << "Abs(1)=1"; //添加自定义输出信息


    ASSERT_TRUE(Abs(-1) == 1) << "Abs(-1)=1";


    ASSERT_FALSE(Abs(-2) == -2); //期待结果是false


    ASSERT_EQ(Abs(1), Abs(-1));


    ASSERT_NE(Abs(-1), 0);


    ASSERT_GT(Abs(-1), 0);


    ASSERT_LE(Abs(-1), 2);


    ASSERT_GE(Abs(-1), 0);


}


 


int main(int argc, char *argv[])


{


    testing::InitGoogleTest(&argc, argv);


 


    return RUN_ALL_TESTS();


}

1、测试一切正确

编译上面demo

g++ -o gtest_assert_demo gtest_assert_demo.cpp -std=c++11 -lgtest -lpthread

执行

C++ googletest的使用

2、测试出现失败用例

将上面代码中第一行的ASSERT_TRUE修改为ASSERT_FALSE。即:

ASSERT_FALSE(Ab
© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...