前言
在ROS(Robot Operating System)中,gtest
(Google Test)是一个广泛使用的C++测试框架,用于编写和执行单元测试。这些测试可以验证ROS节点、服务和消息等的正确性和性能。
如果我们需要在写的包中添加测试,gtest是一个好的选择。在ROS中使用gtest进行单元测试的基本步骤如下:
- 编写测试代码:首先,我们需要编写使用gtest框架的C++测试代码。这些代码通常位于一个单独的ROS包中,并包含定义测试用例的
TEST
宏。 - 配置CMakeLists.txt:在我们的ROS包的
CMakeLists.txt
文件中,需要添加必要的gtest依赖项和编译指令。这通常包括find_package(catkin REQUIRED COMPONENTS roscpp rospy gtest)
来查找gtest包,以及catkin_add_gtest
来添加gtest测试目标。 - 构建和运行测试:使用ROS的构建系统(如catkin或colcon)来构建包。构建完成后,可以使用
rostest
或ctest
等命令来运行gtest测试。
动动手
如果我们需要在一个基于ament_cmake的功能包中添加单元测试,可以借鉴如下方法流程。
功能包配置
源代码
我们从test/tutorial_test.cpp里面的代码开始。
#include <gtest/gtest.h>
TEST(package_name, a_first_test)
{
ASSERT_EQ(4, 2 + 2);
}
int main(int argc, char** argv)
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
package.xml
添加下面的语句到package.xml
<test_depend>ament_cmake_gtest</test_depend>
CMakeLists.txt
if(BUILD_TESTING)
find_package(ament_cmake_gtest REQUIRED)
ament_add_gtest(${PROJECT_NAME}_tutorial_test test/tutorial_test.cpp)
target_include_directories(${PROJECT_NAME}_tutorial_test PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:include>
)
ament_target_dependencies(${PROJECT_NAME}_tutorial_test
std_msgs
)
target_link_libraries(${PROJECT_NAME}_tutorial_test name_of_local_library)
endif()
我们将测试代码涵括在if/endif语句块中,当宏BUILD_TESTING为真时,即编译测试模块。其中的ament_add_gtest函数很像add_executable,所以我们同样需要调用target_include_directories,ament_target_dependencies和target_link_libraries来包括我们需要的文件。
构建运行
参见上一篇博文。其实在之前创建的ros2_ws工作空间路径下(我们已经在此空间下练习了很多例子),我们可以直接运行colcon test命令,就会将该工作空间下的所有包都执行了次单元测试(如果需要单独测试某个包也可以colcon test --package-select <package_name>),也可以通过上一篇博文中的colcon test-result --all命令进行查看结果。
在工作空间根路径下的build文件夹下,对应的包路径下会生成Testing文件夹,里面包含了一些单元测试的结果或记录文件。
本篇稍显粗略,不够详实,除原文就是这样短小的篇幅外(官方的教程应该也是由好几位人士进行编写,有的很详细,有的适中,有的很粗略),与博主自身水平不足也有莫大关系,前期缺乏单元测试相关经验, 目前还存在一些盲点,所以也不敢瞎编乱造(原计划结合一个具体的例子来阐释此知识点)。待这些盲点扫除后会再次更新此篇。
本篇完。