在系统测试阶段找出并修正错误,要比开发者自己完成这一工作多付出 2 倍的努力。而当系统已经交付使用之后找出并修正一个错误,要比系统测试阶段多付出 9 倍的努力。因此,请坚持让开发者进行单元测试吧。
—— Larry Bernstein ,贝尔通信研究院
C++单元测试框架, 项目主页
断言 Assertions
Gtest提供一整套预定义的断言。断言分为两类:名称以ASSERT_
开头的断言和名称以EXPECT_
开头的断言。
* ASSERT_* 断言失败时会终止当前函数,并记录文件名,行号和某些定制的信息。
* EXPECT_* 断言当失败时仅作记录,继续执行当前函数
断言宏后可以使用输出操作符«进行相关用例的描述。
断言宏有Bool检查,整型检查、浮点型检查、字符串检查(char*)、异常检查等
事件 Test Events
测试执行前通常有一些测试准备工作,执行后有一些清理工作,或者想在用例执行过程中,共享一些数据,这些可以放在事件回调中来做。
- Global事件,在所有用例执行前和后执行
- TestSuite事件,在该TestSuite执行前和后执行
- TestCase事件,在该TestCase执行前和后执行
全局事件
TestSuite事件
TestCase事件
死亡测试 Death Tests
程序宕机处理模块能捕获程序的 除0、非法地址访问、未捕获异常、Abort等程序异常问题,但这个应当怎么来进行单元测试?
死亡测试可以搞定。
参数化测试 Type-Parameterized Tests
比如游戏中的IB商城,通常分为绑金区和金币区,其测试用例有很多相同的,这时候就可以使用参数化测试。
参数生成器
函数 |
说明 |
Range(begin, end[, step]) |
范围在begin~end之间,步长为step,不包括end |
Values(v1, v2, …, vN) |
v1,v2到vN的值 |
ValuesIn(container) and ValuesIn(begin, end) |
从一个C类型的数组或是STL容器,或是迭代器中取值 |
Bool() |
取false 和 true 两个值 |
调试
GTest捕获了assert等异常,这会导致开发时难以调试,可以增加以下参数,启用调试器中断:
GTest的扩展版GMock
Gmock是一套用来模拟类的库,也就是提供单元测试上所需要桩函数。
Main函数
创建mock类
MOCK_METHOD1
说明函数拥有一个参数,GetRole
是函数名,XRole*
是返回值,(DWORD dwID)
是参数。
实现桩函数
使用桩函数
对于全局变量或者函数参数变量的虚函数,桩函数很容易替换上,但对于成员变量,很难搞,要通过模板或者基类指针来替换
本文链接, 未经许可,禁止转载