Gtest单元测试
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ห้องสมุดไป่ตู้
1.2 xUnit简介
创建 testMethod_1
测试用 例对象 建立 夹具
执行
每个测试依次执行的4个不同阶段: 1、建立测试夹具(Fixture) ;
测试运行器 套件 运行 创建
测试 套件 对象
执行 验证 拆卸
执行
SUT
2、与SUT(System Under Test)交互;
3、验证结果; 4、拆卸测试Fixture,返回初始状态。
Gtest工程产生exe文件图
运行输出案例表参数图示
参数列表
测试案例集合参数
测试案例输出参数
测试案例异常处理参数
1.3.5 death测试
在测试过程中,对于可能导致程序崩溃的输入,我们可 以检查程序是否按预期的方式崩溃,验证崩溃结果。
注意事项: 1. 不要在死亡测试里释放内存。 2. 在父进程里再次释放内存。 3. 不要在程序中使用内存堆检查。
VS2008下简单实现示例
EXPECT_EXIT(statement, predicate, regex) 1. statement是被测试的代码语句 2. predicate 在这里必须是一个委托,接收int型参数,并返回bool。 只有当返回值为true时,死亡测试案例才算通过。
VS2008下简单实现示例
感谢您的关注
1.5 Googletest 使用
(1)创建单元测试工程
RUN_ALL_TESTS()宏功能: 1.Saves the state of all Google Test flags. 2.Creates a test fixture object for the first test. 3.Initializes it via SetUp(). 4.Runs the test on the fixture object. 5.Cleans up the fixture via TearDown(). 6.Deletes the fixture. 7.Restores the state of all Google Test flags. 8.Repeats the above steps for the next test, until all tests have run.
testMethod_n 创建
testMethod_n
测试 用例类
1.3 Googletest 特性
断 言
事件机制 参数化测试 运行参数 death测试
1.3.1 断
言
断言宏分类: (1) ASSERT_*系列:检查点失败时,推出当前函数 (2) EXPECT_*系列:检查点失败时,继续往下执行
TestCase事件
TestCase事件发生在每个TestCase执行前后 1. SetUp()方法在每个TestCase执行前执行 2. TearDown()方法在每个TestCase执行后执行
1.3.3 参数化测试
当被测函数需要传入不同的值时,可以考虑Gtest提供 的参数化测试功能。
使用说明:
每个接缝点都有一个激活点,在这些点我们可以改变 代码的行为。 接缝类型: 对象接缝 链接接缝 预处理期接缝(不适用,这里不做介绍)
对象接缝
用子类去覆盖掉基类中的。
图例: 在一个POS系统中Sale类,其中方法Scan()显示商品信息。 伪代码: class Sale { void scan() { ........... 调用设备SDK方法showLine(); ........... } }
INSTANTIATE_TEST_CASE_P(param1,param2,param3) param1:任意取; param2:测试案例的名称; param3:参数生成器 (eg:testing::Values());
1.3.4 运行参数
在运行Gtest时,Gtest提供了一系列的参数可以使我们 对案例的执行进行有效的控制。
Sale +Scan(barcode: string)
Sale +Scan(barcode: string) +virtual ShowLine()
Sale +Scan(barcode: string) +virtual ShowLine()
伪代码: class Sale { void scan() { ........... showLine(); ........... } virtual showLine() { 调用设备SDK方法showLine(); } }
Googletest框架和单元测试
杭州 2011.10.12
内容
Googletest 框架 单元测试(Unit Testing)
Googletest 框架
Googletest 背景 xUnit简介 Googletest 特性 Googletest 环境搭建 Googletest 使用
1.1 Googletest 背景
Googletest是Googletest针对C++测试的开源项目,跨 平台(Linux, Mac OS X, Windows, Cygwin, Windows CE, and Symbian)。 基于xUnit框架,有丰富的断言,自定义断言,事件机 制,death 测试,参数化测试,XML测试报告等。 应用案例: Chromium projects (谷歌浏览器) LLVM (Low Level Virtual Machine) ProtocalBuffers (类似XML数据描述语言)
环境要求:Linux, Windows (requires MSVC 8.0 or above), Cygwin, and Mac (the latter three are supported since v1.3.0).
EXPECT_DEATH(statement, regex);
1. statement是被测试的代码语句 2. regex是一个正则表达式,用来匹 配异常时在stderr中输出的内容
ChildSale +ShowLine()
链接接缝
C++及很多语言在代码编译后,我们是可以在其链接期时改变其行为的。 预编译
源程序
编 译
• 词法分析 • 语法分析 • 语义分析 • 优化汇编代码
• 展开宏 • 处理条件编译指令 • 处理预编译指令 • 删除注释、加标识
.....
.....
链 接
• 地址和空间分配 • 符号决议 • 重定位
布尔值检查
数值型检查
字符串检查
浮点型检查
当断言检查出错时输出的信息并不能很好的帮助你还原当时出错的状况时, 可以使用“<<” 操作符输出指定内容帮助分析出错原因。
1.3.2 事件机制
Gtest事件机制分类:
全局:发生在所有案例执行前后 TestSuite:案例中所有案例执行前后 TestCase: 单个案例前后
伪代码: class Sale { Display display; public Sale(Diaplay display) { this.display=display; } void scan() { display.showLine(); } }
2.2.2 接缝模型
接缝(seam):在程序的一些特殊的点,可以不用修 改源码就可以达到改动代码的行为。
针对以上问题常用处理方法:
伪对象 接缝模型
2.2.1 伪对象
伪对象:指测试中用来替代单元测试环境中无法调用的对象。
图例: 在一个POS系统中Sale类,其中方法Scan()显示商品信息。
伪代码: class Sale { void scan() { ........... 调用设备SDK方法showLine(); ........... } }
汇 编
• 汇编码译为机器码 (目标文件.obj)
可执行应用程序
.....
.....
链接图示
本地实现调用第三方库功能, 在加载阶段去掉第三方库文件,添 加本地的.obj目标文件。
流程图示
参考资料
1. http://code.google.com/p/googletest/wiki/Documentation Gtest官方文档 2. CoderZh技术博客《玩转Google开源C++单元测试框架GoogleTest系列》 3. 《xUnit.Test.Patterns.Refactoring.Test.Code》 4. 《修改代码的艺术》 5. 《程序员的自我修养-链接、装载与库》
如果程序正常退出并且退出码与exit_code相同则返回 true
Windows 下正规表达式风格: Simple风格:GTEST_USES_SIMPLE_RE=1(预处理处添加)
1.4 Googletest 环境搭建
搭建步骤: (1) 设置gtest头文件路径 (2) 设置gtest.lib路径
全局事件
要实现全局事件,必须写一个类,继承testing::Environment类,实 现里面的SetUp和TearDown方法。 1. SetUp()方法在所有案例执行前执行 2. TearDown()方法在所有案例执行后执行
TestSuite事件
需要实现一个类,继承testing::Test,然后实现两个静态方法 1. SetUpTestCase() 方法在第一个TestCase之前执行 2. TearDownTestCase() 方法在最后一个TestCase之后执行
•
•
原则:源代码在产品阶段和测试阶段应该是完全一样 的
2.2 单元测试场景实例分析
在实际编写单元测试中,在单元测试之前的一些对函数所用的初始化 操作通常并不能满足需要,常规的方法并不能解决一些复杂的问题。
例如函数中涉及到对设备sdk调用、socket通信、工程中依赖的一些第三方 库函数的引用等等。单元测试中并不需要对这些纳入到测试中,我们只需要模拟 这些调用产生的结果返回到需要测试的函数即可。
(2)在待测试的类头文件中添加gtest头文件
(3)在待测试的类头文件中添加测试单元声明
此声明实质为待测试类添加友类,下图为gtest源码:
(4)实现测试案例实体和所需的事件机制
宏(TEST/TEST_F)源码分析:
(5)验证和查看单元测试结果
单元测试(Unit Testing)
Unit Testing 单元测试实例分析
2.1 Unit Testing
•
•
单元测试:简单的讲独立的测试每一个函数
良好单元测试的品质: ( 1 ) 运行速度快(<0.1s); ( 2 ) 定位问题所在 以下测试不是单元测试: ( 1 ) 与数据库有交互 ; ( 2 ) 进行了网络通信; ( 3 ) 调用了文件系统; ( 4 ) 需要对环境做特定的准备和配置; 关键:解依赖
1.2 xUnit简介
创建 testMethod_1
测试用 例对象 建立 夹具
执行
每个测试依次执行的4个不同阶段: 1、建立测试夹具(Fixture) ;
测试运行器 套件 运行 创建
测试 套件 对象
执行 验证 拆卸
执行
SUT
2、与SUT(System Under Test)交互;
3、验证结果; 4、拆卸测试Fixture,返回初始状态。
Gtest工程产生exe文件图
运行输出案例表参数图示
参数列表
测试案例集合参数
测试案例输出参数
测试案例异常处理参数
1.3.5 death测试
在测试过程中,对于可能导致程序崩溃的输入,我们可 以检查程序是否按预期的方式崩溃,验证崩溃结果。
注意事项: 1. 不要在死亡测试里释放内存。 2. 在父进程里再次释放内存。 3. 不要在程序中使用内存堆检查。
VS2008下简单实现示例
EXPECT_EXIT(statement, predicate, regex) 1. statement是被测试的代码语句 2. predicate 在这里必须是一个委托,接收int型参数,并返回bool。 只有当返回值为true时,死亡测试案例才算通过。
VS2008下简单实现示例
感谢您的关注
1.5 Googletest 使用
(1)创建单元测试工程
RUN_ALL_TESTS()宏功能: 1.Saves the state of all Google Test flags. 2.Creates a test fixture object for the first test. 3.Initializes it via SetUp(). 4.Runs the test on the fixture object. 5.Cleans up the fixture via TearDown(). 6.Deletes the fixture. 7.Restores the state of all Google Test flags. 8.Repeats the above steps for the next test, until all tests have run.
testMethod_n 创建
testMethod_n
测试 用例类
1.3 Googletest 特性
断 言
事件机制 参数化测试 运行参数 death测试
1.3.1 断
言
断言宏分类: (1) ASSERT_*系列:检查点失败时,推出当前函数 (2) EXPECT_*系列:检查点失败时,继续往下执行
TestCase事件
TestCase事件发生在每个TestCase执行前后 1. SetUp()方法在每个TestCase执行前执行 2. TearDown()方法在每个TestCase执行后执行
1.3.3 参数化测试
当被测函数需要传入不同的值时,可以考虑Gtest提供 的参数化测试功能。
使用说明:
每个接缝点都有一个激活点,在这些点我们可以改变 代码的行为。 接缝类型: 对象接缝 链接接缝 预处理期接缝(不适用,这里不做介绍)
对象接缝
用子类去覆盖掉基类中的。
图例: 在一个POS系统中Sale类,其中方法Scan()显示商品信息。 伪代码: class Sale { void scan() { ........... 调用设备SDK方法showLine(); ........... } }
INSTANTIATE_TEST_CASE_P(param1,param2,param3) param1:任意取; param2:测试案例的名称; param3:参数生成器 (eg:testing::Values());
1.3.4 运行参数
在运行Gtest时,Gtest提供了一系列的参数可以使我们 对案例的执行进行有效的控制。
Sale +Scan(barcode: string)
Sale +Scan(barcode: string) +virtual ShowLine()
Sale +Scan(barcode: string) +virtual ShowLine()
伪代码: class Sale { void scan() { ........... showLine(); ........... } virtual showLine() { 调用设备SDK方法showLine(); } }
Googletest框架和单元测试
杭州 2011.10.12
内容
Googletest 框架 单元测试(Unit Testing)
Googletest 框架
Googletest 背景 xUnit简介 Googletest 特性 Googletest 环境搭建 Googletest 使用
1.1 Googletest 背景
Googletest是Googletest针对C++测试的开源项目,跨 平台(Linux, Mac OS X, Windows, Cygwin, Windows CE, and Symbian)。 基于xUnit框架,有丰富的断言,自定义断言,事件机 制,death 测试,参数化测试,XML测试报告等。 应用案例: Chromium projects (谷歌浏览器) LLVM (Low Level Virtual Machine) ProtocalBuffers (类似XML数据描述语言)
环境要求:Linux, Windows (requires MSVC 8.0 or above), Cygwin, and Mac (the latter three are supported since v1.3.0).
EXPECT_DEATH(statement, regex);
1. statement是被测试的代码语句 2. regex是一个正则表达式,用来匹 配异常时在stderr中输出的内容
ChildSale +ShowLine()
链接接缝
C++及很多语言在代码编译后,我们是可以在其链接期时改变其行为的。 预编译
源程序
编 译
• 词法分析 • 语法分析 • 语义分析 • 优化汇编代码
• 展开宏 • 处理条件编译指令 • 处理预编译指令 • 删除注释、加标识
.....
.....
链 接
• 地址和空间分配 • 符号决议 • 重定位
布尔值检查
数值型检查
字符串检查
浮点型检查
当断言检查出错时输出的信息并不能很好的帮助你还原当时出错的状况时, 可以使用“<<” 操作符输出指定内容帮助分析出错原因。
1.3.2 事件机制
Gtest事件机制分类:
全局:发生在所有案例执行前后 TestSuite:案例中所有案例执行前后 TestCase: 单个案例前后
伪代码: class Sale { Display display; public Sale(Diaplay display) { this.display=display; } void scan() { display.showLine(); } }
2.2.2 接缝模型
接缝(seam):在程序的一些特殊的点,可以不用修 改源码就可以达到改动代码的行为。
针对以上问题常用处理方法:
伪对象 接缝模型
2.2.1 伪对象
伪对象:指测试中用来替代单元测试环境中无法调用的对象。
图例: 在一个POS系统中Sale类,其中方法Scan()显示商品信息。
伪代码: class Sale { void scan() { ........... 调用设备SDK方法showLine(); ........... } }
汇 编
• 汇编码译为机器码 (目标文件.obj)
可执行应用程序
.....
.....
链接图示
本地实现调用第三方库功能, 在加载阶段去掉第三方库文件,添 加本地的.obj目标文件。
流程图示
参考资料
1. http://code.google.com/p/googletest/wiki/Documentation Gtest官方文档 2. CoderZh技术博客《玩转Google开源C++单元测试框架GoogleTest系列》 3. 《xUnit.Test.Patterns.Refactoring.Test.Code》 4. 《修改代码的艺术》 5. 《程序员的自我修养-链接、装载与库》
如果程序正常退出并且退出码与exit_code相同则返回 true
Windows 下正规表达式风格: Simple风格:GTEST_USES_SIMPLE_RE=1(预处理处添加)
1.4 Googletest 环境搭建
搭建步骤: (1) 设置gtest头文件路径 (2) 设置gtest.lib路径
全局事件
要实现全局事件,必须写一个类,继承testing::Environment类,实 现里面的SetUp和TearDown方法。 1. SetUp()方法在所有案例执行前执行 2. TearDown()方法在所有案例执行后执行
TestSuite事件
需要实现一个类,继承testing::Test,然后实现两个静态方法 1. SetUpTestCase() 方法在第一个TestCase之前执行 2. TearDownTestCase() 方法在最后一个TestCase之后执行
•
•
原则:源代码在产品阶段和测试阶段应该是完全一样 的
2.2 单元测试场景实例分析
在实际编写单元测试中,在单元测试之前的一些对函数所用的初始化 操作通常并不能满足需要,常规的方法并不能解决一些复杂的问题。
例如函数中涉及到对设备sdk调用、socket通信、工程中依赖的一些第三方 库函数的引用等等。单元测试中并不需要对这些纳入到测试中,我们只需要模拟 这些调用产生的结果返回到需要测试的函数即可。
(2)在待测试的类头文件中添加gtest头文件
(3)在待测试的类头文件中添加测试单元声明
此声明实质为待测试类添加友类,下图为gtest源码:
(4)实现测试案例实体和所需的事件机制
宏(TEST/TEST_F)源码分析:
(5)验证和查看单元测试结果
单元测试(Unit Testing)
Unit Testing 单元测试实例分析
2.1 Unit Testing
•
•
单元测试:简单的讲独立的测试每一个函数
良好单元测试的品质: ( 1 ) 运行速度快(<0.1s); ( 2 ) 定位问题所在 以下测试不是单元测试: ( 1 ) 与数据库有交互 ; ( 2 ) 进行了网络通信; ( 3 ) 调用了文件系统; ( 4 ) 需要对环境做特定的准备和配置; 关键:解依赖