【ROS2】测试
为什么要进行自动化测试?
以下是我们应该进行自动化测试的许多重要原因之一:
您可以更快地对代码进行增量更新。ROS 有数百个包,具有许多相互依赖关系,因此很难预见一个小变化可能引起的问题。如果您的更改通过了单元测试,您可以更有信心地认为您没有引入问题——或者至少问题不是您的错。
您可以更自信地重构代码。通过单元测试可以验证您在重构时没有引入任何错误。这让您摆脱了对变化的恐惧,获得了这种美妙的自由!
它导致更好的代码设计。单元测试迫使你编写代码,使其更容易测试。这通常意味着保持底层函数和框架分离,这是我们设计 ROS 代码的目标之一。
他们防止重复出现的错误(错误回归)。为你修复的每个错误编写单元测试是一个好习惯。事实上,在修复错误之前编写单元测试。这将帮助你精确地,甚至是确定性地重现错误,并更精确地理解问题所在。结果,你还将创建一个更好的补丁,然后可以使用回归测试来验证错误是否已修复。这样,如果代码在以后被修改,错误就不会意外地重新引入。这也意味着说服补丁审查员问题已解决,并且贡献质量很高会更容易。
其他人可以更容易地处理你的代码(自动文档形式)。当你进行更改时,很难判断你是否破坏了别人的代码。单元测试是其他开发人员验证其更改的工具。自动测试记录你的编码决策,并自动向其他开发人员传达其违规行为。因此,测试成为你的代码的文档——一种大多数时间不需要阅读的文档,当需要检查时,测试系统会准确指示需要阅读的内容(哪些测试失败)。通过编写自动测试,你使其他贡献者更快。这改善了整个 ROS 项目。
如果我们有自动化单元测试,成为 ROS 的贡献者会容易得多。对于新的外部开发人员来说,向您的组件做出贡献是非常困难的。当他们对代码进行更改时,通常是在盲目操作,依靠大量的猜测。通过提供自动化测试的工具,您可以帮助他们完成任务。他们会立即获得更改的反馈。这样更容易为项目做出贡献,新贡献者也更容易加入。此外,他们的首次贡献质量更高,从而减少了维护人员的工作量。这是双赢的局面!
自动测试简化了维护工作。特别是对于变化较慢的成熟软件包,主要需要更新到新的依赖项,自动测试套件有助于快速确定软件包是否仍然有效。这使得决定软件包是否仍然受支持变得更加容易。
自动测试放大了持续集成的价值。回归测试以及基于正常场景的需求测试,有助于为您的组件提供整体的自动化测试。您的组件在依赖的其他 API 演变过程中得到了更好的测试(CI 服务器将更好、更准确地告诉您代码中出现的问题)。
也许编写测试最重要的好处是测试使你成为一个好公民。测试从长远来看会影响质量。这是许多开源项目中广泛接受的做法。通过编写回归测试,你正在为 ROS 生态系统的长期质量做出贡献。
这一切都是免费的吗?
当然,天下没有免费的午餐。要获得测试的好处,必须进行一些投资。
您需要开发一个测试,这有时可能会很困难或昂贵。有时它也可能并非易事,因为测试应该是自动化的。如果您的测试涉及特殊硬件(不应该:尝试使用模拟、模拟硬件或将测试缩小到较小的软件问题)或需要外部环境,例如人类操作员,事情会变得特别棘手。
回归测试和其他自动测试需要维护。当组件的设计发生变化时,许多测试会失效(例如,它们不再编译,或抛出与 API 设计相关的运行时异常)。这些测试失败不仅是因为重新设计重新引入了错误,还因为它们需要更新到新的设计。偶尔,对于较大的重新设计,旧的回归测试应该被删除。
大量的测试可能需要很长时间才能运行,这会增加持续集成服务器的成本。
可用教程:
从命令行运行 ROS 2 测试
使用 GTest 编写 C++ 基本测试
用 Python 编写基本测试
从命令行运行 ROS 2 测试
构建并运行你的测试
要编译和运行测试,只需从 colcon
运行测试动词 https://colcon.readthedocs.io/en/released/reference/verb/test.html 。
colcon test --ctest-args tests [package_selection_args]
(其中 package_selection_args
是 colcon
的可选包选择参数,用于限制构建和运行的包)
在测试之前获取工作区应该是不必要的。 colcon test
确保测试在正确的环境中运行,能够访问它们的依赖项等。
检查测试结果
要查看结果,只需从 colcon
运行 test-result 动词。https://colcon.readthedocs.io/en/released/reference/verb/test-result.html
colcon test-result --all
要查看确切的失败测试用例,请使用 --verbose
标志:
colcon test-result --all --verbose
使用 GDB 调试测试
有关使用 GDB 调试测试的详细指南,请参阅 GDB 教程 https://docs.ros.org/en/jazzy/How-To-Guides/Getting-Backtraces-in-ROS-2.html 。
使用 GTest 编写 C++ 基本测试
起点:我们假设您已经设置了一个基本的 ament_cmake 包,并且您想要添加一些测试。
在本教程中,我们将使用 gtest。https://google.github.io/googletest/primer.html
程序包设置
源代码
我们将从一个名为 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>)target_link_libraries(${PROJECT_NAME}_tutorial_test name_of_local_library)
endif()
测试代码被包装在 if/endif
块中,以尽可能避免构建测试。 ament_add_gtest
的功能类似于 add_executable
,因此您需要像往常一样调用 target_include_directories
、 ament_target_dependencies
和 target_link_libraries
。
运行测试
请参阅有关如何从命令行运行测试 https://docs.ros.org/en/jazzy/Tutorials/Intermediate/Testing/CLI.html 的教程,以获取有关运行测试和检查测试结果的更多信息。
用 Python 编写基本测试
起点:我们假设您已经设置了一个基本的 ament_python 包,并且您想为其添加一些测试。
如果您使用 ament_cmake_python,请参阅 ament_cmake_python 文档以了解如何使测试可发现。测试内容和使用 colcon
的调用保持不变。
程序包设置
setup.py
您的 setup.py
必须在调用 setup(...)
时对 pytest
有测试依赖:
tests_require=['pytest'],
测试文件和文件夹
您的测试代码需要放在包根目录中名为 tests
的文件夹中。
任何包含您要运行的测试的文件必须具有模式 test_FOO.py
,其中 FOO
可以替换为任何内容。
示例包布局:
awesome_ros_package/awesome_ros_package/__init__.pyfozzie.pypackage.xmlsetup.cfgsetup.pytests/test_init.pytest_copyright.pytest_fozzie.py
测试内容
您现在可以尽情编写测试了。关于 pytest 有很多资源,但简而言之,您可以编写带有 test_
前缀的函数,并包含您想要的任何断言语句。
def test_math():assert 2 + 2 == 5 # This should fail for most mathematical systems
运行测试
请参阅有关如何从命令行运行测试的教程,以获取有关运行测试和检查测试结果的更多信息。
特殊命令
除了标准的 colcon 测试命令外,您还可以使用 --pytest-args
标志从命令行向 pytest
框架指定参数。例如,您可以指定要运行的函数名称。
colcon test --packages-select <name-of-pkg> --pytest-args -k name_of_the_test_function
要在运行测试时查看 pytest 输出,请使用以下标志:
colcon test --event-handlers console_cohesion+
相关文章:
【ROS2】测试
为什么要进行自动化测试? 以下是我们应该进行自动化测试的许多重要原因之一: 您可以更快地对代码进行增量更新。ROS 有数百个包,具有许多相互依赖关系,因此很难预见一个小变化可能引起的问题。如果您的更改通过了单元测试…...
别卷模型,卷应用:从李彦宏的AI观点谈起
2024年7月4日,世界人工智能大会暨人工智能全球治理高级别会议在上海世博中心隆重召开。百度创始人、董事长兼首席执行官李彦宏在产业发展主论坛上的发言,引起了广泛关注。他提出:“大家不要卷模型,要卷应用!”这一观点…...
数据库(Database,简称DB)介绍
数据库(Database,简称DB)是信息技术领域中一个至关重要的组成部分,它按照数据结构来组织、存储和管理数据。以下是对数据库的详细介绍: 一、定义与基本概念 定义:数据库是按照数据结构来组织、存储和管理…...
Redis五种常用数据类型详解及使用场景
Redis 5 种基本数据类型 Redis 共有 5 种基本数据类型:String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zset(有序集合)。 这 5 种数据类型…...
Postman API测试覆盖率:全面评估指南
📊 Postman API测试覆盖率:全面评估指南 在API测试中,测试覆盖率是一个关键指标,它衡量了测试用例对代码的覆盖程度。Postman提供了多种工具和方法来评估API测试覆盖率,帮助开发者和测试人员确保API的质量和稳定性。本…...
C++--find
find 在[first,last)区间找第一个等于val的元素。 template<class InputIterator, class T> InputIterator find(InputIterator first,//起始迭代器 InputIterator last, //结束迭代器 const T& val); //需要查找的值 源码剖析 template<class InputI…...
JavaWeb入门程序解析(Spring官方骨架、配置起步依赖、SpringBoot父工程、内嵌Tomcat)
3.3 入门程序解析 关于web开发的基础知识,我们可以告一段落了。下面呢,我们在基于今天的核心技术点SpringBoot快速入门案例进行分析。 3.3.1 Spring官方骨架 之前我们创建的SpringBoot入门案例,是基于Spring官方提供的骨架实现的。 Sprin…...
mysql命令练习
创建数据表grade: CREATE TABLE grade( id INT NOT NULL, sex CHAR(1), firstname VARCHAR(20) NOT NULL, lastname VARCHAR(20) NOT NULL, english FLOAT, math FLOAT, chinese FLOAT ); 向数据表grade中插…...
AI绘画Stable Diffusion 零基础入门 —AI 绘画原理与工具介绍,万字解析AI绘画的使用教程
大家好,我是设计师阿威 想要入门 AI 绘画,首先需要了解它的原理是什么样的。 其实很早就已经有人基于深度学习模型展开了对图像生成的研究了,但在那时,生成的图像分辨率和内容都非常抽象。 直到近两年,AI 产出的图像…...
jenkins添加ssh证书
1、生成ssh密匙:windows生成ssh密匙-CSDN博客 2、添加添加ssh凭证:jenkins路由地址为:/manage/credentials/store/system/domain/_/ 点击添加凭证 选择第二个,将生成的私匙 id_rsa 里边的内容赋值到密钥,id留空自动…...
C++--accumulate介绍
在C中,accumulate是一个用于对容器中的元素进行累加操作的函数模板,位于 头文件中。它允许你对容器(如vector或array)中的元素进行累加运算,并返回累加的结果。 源代码展示 template<class InputIterator, class …...
C++写一个线程池
C写一个线程池 文章目录 C写一个线程池设计思路测试数据的实现任务类的实现线程池类的实现线程池构造函数线程池入口函数队列中取任务添加任务函数线程池终止函数 源码 之前用C语言写了一个线程池,详情请见: C语言写一个线程池 这次换成C了!…...
【SASS/SCSS(一)】选择器
Sass 是一门高于 CSS 的元语言,它能用来清晰地、结构化地描述文件样式。 而SCSS是SASS引入的语法,是CSS的超集,所以所有CSS有效的使用在SCSS中都生效 一、回顾CSS选择器 通用选择器 *元素选择器类选择器,.classNameID选择器&am…...
详细解析Kafaka Streams中各个DSL操作符的用法
什么是DSL? 在Kafka Streams中,DSL(Domain Specific Language)指的是一组专门用于处理Kafka中数据流的高级抽象和操作符。这些操作符以声明性的方式定义了数据流的转换、聚合、连接等处理逻辑,使得开发者可以更加专注…...
C++中链表的底层迭代器实现
大家都知道在C的学习中迭代器是必不可少的,今天我们学习的是C中的链表的底层迭代器的实现,首先我们应该先知道链表的底层迭代器和顺序表的底层迭代器在实现上有什么区别,为什么顺序表的底层迭代器更加容易实现,而链表的底层迭代器…...
3.5、matlab打开显示保存点云文件(.ply/.pcd)以及经典点云模型数据
1、点云数据简介 点云数据是三维空间中由大量二维点坐标组成的数据集合。每个点代表空间中的一个坐标点,可以包含有关该点的颜色、法向量、强度值等额外信息。点云数据可以通过激光扫描、结构光扫描、摄像机捕捉等方式获取,广泛应用于计算机视觉、机器人…...
Qt-事件与信号
事件和信号的区别在于,事件通常是由窗口系统或应用程序产生的,信号则是Qt定义或用户自定义的。Qt为界面组件定义的信号往往通常是对事件的封装,如QPushButton的clicked()信号可以看做对QEvent::MouseButtonRelease类事件的封装。 在使用界面组…...
数据结构 day3
目录 思维导图: 学习内容: 1. 顺序表 1.1 概念 1.2 有关顺序表的操作 1.2.1 创建顺序表 1.2.2 顺序表判空和判断满 1.2.3 向顺序表中添加元素 1.2.4 遍历顺序表 1.2.5 顺序表按位置进行插入元素 1.2.6 顺序表任意位置删除元素 1.2.7 按值进…...
Kubernetes面试整理-如何进行滚动更新和回滚?
在 Kubernetes 中,滚动更新和回滚是管理应用程序版本的常用操作。滚动更新允许您逐步替换现有的 Pod 实例,以便在不中断服务的情况下部署新版本。回滚则是在新版本出现问题时恢复到之前的版本。 滚动更新 通过 Deployment 进行滚动更新 1. 创建一个 Deployment: 下面是一个…...
flutter ios打包 xcode报错module ‘xxx‘ not found
flutter ios打包 xcode报错module ‘xxx’ not found 如果已经在androidstudio中成功运行了flutter build ios --release。 那么可能是你使用xcode打开的是ios/Runner.xcodeproj文件。 你关掉xcode,重新打开ios/Runner.xcworkspace/文件。然后重新archiveÿ…...
LLM 构建Data Multi-Agents 赋能数据分析平台的实践之④:数据分析之三(数据展示)
概述 在先前探讨的文章中,我们构建了一个全面的数据测试体系,该体系遵循“数据获取—数据治理—数据分析”的流程。如何高效地构建数据可视化看板,以直观展现分析结果,正逐渐成为利用新兴技术提升效能的关键领域。伴随业务拓展、数…...
Elasticsearch 批量更新
Elasticsearch 批量更新 准备条件查询数据批量更新 准备条件 以下查询操作都基于索引crm_flow_info来操作,索引已经建过了,本文主要讲Elasticsearch批量更新指定字段语句,下面开始写更新语句执行更新啦! 查询数据 查询指定shif…...
【Pytorch笔记】张量
torch.Tensor() 是 PyTorch 库中用于创建张量的一个函数。在 PyTorch 中,张量是多维数组,它们可以存储在 CPU 或 GPU 上,并且支持自动求导,这使得它们非常适合进行深度学习和科学计算。 张量可以在Python list形式下通过 torch.T…...
查找json中指定节点的值,替换为指定的值
有时我们封装好的实体转化成的json字段的值和第三方要求的不一样,比如我们字段的值是字符串,我们需要使用int类型的值,就需要将这个键的值转化成int类型。 比如将以下 convulsionNumber字段中字符串的值“一次”替换为0 {"convulsionT…...
Android 14 开机时间优化措施
Android开机优化系列文档-CSDN博客 Android 14 开机时间优化措施汇总-CSDN博客Android 14 开机时间优化措施-CSDN博客根据systrace报告优化系统时需要关注的指标和优化策略-CSDN博客Android系统上常见的性能优化工具-CSDN博客Android上如何使用perfetto分析systrace-CSDN博客A…...
【QGroundControl二次开发】二.使用QT编译QGC(Windows)
【QGroundControl二次开发】一.开发环境准备(Windows) 二. 使用QT编译QGC(Windows) 2.1 打开QT Creator,选择打开项目,打开之前下载的QGC项目源码。 编译器选择Desktop Qt 6.6.3 MSVC2019 64bit。 点击运…...
[C/C++入门][变量和运算]4、带余除法
给定被除数和除数,求整数商及余数 看到这个题,我们都知道C的除法运算符 /,默认是不带余数的。那现在要求带余数,需要能够想到% %,是C获取余数的方法:比如5/22; 5%21;%得到的是除后的余数。 #inc…...
常用优秀内网穿透工具(实测详细版)
文章目录 1、前言2、安装Nginx3、配置Nginx4、启动Nginx服务4.1、配置登录页面 5、内网穿透5.1、cpolar5.1.1、cpolar软件安装5.1.2、cpolar穿透 5.2、Ngrok5.2.1、Ngrok安装5.2.2、随机域名5.2.3、固定域名5.2.4、前后端服务端口 5.3、NatApp5.4、Frp5.4.1、下载Frp5.4.2、暴露…...
防火墙NAT地址转换和智能选举综合实验
一、实验拓扑 目录 一、实验拓扑 二、实验要求(接上一个实验要求后) 三、实验步骤 3.1办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) 3.2分公司设备可以通过总公司的移动链路和电信链路访…...
Android获取当前屏幕显示的是哪个activity
在 Android 中,要获取当前屏幕显示的 Activity,可以使用以下几种方法: 方法一:使用 ActivityManager 获取当前运行的任务信息 这是一个常见的方法,尽管从 Android 5.0 (API 21) 开始,有些方法变得不太可靠…...
网站建设年终总结怎么写/网站设计说明
起因刚完成一个版本的开发。刚上Google play 就有用户反映无法更新应用。错误代码为:Cant install app "****" can be installed.Try again, and if the problem continues,get help toubleshooting.(Error code: -505)解决思路得到这样的Bug当然感觉到莫…...
新疆网站建设大全/北京网站制作推广
自己做站点的时候,都看看收录和关键词排名什么的,所以打造的这个批量关键词查询工具。#encoding:utf-8import urllib,re,random,time,sys,StringIO,sockettry:import pycurlexcept:passfrom bs4 import BeautifulSoupscore{1: 28.56,2: 19.23,3: 10.20,4…...
付费网站做推广哪个好/网络营销策划总结
lambda函数也叫匿名函数,即,函数没有具体的名称。 glambda x:x**2 def f(x):return x**2 lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边是返回值,lambda语句构建的其实是一个函数对…...
网站设置5个关键词/百家号查询排名数据查询
系统信息 arch 显示机器的处理器架构 uname -m 显示机器的处理器架构 uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 cat /proc/cpuinfo …...
完全静态化成wordpress/福建百度代理公司
今年的最后的一次送测完成了。 明年回来过来改bug。 转载于:https://www.cnblogs.com/muyoushui/archive/2011/02/01/1948646.html...
迷你主机做网站/网站seo优化检测
好几种IE6的BUG只要添加ZOOM:1,问题就迎刃而解,主要原因是触发了layout。layout这个定义属于IE,当元素触发了layout或者默认具有layout,则这个元素自己会对自身的内容进行计算大小和组织。否则,这个元素将依赖于父元素…...