ROS 2边学边练(43)-- 利用GTest写一个基本测试(C++)

前言

        在ROS(Robot Operating System)中,gtest(Google Test)是一个广泛使用的C++测试框架,用于编写和执行单元测试。这些测试可以验证ROS节点、服务和消息等的正确性和性能。

        如果我们需要在写的包中添加测试,gtest是一个好的选择。在ROS中使用gtest进行单元测试的基本步骤如下:

  1. 编写测试代码:首先,我们需要编写使用gtest框架的C++测试代码。这些代码通常位于一个单独的ROS包中,并包含定义测试用例的TEST宏。
  2. 配置CMakeLists.txt:在我们的ROS包的CMakeLists.txt文件中,需要添加必要的gtest依赖项和编译指令。这通常包括find_package(catkin REQUIRED COMPONENTS roscpp rospy gtest)来查找gtest包,以及catkin_add_gtest来添加gtest测试目标。
  3. 构建和运行测试:使用ROS的构建系统(如catkin或colcon)来构建包。构建完成后,可以使用rostestctest等命令来运行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_teststd_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文件夹,里面包含了一些单元测试的结果或记录文件。

 

 

        本篇稍显粗略,不够详实,除原文就是这样短小的篇幅外(官方的教程应该也是由好几位人士进行编写,有的很详细,有的适中,有的很粗略),与博主自身水平不足也有莫大关系,前期缺乏单元测试相关经验, 目前还存在一些盲点,所以也不敢瞎编乱造(原计划结合一个具体的例子来阐释此知识点)。待这些盲点扫除后会再次更新此篇。

本篇完。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/671258.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五月节放假作业讲解

目录 作业1&#xff1a; 问题&#xff1a; 结果如下 作业2&#xff1a; 结果: 作业1&#xff1a; 初始化数组 问题&#xff1a; 如果让数组初始化非0数会有问题 有同学就问了&#xff0c;我明明已经初始化定义过了&#xff0c;为啥还有0呀 其实这种初始化只会改变第一个…

python绘图(pandas)

matplotlib绘图 import pandas as pd abs_path rF:\Python\learn\python附件\pythonCsv\data.csv df pd.read_csv(abs_path, encodinggbk) # apply根据多列生成新的一个列的操作&#xff0c;用apply df[new_score] df.apply(lambda x : x.数学 x.语文, axis1)# 最后几行 …

OpenHarmony实战开发-如何使用Web组件加载页面

页面加载是Web组件的基本功能。根据页面加载数据来源可以分为三种常用场景&#xff0c;包括加载网络页面、加载本地页面、加载HTML格式的富文本数据。 页面加载过程中&#xff0c;若涉及网络资源获取&#xff0c;需要配置ohos.permission.INTERNET网络访问权限。 加载网络页面…

图搜索算法 - 深度优先搜索法(DFS)

图搜索算法 图搜索算法也可以叫图的遍历&#xff0c;指从图上任意一个顶点出发&#xff0c;访问图上的所有顶点&#xff0c;而且只能访问一次。这和上一节树的遍历功能类似。但由于图没有层级结构&#xff0c;也没有类似树的根结点那样的特殊顶点&#xff0c;因此相对要复杂一…

Day_1

1. 环境搭建 技术选型 后端项目结构 sky-take-out maven父工程&#xff0c;统一管理依赖版本&#xff0c;聚合其他子模块 sky-common 子模块&#xff0c;存放公共类&#xff0c;例如&#xff1a;工具类、常量类、异常类等 sky-pojo 子模块&#xff0c;存放实体类、VO、DTO…

行业唯一!易保全牵头编制的《区块链数据访问安全技术通则》发布

近日&#xff0c;易保全牵头参与编制的《区块链数据访问安全技术通则》经中国国际经济技术合作促进会正式发布&#xff0c;为中国区块链数据安全技术提供了标准参考。 易保全作为牵头起草单位、易保全CEO兼董事长刘刚担任主要起草人参与其中&#xff0c;在区块链技术安全风险…

美业SaaS系统多门店收银系统源码-【分润常见问题】讲解(一)

美业管理系统源码 博弈美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 促销活动 PC管理后台、手机APP、iPad APP、微信小程序 ▶ 分润常见问题&#xff1a; 1、分润金额基数 所有分润计算的基数均为平台订单中各个商…

一个JDBC小工具

pom.xml 结构 <properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><mysql5>5.1.44<…

从ChatGPT革命性的对话系统,看人机交互模式6个阶段的演变

ChatGPT引领革命&#xff0c;看人机交互六步飞跃 ©作者|wy 来源|神州问学 引言 在科技的浪潮中&#xff0c;人机交互模式不断演进&#xff0c;从最初的简单指令输入到如今的智能对话系统&#xff0c;每一次革新都昭示着人类与机器交流方式的深刻变革。ChatGPT&#xff0…

RabbitMQ 是如何做延迟消息的 ?——Java全栈知识(15)

RabbitMQ 是如何做延迟消息的 &#xff1f; 1、什么是死信&#xff1f; 当一个队列中的消息满足下列情况之一时&#xff0c;可以成为死信&#xff08;dead letter&#xff09;&#xff1a; 消费者使用 basic.reject 或 basic.nack 声明消费失败&#xff0c;并且消息的 reque…

【C++】 认识多态 + 多态的构成条件详细讲解

前言 C 目录 1. 多态的概念2 多态的定义及实现2 .1 虚函数&#xff1a;2 .2 虚函数的重写&#xff1a;2 .2.1 虚函数重写的两个例外&#xff1a; 2 .3 多态的两个条件&#xff08;重点&#xff09;2 .4 析构函数为啥写成虚函数 3 新增的两个关键字3.1 final的使用&#xff1a;3…

Java面试题:多线程2

如何停止正在运行的线程 1,使用退出标志,使线程正常退出(run方法中循环对退出标志进行判断) 2,使用stop()方法强行终止(不推荐) 3,调用interrupt()方法中断线程 打断阻塞线程(sleep,wait,join),线程会抛出InterruptedException异常 打断正常的线程,可以根据打断状态来标记…