测试 Ansible

为什么要测试你的 Ansible 贡献?

如果你是一位开发者,你可以做的最有价值的事情之一就是查看 GitHub 问题并帮助修复错误,因为修复错误几乎总是优先于功能开发。即使对于非开发者来说,帮助测试修复错误和功能的拉取请求仍然非常有价值。

理解如何编写剧本和角色的 Ansible 用户应该能够测试他们的工作。GitHub 拉取请求会自动运行各种测试(例如,Azure Pipelines),这些测试会显示实际中的错误。但是,贡献者也必须在自动化的 GitHub 检查之外测试他们的工作,并在拉取请求中显示这些测试的证据,以确保他们的工作更有可能被审查和合并。

继续阅读以了解 Ansible 的测试方式,如何本地测试你的贡献以及如何扩展测试功能。

如果你想了解如何测试集合,请阅读 测试集合

测试类型

从高层面上看,我们有以下测试分类

健全性:
  • 健全性测试

  • 健全性测试由用于执行静态代码分析的脚本和工具组成。

  • 这些测试的主要目的是强制执行 Ansible 代码标准和要求。

集成:
  • 集成测试

  • 模块和 Ansible Core 功能的功能测试。

单元:
  • 单元测试

  • 直接针对代码库的各个部分进行测试。

在 GitHub 和 Azure Pipelines 中进行测试

组织

创建拉取请求 (PR) 时,会使用 Azure Pipelines(一种持续集成 (CI) 工具)对其进行测试。结果将在每个 PR 的末尾显示。

当 Azure Pipelines 检测到错误并且可以将其链接回 PR 中修改的文件时,相关行将作为 GitHub 评论添加。例如

The test `ansible-test sanity --test pep8` failed with the following errors:

lib/ansible/modules/network/foo/bar.py:509:17: E265 block comment should start with '# '

The test `ansible-test sanity --test validate-modules` failed with the following error:
lib/ansible/modules/network/foo/bar.py:0:0: E307 version_added should be 2.4. Currently 2.3

从上面的示例中,我们可以看到 --test pep8--test validate-modules 已经识别出问题。给出的命令允许你在本地运行相同的测试,以确保你已经修复了所有问题,而无需将你的更改推送到 GitHub 并等待 Azure Pipelines,例如

如果你还没有安装 Ansible,请使用本地签出,方法是运行

source hacking/env-setup

然后运行 GitHub 评论中详细说明的测试

ansible-test sanity --test pep8
ansible-test sanity --test validate-modules

如果没有 GitHub 评论说明失败的内容,你可以通过单击 PR 末尾“检查失败”消息下的“详细信息”按钮来查看结果。

重新运行失败的 CI 作业

有时你可能会发现你的 PR 由于与你的更改无关的原因而失败。这可能由于以下几个原因导致:

  • 暂时无法访问外部资源,例如 yum 或 Git 仓库

  • 创建虚拟机以运行测试时超时

如果出现任何问题,你可以通过以下方式重新运行 Azure Pipelines 测试:

  • 在拉取请求中添加带有 /rebuild(完全重建)或 /rebuild_failed(仅重建失败的 CI 节点)的评论

  • 关闭并重新打开拉取请求(完全重建)

  • 对分支进行其他更改并推送到 GitHub

如果问题仍然存在,请联系社区。访问 Ansible 通信指南 以获取详细信息。

如何测试 PR

理想情况下,代码应该添加测试来证明代码是有效的。但这并不总是可行,测试也不总是全面的,尤其是在用户没有访问各种平台或使用 API 或 Web 服务的情况下。在这些情况下,针对真实设备的现场测试可能比针对模拟接口运行的自动化更有价值。无论如何,第一次始终应该手动进行测试。

值得庆幸的是,帮助测试 Ansible 非常简单,假设你熟悉 Ansible 的工作原理。

设置:安装 Pytest 和必需的 Pytest 库

Ansible 的单元测试框架利用了 pytest 库。在深入测试之前,请确保你已安装 pytest 以及任何其他 pytest 库,例如 pytest-mockpytest-xdist

有关更多信息,请参阅文档:单元测试.

设置:签出拉取请求

你可以通过以下方式执行此操作:

  • 签出 Ansible

  • 将提议的更改提取到测试分支

  • 测试

  • 在 GitHub 上对该特定问题发表评论

以下是操作方法:

警告

测试从 GitHub 拉取请求发送给我们的源代码确实存在一些固有风险,因为发送的源代码可能存在错误或恶意代码,可能会对你的系统产生负面影响。我们建议在虚拟机上进行所有测试,无论是云实例还是本地。有些用户喜欢使用 Vagrant 或 Docker 来完成此操作,但它们是可选的。拥有不同 Linux 或其他版本的虚拟机也很有用,因为某些功能(例如,apt 或 yum 等软件包管理器)是特定于这些操作系统版本的。

创建一个新的工作区域

git clone https://github.com/ansible/ansible.git ansible-pr-testing
cd ansible-pr-testing

接下来,找到你想要测试的拉取请求并记下它的编号。它看起来像这样

Use os.path.sep instead of hardcoding / #65381

注意

仅测试 ansible:devel

重要的是,PR 请求目标必须是 ansible:devel,因为我们不接受将拉取请求合并到任何其他分支。点版本由 Ansible 员工手动樱桃挑选。

在你提取提议的更改并创建用于测试的分支时,请使用拉取请求编号

git fetch origin refs/pull/XXXX/head:testing_PRXXXX
git checkout testing_PRXXXX

第一个命令从拉取请求中提取提议的更改并创建一个名为 testing_PRXXXX 的新分支,其中 XXXX 是与拉取请求关联的实际编号(例如,65381)。第二个命令签出新创建的分支。

注意

如果 GitHub 用户界面显示拉取请求不会干净地合并,我们建议你,如果你不熟悉 Git 和编码,不要继续操作,因为你将不得不解决合并冲突。这是原始拉取请求贡献者的责任。

注意

一些用户不创建特性分支,这会导致他们在其 devel 版本中包含多个不相关的提交时出现问题。如果源代码类似于 someuser:devel,请确保在拉取请求中只列出一个提交。

Ansible 源代码包含一个脚本,允许您直接从源代码使用 Ansible,而无需进行完整安装,开发人员在 Ansible 中经常使用这种方法。

只需将其作为源代码(使用 Linux/Unix 的术语)即可立即开始使用它。

source ./hacking/env-setup

此脚本会修改 PYTHONPATH 环境变量(以及其他一些内容),这些变量将在您的 shell 会话打开期间临时设置。

测试拉取请求

此时,您应该准备开始测试!

以下是一些测试建议:

  • 创建一个包含示例的测试剧本,并检查它们是否正常运行。

  • 测试是否返回了任何 Python 回溯(这是一个错误)。

  • 在不同的操作系统或针对不同的库版本进行测试。

运行完整性测试

ansible-test sanity

更多信息: 完整性测试

运行单元测试

ansible-test units

更多信息: 单元测试

运行集成测试

ansible-test integration -v ping

更多信息: 集成测试

所有潜在问题都应作为拉取请求中的评论添加(如果特性正常工作,也可以添加评论),请记住包含 ansible --version 的输出。

示例

Works for me! Tested on `Ansible 2.3.0`.  I verified this on CentOS 6.5 and also Ubuntu 14.04.

如果 PR 未解决问题,或者您看到单元/集成测试中的任何失败,只需包含该输出。

此更改会导致错误。

我在 Ubuntu 16.04 上运行此代码时,出现了以下错误:

```
一些输出
堆栈跟踪
一些其他输出
```

代码覆盖率在线

在线代码覆盖率报告 是识别 Ansible 中测试改进领域的好方法。通过遵循红色颜色,您可以深入报告,找到完全没有测试的文件。添加集成和单元测试以清楚地展示代码的工作方式、验证重要的 Ansible 功能并增加没有测试的区域的测试覆盖率,是帮助改进 Ansible 的宝贵方式。

代码覆盖率报告仅涵盖 Ansible 的 devel 分支,该分支用于进行新特性开发。拉取请求和新代码将缺失于 codecov.io 覆盖率报告中,因此需要本地报告。大多数 ansible-test 命令允许您收集代码覆盖率,这对于指示扩展测试的位置特别有用。有关更多信息,请参阅 测试 Ansible 和集合

想要了解更多关于测试的信息吗?

如果您想了解更多关于改进 Ansible 测试计划的信息,请加入 Ansible 社区论坛