创建新的集成测试
本节涵盖以下情况
集合或集合中的一组模块根本没有集成测试。
您正在添加一个新模块,并且想要包含集成测试。
您想为一个没有集成测试的现有模块添加集成测试。
换句话说,目前模块没有任何测试,无论模块是否存在。
如果模块已经存在测试,请参见 添加到现有集成测试中。
简化示例
这是一个简化的抽象示例。
假设我们要为 community.abstract
集合中的一个新模块添加集成测试,该模块与某些服务交互。
我们 检查 并确定根本没有集成测试。
我们基本上应该执行以下操作
使用
setup
目标安装和运行服务。创建一个测试目标。
为模块添加集成测试。
运行测试.
根据需要修复代码和测试,重新运行测试,并重复此循环,直到它们通过。
注意
在实现也使用相同服务的其他目标时,您可以重用 setup
目标。
将集合克隆到本地机器上的
~/ansible_collections/community.abstract
目录。从
~/ansible_collections/community.abstract
目录,为setup
目标创建目录
mkdir -p tests/integration/targets/setup_abstract_service/tasks
编写准备环境、安装和运行服务所需的所有任务。
为了简单起见,假设该服务在原生发行版存储库中可用,并且不需要复杂的配置。
将以下任务添加到 tests/integration/targets/setup_abstract_service/tasks/main.yml
文件以安装和运行服务
- name: Install abstract service
package:
name: abstract_service
- name: Run the service
systemd:
name: abstract_service
state: started
这是一个非常简单的示例。
添加您正在测试的模块的目标。
假设该模块名为 abstract_service_info
。在目标中创建以下目录结构
mkdir -p tests/integration/targets/abstract_service_info/tasks
mkdir -p tests/integration/targets/abstract_service_info/meta
添加所有必要的子目录。例如,如果您要使用默认值和文件,请添加 defaults
和 files
目录,依此类推。方法与创建角色时相同。
要使
setup_abstract_service
目标在模块的目标之前运行,请将以下行添加到tests/integration/targets/abstract_service_info/meta/main.yml
文件中。
dependencies:
- setup_abstract_service
首先编写一个独立的任务来检查您的模块是否可以与服务交互。
我们假设 abstract_service_info
模块从 abstract_service
获取一些信息,并且它有两个连接参数。
除其他字段外,它返回一个名为 version
的字段,其中包含服务版本。
将以下内容添加到 tests/integration/targets/abstract_service_info/tasks/main.yml
中
- name: Fetch info from abstract service
abstract_service_info:
host: 127.0.0.1 # We assume the service accepts local connection by default
port: 1234 # We assume that the service is listening to this port by default
register: result # This variable will contain the returned JSON including the server version
- name: Test the output
assert:
that:
- result.version == '1.0.0' # Check version field contains what we expect
运行测试,使用
-vvv
参数。
如果连接存在任何问题(例如,服务不接受连接)或代码有问题,则剧本将失败。
检查输出以查看故障发生在哪个步骤。调查原因,修复它,然后再次运行。重复此循环,直到测试通过。
如果测试成功,请编写更多测试。有关详细信息,请参阅 关于覆盖率的建议 部分。
community.postgresql
示例
以下是如何从头开始为 community.postgresql.postgresql_info
模块编写集成测试的真实示例。
为了简单起见,我们将创建非常基本的测试,我们将使用 Ubuntu 20.04 测试容器运行这些测试。
我们使用 Linux
作为工作环境,并且已经安装并运行了 git
和 docker
。
我们还安装了 ansible-core
。
在您的主目录中创建以下目录
mkdir -p ~/ansible_collections/community
通过 GitHub 网页界面分叉 集合存储库。
将分叉的存储库从您的个人资料克隆到创建的路径
git clone https://github.com/YOURACC/community.postgresql.git ~/ansible_collections/community/postgresql
如果您更喜欢使用 SSH 协议
git clone [email protected]:YOURACC/community.postgresql.git ~/ansible_collections/community/postgresql
转到克隆的存储库
cd ~/ansible_collections/community/postgresql
确保您在默认分支中
git status
检出一个测试分支
git checkout -b postgresql_info_tests
由于我们已经为
postgresql_info
模块进行了测试,因此我们将运行以下命令
rm -rf tests/integration/targets/*
现在所有目标都被删除,当前状态就像我们根本没有为 community.postgresql
集合进行任何集成测试一样。我们现在可以从头开始编写集成测试。
我们将首先创建一个
setup
目标,它将安装所有必需的软件包并启动 PostgreSQL。创建以下目录
mkdir -p tests/integration/targets/setup_postgresql_db/tasks
创建
tests/integration/targets/setup_postgresql_db/tasks/main.yml
文件,并向其中添加以下任务
- name: Install required packages
package:
name:
- apt-utils
- postgresql
- postgresql-common
- python3-psycopg2
- name: Initialize PostgreSQL
shell: . /usr/share/postgresql-common/maintscripts-functions && set_system_locale && /usr/bin/pg_createcluster -u postgres 12 main
args:
creates: /etc/postgresql/12/
- name: Start PostgreSQL service
ansible.builtin.service:
name: postgresql
state: started
这对我们非常基本的示例来说已经足够了。
然后,为
postgresql_info
目标创建以下目录
mkdir -p tests/integration/targets/postgresql_info/tasks tests/integration/targets/postgresql_info/meta
要使
setup_postgresql_db
目标作为依赖项在postgresql_info
目标之前运行,请创建tests/integration/targets/postgresql_info/meta/main.yml
文件,并将以下代码添加到其中
dependencies:
- setup_postgresql_db
现在,我们准备为
postgresql_info
模块添加第一个测试任务。创建tests/integration/targets/postgresql_info/tasks/main.yml
文件,并将以下代码添加到其中
- name: Test postgresql_info module
become: true
become_user: postgres
community.postgresql.postgresql_info:
login_user: postgres
login_db: postgres
register: result
- name: Check the module returns what we expect
assert:
that:
- result is not changed
- result.version.major == 12
- result.version.minor == 8
在第一个任务中,我们运行 postgresql_info
模块以从我们使用 setup_postgresql_db
目标安装和启动的数据库中获取信息。我们将模块返回的值保存到 result
变量中。
在第二个任务中,我们使用 assert
模块检查 result
变量(这是第一个任务返回的值)。我们期望,除其他事项外,结果包含版本,并报告系统状态没有更改。
在 Ubuntu 20.04 docker 容器中运行测试
ansible-test integration postgresql_info --docker ubuntu2004 -vvv
测试应该通过。如果我们查看输出,应该看到类似以下内容
TASK [postgresql_info : Check the module returns what we expect] ***************
ok: [testhost] => {
"changed": false,
"msg": "All assertions passed"
}
如果你的测试在项目开发过程中失败,请检查输出以查看故障发生在哪个步骤。调查原因,修复它,然后再次运行。重复此循环,直到测试通过。如果测试成功,请编写更多测试。有关详细信息,请参阅 覆盖范围建议 部分。