gTest框架的使用

一.什么是gTest

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

二.gTest概念解释

2.gtest系列之TEST宏

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

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

3.gtest系列之断言

gtest中断言的宏可以分为两类:一类是ASSERT宏,另一类就是EXPECT宏了。
(1)、ASSERT_系列:如果当前点检测失败则退出当前函数.
(2)、EXPECT_系列:如果当前点检测失败则继续往下执行.
如果你对自动输出的错误信息不满意的话,也是可以通过operator<<能够在失败的时候打印日志,将一些自定义的信息输出。

(1)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)

(2)EXPECT_系列,也是具有类似的宏结构的

bool值检查
数值型数据检查:
字符串检查

4. gtest系列之事件机制

“事件” 本质是框架给你提供了一个机会, 让你能在这样的几个机会来执行你自己定制的代码, 来给测试用例准备/清理数据。gtest提供了多种事件机制,总结一下gtest的事件一共有三种:
1、TestSuite事件
需要写一个类,继承testing::Test,然后实现两个静态方法:SetUpTestCase 方法在第一个TestCase之前执行;TearDownTestCase方法在最后一个TestCase之后执行。
2、TestCase事件
是挂在每个案例执行前后的,需要实现的是SetUp方法和TearDown方法。SetUp方法在每个TestCase之前执行;TearDown方法在每个TestCase之后执行。
3、全局事件
要实现全局事件,必须写一个类,继承testing::Environment类,实现里面的SetUp和TearDown方法。SetUp方法在所有案例执行前执行;TearDown方法在所有案例执行后执行。
例如全局事件可以按照下列方式来使用:除了要继承testing::Environment类,还要定义一个该全局环境的一个对象并将该对象添加到全局环境测试中去。

5. gtest系列之死亡测试

这里的”死亡”指的是程序的奔溃。通常在测试的过程中,我们需要考虑各种各样的输入,有的输入可能直接导致程序奔溃,这个时候我们就要检查程序是否按照预期的方式挂掉,这也就是所谓的”死亡测试”。
死亡测试所用到的宏:
1、ASSERT_DEATH(参数1,参数2),程序挂了并且错误信息和参数2匹配,此时认为测试通过。如果参数2为空字符串,则只需要看程序挂没挂即可。
2、ASSERT_EXIT(参数1,参数2,参数3),语句停止并且错误信息和被提前给的信息匹配。

三.gTest框架demo

1.无事件机制的TEST

框架如下, 其中main作为测试用例的入口,return RUN_ALL_TESTS()告诉程序跑完所有的测试单例.

#include <gtest/gtest.h>
#include "your_algo_headfile.h" //Class YourAlgo

TEST(YourAlgo, Test1){
YourAlgo your_algo_;  //instantite
//define input
//define output
output = your_algo(input);
EXPECT_NEAR(expected_value1, output.name1,  deviation1);
EXPECT_NEAR(expected_value2, output.name2,  deviation2);
EXPECT_NEAR(expected_value3, output.name3,  deviation3);
EXCEPT_EQ(expected_value4, output.name4);
EXCEPT_EQ(true, output.name3);
}

TEST(YourAlgo, Test2){
YourAlgo your_algo_;  //instantite
//define input
//define output
output = your_algo(input);
EXPECT_NEAR(expected_value1, output.name1,  deviation1);
EXPECT_NEAR(expected_value2, output.name2,  deviation2);
EXPECT_NEAR(expected_value3, output.name3,  deviation3);
EXCEPT_EQ(expected_value4, output.name4);
EXCEPT_EQ(true, output.name3);
}

int main(int argc, char **argv) {
  testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}

2.使用TEST_F宏命令(TestSuite事件)

TEST_F与TEST的区别是,TEST_F提供了一个初始化函数(SetUp)和一个清理函数(TearDown),在TEST_F中使用的变量可以在初始化函数SetUp中初始化,在TearDown中销毁,并且所有的TEST_F是互相独立的,都是在初始化以后的状态开始运行,一个TEST_F不会影响另一个TEST_F所使用的数据.

框架如下:


```cpp
#include <gtest/gtest.h>
#include "your_algo_headfile.h" // class YourAlgo

cass AlgoTest : public testing::test{
protected:
 YourAlgo *your_algo_;
 virtual void SetUp(){ //初始化函数
 this->your_algo_ = new YourAlgo;
 }
 virtual void TearDown(){ //清理函数
 delete this->your_algo_;
 }
};

//Test 1
TEST_F(AlgoTest, Test1){
//define input
//define output
//output = your_algo_->Algo(Input);
EXPECT_EQ(expected_value, output.valus);
EXPECT_NEAR(expected_value, output.valus);
}

//Test 1
TEST_F(AlgoTest, Test2){
//define input
//define output
//output = your_algo_->Algo(Input);
EXPECT_EQ(expected_value, output.valus);
EXPECT_NEAR(expected_value, output.valus);
}

Reference:
https://blog.csdn.net/yasi_xi/article/details/8717977
http://www.uml.org.cn/Test/201905061.asp
仅做个人学习记录使用, 侵删.

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值