测试
为什么需要自动化测试?
以下是为什么我们应该进行自动化测试的许多重要原因:
您可以更快地对代码进行增量更新。ROS有数百个包,其中存在许多相互依赖关系,因此很难预测小改动可能引起的问题。如果您的更改通过了单元测试,那么您可以更加自信地认为您没有引入问题——或者至少问题不是您造成的。
您可以更有信心地重构代码。通过通过单元测试可以验证在重构过程中是否引入了任何错误。这使您摆脱了对变更的恐惧感!
它可以导致更好的设计代码。单元测试迫使您编写更易于测试的代码。这通常意味着将底层函数和框架分离,这是我们在ROS代码中的设计目标之一。
它可以防止重现的错误(回归错误)。对于您修复的每个错误,编写单元测试是一种良好的实践。实际上,在修复错误之前编写单元测试。这将帮助您精确地或甚至是确定性地重现错误,并更加准确地理解问题所在。结果,您还将创建一个更好的补丁,然后可以使用回归测试来验证错误是否已修复。这样,如果以后修改了代码,错误就不会被意外重新引入。这还意味着更容易说服补丁的审阅者问题已得到解决,贡献的质量较高。
其他人可以更轻松地在你的代码上工作(自动文档的形式)。当你进行更改时,很难弄清楚你是否破坏了其他人的代码。单元测试是其他开发人员验证其更改的工具。自动化测试记录了你的编码决策,并自动向其他开发人员传达了有关违规情况的信息。因此,测试成为你代码的文档-一种无需大部分时间阅读的文档,而当需要检查时,测试系统将准确指示要阅读的内容(哪些测试失败)。通过编写自动化测试,你使其他贡献者更快速。这改进了整个ROS项目。
如果我们有自动化的单元测试,成为ROS的贡献者将容易得多。对于新的外部开发人员来说,很难为你的组件做出贡献。当他们更改代码时,通常是在盲目操作,靠很多猜测。通过提供一套自动化测试的支持,你可以帮助他们完成任务。他们会立即获得对其更改的反馈。这使得为项目做出贡献变得更容易,新的贡献者也更容易加入。此外,他们的首次贡献质量更高,这减轻了维护者的工作负担。双赢!
自动化测试简化了维护工作。对于成熟的软件包而言,变化较慢,主要需要更新到新的依赖项,自动化测试套件有助于快速确定软件包是否仍然可用。这使得决定软件包是否仍然受支持变得更容易。
自动化测试放大了持续集成的价值。回归测试以及基于常规场景的需求测试一起,为组件的整体自动化测试体系做出了贡献。你的组件在与其所依赖的其他API的演化方面得到了更好的测试(CI服务器将更好、更准确地告知你代码中存在的问题)。
编写测试的最重要的好处也许是让你成为一个良好的开发者。测试对长期的质量产生影响。这是许多开源项目中被广泛接受的实践。通过编写回归测试,你正在为ROS生态系统的长期质量做出贡献。
这一切都是免费的吗?
当然,天下没有免费的午餐。要享受测试的好处,就需要进行一些投入。
你需要开发一个测试,有时可能会很困难或昂贵。有时候它也可能不是那么简单,因为测试应该是自动化的。如果你的测试涉及特殊硬件(不应该涉及:尝试使用模拟、模拟硬件或将测试范围缩小到较小的软件问题),或者需要外部环境,例如人工操作员,情况会变得非常复杂。
回归测试和其他自动化测试需要进行维护。当组件的设计发生变化时,许多测试变得无效(例如,它们不再编译,或者抛出与API设计相关的运行时异常)。这些测试失败不仅因为重新设计引入了错误,还因为它们需要更新到新的设计。偶尔,在进行较大的重新设计时,旧的回归测试应该被删除。
大量的测试可能需要很长时间才能运行,这可能会增加持续集成服务器的成本。