警告

您正在阅读的 ROS 2 文档版本已达到 EOL(生命周期结束),不再受官方支持。如果您想了解最新信息,请访问 Jazzy.

测试

为什么要进行自动测试?

以下是我们为什么要进行自动化测试的几个重要原因:

  • 你可以更快地对代码进行增量更新。ROS 有数百个软件包,相互依存性很强,因此很难预料一个小改动可能导致的问题。如果你的改动通过了单元测试,你就可以更有信心地认为自己没有引入问题--或者至少问题不是你的错。

  • 您可以更加自信地重构代码。通过单元测试就能证明你在重构时没有引入任何错误。这让你免于改变的恐惧!

  • 它能使代码设计得更好。单元测试迫使你编写代码,使其更易于测试。这通常意味着要将底层函数和框架分开,这也是我们设计 ROS 代码的目标之一。

  • 它们可以防止重复出现错误(错误回归)。为修复的每个错误编写一个单元测试是一种很好的做法。事实上,应在修复错误之前编写单元测试。这将帮助您精确甚至确定性地重现错误,并更准确地了解问题所在。因此,您还可以创建一个更好的补丁,然后用回归测试来验证错误是否已修复。这样,如果以后修改代码,错误就不会意外地再次出现。这也意味着,您将更容易让补丁的审核人员相信问题已经解决,而且您的贡献是高质量的。

  • 其他人可以更轻松地修改你的代码(一种自动的文档形式)。当你修改代码时,很难弄清楚是否破坏了别人的代码。单元测试是其他开发人员验证其更改的工具。自动测试会记录您的编码决策,并自动向其他开发人员通报他们的违规行为。这样,测试就成了代码的文档--在大多数情况下不需要阅读的文档,当需要检查时,测试系统会精确地指出需要阅读的内容(哪些测试失败了)。通过编写自动测试,你可以让其他贡献者更快地完成工作。这将改善整个 ROS 项目。

  • 如果我们有自动化的单元测试,就更容易成为 ROS 的贡献者。新的外部开发人员很难为你的组件做出贡献。当他们对代码进行修改时,往往是盲目的、凭空猜测的。通过提供自动化测试工具,您可以帮助他们完成任务。他们的修改会立即得到反馈。为项目做出贡献变得更容易,新的贡献者也更容易加入。此外,他们的首次贡献质量更高,从而减轻了维护者的工作量。双赢!

  • 自动测试简化了维护工作。特别是对于变化较慢的成熟软件包,它们大多需要根据新的依赖关系进行更新,而自动测试套件能帮助它们快速确定软件包是否仍能运行。这样就更容易决定是否继续支持软件包。

  • 自动测试扩大了持续集成的价值。回归测试以及正常的基于场景的需求测试,将为您的组件自动化测试的整体内容做出贡献。针对组件所依赖的其他应用程序接口的演进,对组件进行更好的测试(CI 服务器会更好、更准确地告诉您代码中出现了哪些问题)。

编写测试最重要的好处可能是,测试能让你成为一个好公民。测试会长期影响质量。这是许多开源项目中公认的做法。通过编写回归测试,你将为 ROS 生态系统的长期质量做出贡献。

这些都是免费的吗?

当然,天下没有免费的午餐。要想从测试中获益,一些投资是必要的。

  • 您需要开发一个测试,有时可能会很困难或成本很高。有时,由于测试应该是自动的,因此也可能并非易事。如果测试涉及特殊硬件(不应该:尝试使用模拟、模拟硬件或将测试缩小到更小的软件问题)或需要外部环境,例如人类操作员,情况就会变得特别棘手。

  • 需要维护回归测试和其他自动测试。当组件的设计发生变化时,许多测试就会失效(例如,它们不再能编译,或抛出与 API 设计相关的运行时异常)。这些测试失败不仅是因为重新设计重新引入了错误,还因为需要根据新的设计进行更新。有时,在进行较大的重新设计时,应放弃旧的回归测试。

  • 大量测试的运行需要很长时间,这会增加持续集成服务器的成本。

可用教程: