benwebber.tap
ansible-tap
Ansible 的 测试任何协议 (TAP) 生产者。
这个回调插件允许你将 TAP 测试套件写成 Ansible 剧本。你可以将其视为 Ansible 的替代方案,相对于 Serverspec 和 Testinfra。
要求
- 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