TripleO 项目单元测试

https://blueprints.launchpad.net/tripleo/unit-testing

我们应该在 TripleO 项目中启用更多的单元测试,以便更好地覆盖 CI 中未包含的代码路径,使审查者更容易验证代码更改是否符合预期,并避免浪费审查者和开发人员的时间来解决风格问题。

问题描述

目前,大多数 TripleO 项目中的代码几乎没有单元测试。这带来了一些负面影响

  • 我们没有任何未包含在 CI 运行中的代码的测试覆盖率。

  • 对于包含在 CI 运行中的代码,我们实际上不知道有多少代码正在被测试。可能存在许多在 CI 运行期间未使用的代码分支。

  • 我们无法隔离地测试代码更改,这使得迭代速度变慢。

  • 未被 CI 覆盖的更改要么根本没有被测试,要么必须由审查者手动测试,这既繁琐又容易出错。

  • 大型重构经常会破坏工具中较少使用的接口,因为这些接口没有被测试。

此外,由于 TripleO 项目中缺乏 hacking 风格的检查,许多补丁因为风格问题而被标记为 -1,而这些问题可以通过自动化工具来捕获。这导致了不必要的合并延迟。

提议的变更

我希望构建一个简化 TripleO 中单元测试过程的单元测试框架。一旦完成,我们应该像其他 OpenStack 项目一样,开始要求对新功能和更改后的功能进行单元测试。 届时,我们也可以开始为现有代码添加测试覆盖率。

当前计划是利用 Python 单元测试库,以便尽可能与 OpenStack 的其余部分保持一致,并利用现有的测试基础设施。这将减少所需的新代码量,并使开发人员更容易开始编写单元测试。

对于风格检查,已经创建了 dib-lint 工具来捕获镜像元素中的常见错误。 应该根据我们发现可以自动找到的问题添加更多的规则。 它也应该应用于 tripleo-image-elements 项目。

bashate 项目还提供了一些通用的风格检查,这些检查在 TripleO 中会很有用,因此我们也应该开始使用它。 并在可能的情况下贡献额外的检查,并对我们不同意的检查提供反馈。

添加的任何单元测试都应该能够并行运行。 这既可以加快测试速度,又可以帮助发现竞争错误。

替代方案

Shell 单元测试

由于 TripleO 中使用的 bash 代码量很大,我们可能希望研究使用 shell 单元测试框架,除了 Python 之外。我认为在进一步了解使用 Python 单元测试我们的脚本有多困难之后,可以重新审视这一点。 我仍然认为我们应该从 Python 开始,原因如上所述,只有在发现 Python 单元测试无法满足的内容时才添加其他选项。

使用特定于 shell 的单元测试框架的一个潜在好处是,它可以提供测试覆盖率统计信息,以便我们确切地知道哪些代码正在被测试,哪些代码没有被测试。

如果确定需要 shell 单元测试框架,我们应该尝试选择一个广泛使用且具有良好理解的工作流程的框架,以方便采用。

沙盒化

我使用 fakeroot/fakechroot 进行了一些初步的实验,以沙盒化期望访问根文件系统的脚本。 我能够以普通用户身份运行一个写入 root 拥有文件的脚本,使其认为它正在写入真实的文件,但我尚未使其与 tox 一起运行单元测试。

另一种选择是使用真实的 chroot。 这将提供隔离,并且可能比 fakeroots 更常见。 缺点是 chrooting 需要主机上的 root 访问权限,因此运行单元测试也需要。

安全影响

elements 中的许多脚本假定它们将以 root 身份运行。 我们显然不想在单元测试中这样做,因此我们需要一种沙盒化这些脚本的方法,以便它们可以运行但不会影响测试系统的根文件系统。

其他最终用户影响

性能影响

添加更多的测试会增加 Jenkins gate 作业所需的时间。 然而,这应该对实际影响最小,因为单元测试应该比集成测试运行得快得多。

其他部署者影响

开发人员影响

开发人员需要为他们的代码更改实现单元测试,这需要学习我们采用的单元测试工具。

实现

负责人

主要负责人

bnemec

goneri 已经开始进行一些工作,以在 tripleo-image-elements 中启用 dib-lint

工作项

  • 提供并记录一个良好的 Python 框架,用于测试 bash 脚本的行为。 尽可能使用上游项目中的现有功能,并在必要时贡献新功能。

  • 在 dib-lint 上 gate tripleo-image-elements,这将需要修复 tripleo-image-elements 中当前存在的任何 lint 失败。

  • 在大量 bash 脚本的项目中启用 bashate。

  • 将单元测试添加到 tripleo-incubator,以启用对诸如 devtest.sh --build-only 之类的内容的验证。

  • 将模板验证测试作业添加到 triple-heat-templates。

依赖项

  • bashate 将是一个新的测试依赖项。

测试

这些更改应尽可能利用现有的测试基础设施,因此启用新测试的唯一要求是对受影响项目的 infra 配置进行更改。

文档影响

这些工作不应被用户看到,但我们可能需要开发人员文档来帮助编写单元测试。

参考资料

bashate: http://git.openstack.org/cgit/openstack-dev/bashate/

有一些与此规范相关的说明在 Summit etherpad 的底部:https://etherpad.openstack.org/p/juno-summit-tripleo-ci