gtest是对程序进行单元测试的有力工具,能帮助程序员规范化编程,消灭BUG!
安装gtest
1 | sudo apt-get install libgtest-dev |
编写test node
在待测试的package目录下创建一个子目录,命名为test,所有的测试代码在test文件夹下添加。
新建test.cpp:
1 | // ROS头文件 |
不带注释版code,可以直接复制,然后编写测试用例:
1 | #include <ros/ros.h> |
编写CMakeLists.txt
修改CMakeLists.txt,在合适的地方加入:
1 | add_executable(test_node test/test.cpp src/foo.cpp) |
编译运行test node
用catkin_make
编译,rosrun
运行测试节点。
gtest断言
gtest中,断言的宏可以分为两类,一类是ASSERT系列,一类是EXPECT系列。一个直观的解释就是:
- ASSERT_* 系列的断言,在失败时,会立即退出当前的测试用例(即其所在的函数,但不会结束整个测试)
- EXPECT_* 系列的断言,在失败时,会继续执行,不会退出当前测试用例
在每一个大类中,又分为多个小类别,它们分别用于不同目的的测试,如布尔测试、数值测试、字符串测试等等。
布尔测试
布尔测试用于测试给定的值为真还是假,它们包括:
*_TRUE(condition):期望condition为true,若condition为false,则断言失败;
*_FALSE(condition):期望condition为false,若condition为true,则断言失败;
其中*为ASSERT或者EXPECT,后续所有的宏都将采用这种形式。数值比较测试
数值比较测试即比较两个数值之间的大小关系,它们包括:
*_EQ(expected, actual):expected == actual则成功,否则失败;
*_NE(expected, actual):expedted != actual则成功,否则失败;
*_LT(val1, val2):val1 < val2则成功,否则失败;
*_LE(val1, val2):val1 <= val2 则成功,否则失败;
*_GT(val1, val2):val1 > val2则成功,否则失败;
*_GE(val1,val2): val1 >= val2则成功,否则失败;浮点数类型比较
gtest针对浮点数是否相等专门定义了宏,它们包括:
*_FLOAT_EQ(expected, actual):expected与actual相差很小时成功,否则失败;
*_DOUBLE_EQ(expected, actual):expected与actual相差很小时成功,否则失败;
*_NEAR(val1, val2, abs):|val1 - val2| <= abs时成功,否则失败;字符串类型比较
对于字符串,gtest提供字符串相等及不等断言,但它们都只支持C类型的字符串,不支持C++中的std::string和std::wstring,它们包括:
*_STREQ(expected, actual):同时支持char*和wchar_t*,expected和actual的字符串内容相同则成功,否则失败;
*_STRNE(str1, str2):同时支持char*和wchar_t*,str1和str2字符串内容不同则成功,否则失败;
*_STRCASEEQ(expected, actual):只支持char*, expected和actual的字符串内容相同则成功,否则失败;
*_STRCASENE(str1, str2):只支持char*,str1和str2字符串内容不同则成功,否则失败;执行成功与失败标记
在gtest中,测试通过与否有三种状态,它们对应于一个枚举:1
2
3
4
5enum Type {
kSuccess, // Succeeded.
kNonFatalFailure, // Failed but the test can continue.
kFatalFailure // Failed and the test should be terminated.
};每一个枚举值都对应一个宏,通过这个宏我们可以返回相应的执行状态:
kSuccess:成功,对应的宏为SUCCEED();
kNonFatalFailure:虽然失败,但当前测试用例的后续测试仍然继续运行,对应ADD_FAIL();
kFatalFailure:致命错误,当前测试用例后续测试不会执行,对应FAIL();异常检查
gtest中提供检查代码是否抛出异常的方法,它们包括:
*_THROW(statement, exception_type):statement如果抛出exception_type类型异常则成功,否则失败;
*_ANY_THROW(statement):只要statement抛出任何异常则成功,否则失败;
*_NO_THROW(statement):只要statement抛出任何异常则失败,否则成功;
以上是gtest在ROS中的基础应用,有想详细了解gtest的移步博客:玩转Google开源C++单元测试框架Google Test系列(gtest)。