向现有集成测试添加内容
测试任务存储在 tests/integration/targets/<target_name>/tasks
目录中。
main.yml
文件包含测试任务并包含其他测试文件。查找合适的测试文件以集成你的测试,或者创建并包含或导入单独的测试文件。你可以使用现有测试文件之一作为草稿。
修复错误时
修复错误时
确定模块是否存在集成测试。如果不存在,请参阅创建新的集成测试部分。
在
tests/integration/targets/<target_name>/tasks
目录中的适当文件中添加一个重现该错误的任务。运行测试。新添加的任务应该会失败。
如果它们没有失败,请重新检查你的环境或测试任务是否满足问题“
重现步骤
”部分中描述的条件。如果重现了错误并且测试失败,请更改代码。
如果它们失败,请重复步骤 5-6,直到测试通过。
这是一个示例。
假设有人在 community.postgresql
集合中报告了一个问题,即当用户将包含下划线的名称传递给 postgresql_user
模块时,该模块会失败。
我们将集合存储库克隆到 ~/ansible_collections/community/postgresql
目录并准备了我们的环境。从集合的根目录,我们运行 ansible-test integration --list-targets
,它显示一个名为 postgresql_user
的目标。这意味着我们已经有了该模块的测试。
我们从重现错误开始。
首先,我们查看 tests/integration/targets/postgresql_user/tasks/main.yml
文件。在本例中,该文件从 tasks
目录导入其他文件。postgresql_user_general.yml
看起来适合添加到我们的测试中。
# General tests:
- import_tasks: postgresql_user_general.yml
when: postgres_version_resp.stdout is version('9.4', '>=')
我们将以下代码添加到文件中。
# https://github.com/ansible-collections/community.postgresql/issues/NUM
- name: Test username containing underscore
community.postgresql.postgresql_user:
name: underscored_user
register: result
- name: Check the module returns what we expect
assert:
that:
- result is changed
- name: Query the database if the user exists
community.postgresql.postgresql_query:
query: SELECT * FROM pg_authid WHERE rolename = 'underscored_user'
register: result
- name: Check the database returns one row
assert:
that:
- result.query_result.rowcount == 1
当我们以 postgresql_user
作为测试目标运行测试时,此任务必须失败。
现在我们有了失败的测试;我们将修复该错误并再次运行相同的测试。一旦测试通过,我们将认为该错误已修复,并提交拉取请求。
添加新功能时
注意
当你想要为已经存在但缺少集成测试的功能添加集成测试时,本节中描述的过程也适用。
如果你尚未实现新功能,你可以先为其编写集成测试。由于代码尚不存在,它们将无法工作,但它们可以帮助你在开始编写任何代码之前改进你的实现设计。
添加新功能时,添加测试的过程包括以下步骤
确定模块是否存在集成测试。如果不存在,请参阅创建新的集成测试。
在
tests/integration/targets/<target_name>/tasks
目录中找到适合你测试的文件。使用测试覆盖你的功能。有关详细信息,请参阅关于覆盖率的建议部分。
运行测试.
如果它们失败,请查看测试输出以获取详细信息。修复你的代码或测试,然后再次运行测试。
重复步骤 4-5,直到测试通过。
这是一个示例。
假设我们决定向 community.postgresql
集合的 postgresql_user
模块添加一个名为 add_attribute
的新选项。
该选项是布尔值。如果设置为 yes
,它将向数据库用户添加一个额外的属性。
我们将集合存储库克隆到 ~/ansible_collections/community/postgresql
目录并准备了我们的环境。从集合的根目录,我们运行 ansible-test integration --list-targets
,它显示一个名为 postgresql_user
的目标。因此,我们已经有了该模块的一些测试。
首先,我们查看 tests/integration/targets/<target_name>/tasks/main.yml
文件。在本例中,该文件从 tasks
目录导入其他文件。postgresql_user_general.yml
文件看起来适合添加到我们的测试中。
# General tests:
- import_tasks: postgresql_user_general.yml
when: postgres_version_resp.stdout is version('9.4', '>=')
我们将以下代码添加到文件中。
# https://github.com/ansible-collections/community.postgresql/issues/NUM
# We should also run the same tasks with check_mode: true. We omit it here for simplicity.
- name: Test for new_option, create new user WITHOUT the attribute
community.postgresql.postgresql_user:
name: test_user
register: result
- name: Check the module returns what we expect
assert:
that:
- result is changed
- name: Query the database if the user exists but does not have the attribute (it is NULL)
community.postgresql.postgresql_query:
query: SELECT * FROM pg_authid WHERE rolename = 'test_user' AND attribute = NULL
register: result
- name: Check the database returns one row
assert:
that:
- result.query_result.rowcount == 1
- name: Test for new_option, create new user WITH the attribute
community.postgresql.postgresql_user:
name: test_user
register: result
- name: Check the module returns what we expect
assert:
that:
- result is changed
- name: Query the database if the user has the attribute (it is TRUE)
community.postgresql.postgresql_query:
query: SELECT * FROM pg_authid WHERE rolename = 'test_user' AND attribute = 't'
register: result
- name: Check the database returns one row
assert:
that:
- result.query_result.rowcount == 1
然后,我们以 postgresql_user
作为测试目标运行测试。
实际上,我们会交替执行上述任务,并使用 check_mode: true
选项运行相同的任务,以确保我们的选项在检查模式下也能按预期工作。有关详细信息,请参阅关于覆盖率的建议。
如果我们预期任务会失败,我们使用 ignore_errors: true
选项,并检查该任务是否确实失败并返回了我们期望的消息
- name: Test for fail_when_true option
community.postgresql.postgresql_user:
name: test_user
fail_when_true: true
register: result
ignore_errors: true
- name: Check the module fails and returns message we expect
assert:
that:
- result is failed
- result.msg == 'The message we expect'