我们希望听到您的声音!帮助我们深入了解 Ansible 生态系统的现状。
参加 Ansible 项目调查 2024

Ansible-test 简介

Ansible-test 简介

随着自动化在越来越多的业务案例中变得至关重要,测试自动化代码本身的需求也越来越高。这就是 ansible-test 的用武之地:想要测试其 Ansible 内容集合的健全性、单元测试和集成测试的开发者可以使用 ansible-test 来实现与源代码库集成的测试工作流程。

ansible-core 和 ansible-base 都打包了一个名为 ansible-test 的 cli 工具,集合开发者可以使用它来测试其集合及其内容。ansible-test 知道如何执行各种与测试相关的任务,从整理模块文档和代码到运行单元测试和集成测试。

我们将在下面简要介绍 ansible-test 的不同功能。

如何运行 ansible-test?

随着 Ansible 内容集合在 Ansible-2.9 中的普遍可用,用户可以在集合内部运行 ansible-test 来测试集合本身。为了让 ansible-test 对集合运行测试,需要从集合根目录或其子目录下运行 ansible-test。

如果尝试从上述目录规范之外运行 ansible-test,它将抛出类似下面的错误

root@root ~/.ansible/collections ansible-test sanity
ERROR: The current working directory must be at or below:

- an Ansible collection: {...}/ansible_collections/{namespace}/{collection}/

Current working directory: /root/.ansible/collections

从上面的输出中,您可以看到集合根目录在 ansible-test 中的显示形式,它必须是以下形式

{...}/ansible_collections/{namespace}/{collection}/

当您从 Ansible Galaxy 或 Automation Hub 安装集合时,默认安装位置是:{...}/ansible_collections/{namespace}/{collection}/,这已经满足了上述目录约定。

即使您为 ansible-galaxy cli 指定了安装路径(使用 -p 选项),它也会在给定的路径中创建一个 ansible_collections 目录,并将集合安装到该目录中,如下所示

root@root ~/temp ll
total 0

root@root ~/temp ansible-galaxy collection install arista.eos -p .
Process install dependency map
Starting collection install process
Installing 'arista.eos:1.2.0' to '/root/temp/ansible_collections/arista/eos'
Installing 'ansible.netcommon:1.4.1' to '/root/temp/ansible_collections/ansible/netcommon'

root@root ~/temp ll
total 4.0K
drwxrwxr-x. 4 root root 4.0K Jan 18 19:21 ansible_collections

请确保在开发集合并在本地开发环境中使用 ansible-test 测试它们时,始终保持上述目录规范。

如何使用 ansible-test 测试集合?

ansible-test 提供了对集合运行不同类型测试的方法,这些测试大体上分为以下类型

  • 健全性测试
  • 单元测试
  • 集成测试

我们将详细介绍每种测试。

健全性测试

健全性测试由用于执行静态代码分析的脚本和工具组成。这些测试的主要目的是强制执行 Ansible 编码标准和要求。ansible-test 包含各种健全性测试来执行代码分析,这些测试可以在文档中找到

如何运行?

您可以从集合的根目录运行健全性测试套件;下面是如何运行健全性测试的不同场景。

# Run all sanity tests
ansible-test sanity

# Run all sanity tests against against certain files
ansible-test sanity plugins/modules/files/eos_acls.py

# Run all tests with a specific version of python (3.7 in this case)
ansible-test sanity --python 3.7

# Run all tests inside docker (good if you don't have dependencies installed)
ansible-test sanity --docker default

# Run validate-modules against a specific file
ansible-test sanity --test validate-modules lib/ansible/modules/files/template.py

列出所有可用的健全性测试

ansible-test sanity --list-tests

如何忽略健全性测试?

由于健全性测试在 Ansible 版本之间会发生变化,因此每个 Ansible 主要版本都需要一个单独的忽略文件。

文件名是 tests/sanity/ignore-X.Y.txt,其中 X.Y 是用于测试集合的 ansible-core/ansible-base 版本。

为每个 Ansible 版本维护一个单独的文件,可以让集合通过多个 Ansible 版本的测试。

有关忽略文件格式的信息,请参考开发指南

只有在少数情况下才会需要忽略,因此请参考集合文档

单元测试

单元测试是针对特定库或模块的小型隔离测试。作为集合开发者/维护者,您希望确保您的代码经过单元测试,而 ansible-test 提供了一种在集合中运行单元测试并进行报告的方法。

  1. tests/units 是所有与单元测试相关内容的存放位置
  2. ansible-test 在底层使用 PyTest 进行单元测试,因此它期望测试位于以 test_ 开头或以 _test.py 结尾的文件中

有关如何编写单元测试的更多信息,请参考指南

要运行集合中所有单元测试,请从集合根目录运行以下命令

# Run all tests inside docker (good if you don't have dependencies installed)
ansible-test units --docker -v

针对单个模块文件执行

# Only runs if the module directory path and unit test file path are similar
ansible-test units --docker -v apt

或针对特定 Python 版本执行

ansible-test units --docker -v --python 2.7 apt

如果要对模块以外的其他内容运行单元测试(例如模块实用程序),请指定整个文件路径

ansible-test units --docker -v test/units/module_utils/basic/test_imports.py

有关高级用法,请查看帮助

ansible-test units --help

代码覆盖率

代码覆盖率报告可以轻松识别未经测试的代码,以便为其编写更多测试。

在任何测试命令中添加 --coverage= 选项以收集代码覆盖率数据。如果您没有使用 --venv--docker 选项创建隔离的 Python 环境,那么您可能需要使用 --requirements 选项来确保安装了正确版本的 coverage 模块

ansible-test coverage erase
ansible-test units --coverage apt
ansible-test coverage html

报告可以生成多种不同格式

  • ansible-test coverage report - 控制台报告。
  • [ansible-test coverage html - HTML 报告。
  • [ansible-test coverage xml - XML 报告。

要在测试运行之间清除数据,请使用 ansible-test coverage erase 命令。有关功能的完整列表,请查看联机帮助

ansible-test coverage --help

集成测试

这些是端到端测试,用于检查代码路径功能是否按预期工作,并捕获您尝试自动化的产品中的重大更改。在 ansible-test 的上下文中,本质上

  1. tests/integration 是所有与集成测试相关内容的存放位置。
  2. tests/integration/targets 目录包含我们所有的测试用例。每个测试用例都是一个最基本的 Ansible 角色。

结论和后续步骤

如上所示,ansible-test 可以提供很多价值,可以彻底测试 Ansible 内容集合。

有关更多阅读材料和信息,请访问Ansible 测试策略文档。如果您不熟悉 Ansible 内容集合,请查看我们的关于 Ansible 内容集合的 YouTube 播放列表。这些视频将使您快速了解最新情况。

另外,如果您想详细了解如何构建统一的自动化基础设施操作管道,请不要忘记查看我们的自动化基础设施工作流电子书