测试集合

测试您的集合可以确保您的代码运行良好,并能与 Ansible 生态系统的其余部分良好集成。您的集合应通过 Ansible 代码的完整性测试(sanity tests)。您还应该添加单元测试(unit tests)以覆盖集合中的代码,以及集成测试(integration tests)以覆盖您的集合与 ansible-core 之间的交互。

测试工具

测试集合的主要工具是 ansible-test。这是 Ansible 的测试工具,在 测试 Ansible 中有详细描述,并由 ansibleansible-core 软件包共同提供。

请在您的集合目录中使用 ansible-test 工具,该路径必须包含 ansible_collections,例如 collections/ansible_collections/community/general 对应 community.general 集合。有关测试指南,请参阅 测试集合贡献本地测试 Ansible 和集合

您可以使用 ansible-test 运行多项完整性测试,以及为插件运行单元测试和集成测试。在测试集合时,请针对您目标支持的 ansible-core 版本进行测试。

您必须始终在集合的根目录下执行 ansible-test。您可以在 Docker 容器中运行 ansible-test 而无需安装任何特殊依赖。Ansible 团队在 Azure Pipelines 中采用此方法,无论是在 ansible/ansible GitHub 仓库中,还是在 community.generalcommunity.network 等大型社区集合中,用于在提交 Pull Request 时自动运行测试。

许多不需要在不同操作系统发行版上运行测试的集合使用 GitHub Actions 作为其持续集成 (CI) 平台。collection_template 仓库 包含了 GitHub Actions 工作流 模板,集合开发者可以自由使用这些模板,以便在自己的集合仓库中轻松设置 CI。

以下示例演示了在 Docker 容器中运行测试。

完整性测试

运行所有完整性测试

ansible-test sanity --docker default -v

有关更多信息,请参阅 完整性测试。有关完整性测试的详细信息以及如何修复识别出的问题,请参阅 完整性测试完整列表

添加单元测试

您必须将单元测试放在相应的 tests/unit/plugins/ 目录下。例如,您会将 plugins/module_utils/foo/bar.py 的测试放在 tests/unit/plugins/module_utils/foo/test_bar.pytests/unit/plugins/module_utils/foo/bar/test_bar.py 中。示例请参考 community.general 中的单元测试

为所有支持的 Python 版本运行所有单元测试

ansible-test units --docker default -v

仅为特定 Python 版本运行所有单元测试

ansible-test units --docker default -v --python 3.13

仅运行特定的单元测试

ansible-test units --docker default -v --python 3.13 tests/unit/plugins/module_utils/foo/test_bar.py

您可以在 tests/unit/requirements.txt 文件中指定 Python 依赖项。有关更多信息(尤其是关于 fixture 文件),请参阅 单元测试

添加集成测试

您必须将集成测试放在相应的 tests/integration/targets/ 目录下。对于模块集成测试,您可以仅使用模块名称。例如,您会将 plugins/modules/foo.py 的集成测试放在名为 tests/integration/targets/foo/ 的目录中。对于非模块插件的集成测试,您必须在目录名中添加插件类型。例如,您会将 plugins/connections/bar.py 的集成测试放在名为 tests/integration/targets/connection_bar/ 的目录中。对于 lookup 插件,目录必须命名为 lookup_foo;对于 inventory 插件,命名为 inventory_foo,依此类推。

您可以编写两种不同类型的集成测试

  • Ansible 角色测试使用 ansible-playbook 运行,并验证模块的各个方面。它们可以依赖于其他集成测试(通常命名为 prepare_barsetup_bar,这些测试用于准备服务或安装名为 bar 的依赖项,以便测试模块 foo)来设置所需资源,例如安装必需的库或设置服务器服务。

  • runme.sh 测试直接作为脚本运行。它们可以设置 inventory 文件,并以各种设置执行 ansible-playbookansible-inventory

示例请参考 community.general 中的集成测试。更多细节请参阅 集成测试

由于集成测试可能会安装依赖项并设置、启动和停止服务,我们建议尽可能在 Docker 容器或受限环境中运行它们。默认情况下,ansible-test 支持多个操作系统的 Docker 镜像。所有选项请参阅 支持的 Docker 镜像列表。主要将 default 镜像用于与平台无关的集成测试(例如云模块测试)。以下示例使用了 fedora35 镜像。

执行集合的所有集成测试

ansible-test integration --docker fedora -v

如果您想要更详细的输出,请运行带有 -vvv 而非 -v 的命令。或者,指定 --retry-on-error 以在更高的详细程度下自动重新运行失败的测试。

仅执行特定目录中的集成测试

ansible-test integration --docker fedora -v connection_bar

您可以指定多个目标名称。每个目标名称都是 tests/integration/targets/ 中一个目录的名称。

注意

使用 ansible-test 进行集合测试

ansible 2.9 以来,ansible-test 一直是事实上的集合测试工具。然而,ansible-test 不再接收针对新集合测试需求的特性增强。我们邀请集合维护者和社区成员在 Ansible 论坛上参与讨论,以改进集合测试工具。您可以通过 collection-test-strat 标签查找相关讨论主题。

另请参阅

测试 Ansible

关于测试 Ansible 的更多资源

为 Ansible 维护的集合做出贡献

贡献给选定集合的指南

交流方式

有疑问?需要帮助?想分享你的想法?请访问 Ansible 通信指南