前言
为什么要学GTest
开源框架,完全免费
用得人多,项目多,比如ROS就用这个做测试,这是我学习GTEST的直接原因
软件工程师入门啊!
目录
致谢
好的测试框架应该是(软件测试思想)
软件应该是独立的且可重复的,每个测试应该是一个独立的对象
应该有一套好的方法来组织测试,这种组织方法能够较好的反映程序代码的结构
测试应该是可迁移的且可复用的(平台中立)(支持多种编译器)
在测试失败时,要能够提供足够充分的测试信息
测试框架应该让开发者从琐碎的工作中解脱出来,让他们能够专注在测试内容上
测试应该是高效的
科普
如果你是一名开发工程师,或者你编写的程序要用到生产环境中,那么,你不可避免的需要学习和掌握一种自动化测试框架,以确保你的程序测试充分,质量上乘。
其实啊,测试工具是什么并不重要,重要的是测试思想,还是在大学期间上过的课,亲身做过的项目才是真货,好吧,去考个计算机三级软件测试技术?
GTest 入门
综述
第一步就是:把gtest编译成一个库,并且链接到你的测试程序中
你的测试项目程序要引用gtest/gtest.h,你的gtest安装在GTEST_ROOT路径下
断言assertion
gtest 中的断言是一些宏,assertion在测试一个函数时,可以有两种方案,即ASSERT*和EXPECT。在失败发生时,ASSERT_这类assertion会产生fatal failure,并且会终止当前函数;而EXPECT_*则只会产生nonfatal failure。
常用的宏有
EXPECT_EQ/NE/LT/LE/GT/GE([表达式],[表达式])
对于ASSERT_EQ比较两个C字符串指针,只会检查两个指针是否指向同一块区域,要想检查两个(C风格字符串)字符串内容是否相同,要使用ASSERT_STREQ,不过比较两个C++字符串的话就用ASSERT_EQ就可以了。
特殊的比较宏——字符串比较宏
ASSERT_STRCASEEQ(),此处CASE指不区分大小写的比较
- 字符串比较宏的特殊规则
NULL和空字符串””是不相等的。
- 如果你想了解更多有关字符串比较的trick方法,比如在assertion中处理子字符串、前缀、后缀、正则匹配等,请进入“高级gtest指南”。
创建一个test
- 三件事
使用TEST()宏来定义和命名一个test函数,这个test函数不需要return任何值。
在这个test函数中,你可以写任何C++语句,并且使用assertion来检查。
这个test的结果是由assertion决定的。如果任何一个assertion失败了,或者这个test函数崩溃了,这个test则会返回fail。否则,会返回success。
- 语法
1 |
|
- Test Fixtures
如果你发现你所写的多个test都在操作类似的数据,那么我推荐你使用test fixture。这个特性允许你在不同的test里复用相同的配置。
机制主要是类的继承,具体请看参考教程,见文首
使用Test Fixtures时的宏
1 |
|
运行测试
如果要触发运行,请执行RUN_ALL_TESTS()宏,如果所有的test都测试通过,它会返回0,否则会返回1。
- 注意
你bixu在你的main函数中return这个值。
编写测试的main函数
- 参考如下模板
1 |
|
ROSTest 学习
- rostest是roslaunch的扩展,允许跨越多节点进行测试!文件格式可以是.test或.launch,非常建议将测试launch文件嵌入到普通launch文件中
编写测试
前期概念
两种层次上的测试:一种是节点层级的测试,主要测试节点与节点之间的交互是否有效,如消息订阅,服务请求等;另一种是代码层级的测试,主要测试节点内部具体执行的程序的有效性,如特定算法。
实际上需要编写一些测试节点来运行测试,rostest基于gtest框架
编写
构造描述文件
- CMakeLists
1 |
|
- Package.xml
1 |
- launch file
1 |
|
launch 文件会启动节点后立即启动测试节点