benwebber.tap

ansible-tap

构建状态 从 Ansible Galaxy 下载

Ansible 的 测试任何协议 (TAP) 生产者。

这个回调插件允许你将 TAP 测试套件写成 Ansible 剧本。你可以将其视为 Ansible 的替代方案,相对于 ServerspecTestinfra

要求

  • Ansible 2
  • Python 2.7+

安装

虽然你不能直接使用 ansible-galaxy 安装这个插件,但你可以使用 ansible-galaxy 下载它:

ansible-galaxy install -p roles/ benwebber.tap

导航到角色目录,运行 make install

cd roles/benwebber.tap
make install

这将把插件复制到 ~/.ansible/plugins/callback

用法

配置 Ansible 使用这个插件作为标准输出回调:

ANSIBLE_STDOUT_CALLBACK=tap ansible-playbook -i hosts test.yml -l hostname

你也可以在 ansible.cfg 中将其设置为默认回调:

[defaults]
stdout_callback=tap

编写 Ansible 测试

默认情况下,如果任何任务失败,Ansible 会中止剧本。在所有测试上设置 ignore_errors: true 以禁用此行为:

- name: 检查服务是否正在运行
  command: systemctl is-active service
  register: is_active
  tags: diagnostic

- name: 断言服务正在运行
  assert:
    that: is_active.rc == 0
  ignore_errors: true

这将确保 Ansible 执行整个测试套件,除了任何意外的失败。

如果你有很多测试,你可以在一个 block 上设置 ignore_errors: true

- name: 检查服务是否正在运行
  command: systemctl is-active service
  register: is_active
  tags: diagnostic

- name: 检查服务是否已启用
  command: systemctl is-enabled service
  register: is_enabled
  tags: diagnostic

- ignore_errors: true
  block:
  - name: 断言服务正在运行
    assert:
      that: is_active.rc == 0

  - name: 断言服务已启用
    assert:
      that: is_enabled.rc == 0

如果一个任务失败,插件将输出故障排除信息,格式为嵌入的 YAML 文档

not ok - assert: 断言变量已设置
  ---
  _ansible_no_log: false
  _ansible_verbose_always: true
  assertion: 状态已定义
  changed: false
  evaluated_to: false
  failed: true
  invocation:
    module_args:
      that: 状态已定义
    module_name: assert
  ...

从 TAP 流中排除任务

通常,测试的结果将依赖于先前的任务。你自然会想要从 TAP 流中排除这些设置任务。

要做到这一点,只需为设置任务添加 diagnostic 标签:

- name: 设置下一个测试
  command: 'true'
  register: true_
  tags: diagnostic

- name: 应该始终通过
  assert:
    that: true_.rc == 0
  ignore_errors: true

回调插件将打印诊断行,而不是测试行:

# command: 设置下一个测试
ok - assert: 应该始终通过

与单独的测试用例不同,你可能不希望忽略这种类型任务的错误。失败将代表测试套件中的错误,而不是测试失败。

预期失败和意外成功

TAP 支持 TODO 指令以忽略尚未实现的功能的测试。

如果带有 TODO 标记的测试失败,TAP 使用者会将其视为预期失败。同样,如果带有 TODO 标记的测试通过,TAP 使用者会将其视为意外成功。

对预期失败的测试使用 TODO 标签:

- name: 预期失败
  assert:
    that: false
  ignore_errors: true
  tags: TODO

这将在 TAP 流中输出 # TODO 指令:

not ok - assert: 预期失败 # TODO

如果测试通过,你会收到意外成功的输出:

ok - assert: 预期失败 # TODO

跳过测试

TAP 还支持 SKIP 指令以忽略特定测试。

这个回调使用 Ansible 的 when 语句来控制跳过的测试:

- name: 这是一个跳过的任务
  assert:
    that: false
  ignore_errors: true
  when: false

跳过测试的原因将出现在测试行中:

ok - assert: 已跳过 # SKIP 条件检查失败

示例

tests/ 目录包含示例测试套件,可以生成所有可能的测试结果。

安装插件后,运行测试套件:

ANSIBLE_STDOUT_CALLBACK=tap ansible-playbook -i localhost, -c local tests/playbooks/test_multiple_with_failures.yml

你将收到以下 TAP 流。你可以将其传递给任何 TAP 使用者。

TAP version 13
# command: 设置下一个测试
ok - assert: 通过
not ok - assert: 失败
  ---
  _ansible_no_log: false
  _ansible_verbose_always: true
  assertion: false
  changed: false
  evaluated_to: false
  failed: true
  invocation:
    module_args:
      that: false
    module_name: assert
  ...
not ok - assert: 预期失败 # TODO
ok - assert: 意外通过 # TODO
ok - assert: 已跳过 # SKIP 条件检查失败
1..5

注意事项

目前,该插件仅支持对单个主机运行测试。TAP 规范未描述合并多个输出流的方法。

许可

MIT

关于项目

Test Anything Protocol (TAP) producer callback plugin

安装
ansible-galaxy install benwebber.tap
许可证
mit
下载
129
拥有者