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










ansible-test 简介

ansible-test 简介

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

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

我们将在下面简要介绍 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= 选项添加到任何测试命令以收集代码覆盖率数据。如果您没有使用创建隔离的 python 环境的 --venv--docker 选项,则可能需要使用 --requirements 选项以确保安装了正确版本的覆盖率模块

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 播放列表。这些视频会让您快速了解。

另外,如果您想了解有关构建统一的自动化基础设施运营管道的更多信息,请务必查看我们的自动化基础设施工作流程电子书