Ansible动态Inventory插件单元测试示例及Mock方法咨询
如何为Ansible动态Inventory插件编写单元测试
Ansible动态Inventory插件的单元测试完全可行,核心是针对性mockparse方法依赖的inventory、loader、path对象——不用纠结内部对象的复杂度,只需要mock插件实际用到的属性和方法即可。以下是具体实现步骤和示例:
核心思路
动态Inventory的parse方法本质是接收依赖对象,然后根据数据源(比如配置文件、API返回)生成主机/组信息。我们只需要:
- 用
unittest.mock.Mock模拟inventory和loader,只实现插件用到的方法/属性 path直接传入测试用的字符串(或按需mock)- 验证插件是否正确调用
inventory的方法(如add_host、add_group)
示例代码
假设你有一个自定义动态Inventory插件MyDynamicInventory,以下是对应的单元测试:
import unittest from unittest.mock import Mock, patch, mock_open from ansible.inventory.data import InventoryData # 导入你的自定义插件 from my_plugins.inventory.my_dynamic_inventory import MyDynamicInventory class TestMyDynamicInventory(unittest.TestCase): def setUp(self): # 初始化插件实例 self.plugin = MyDynamicInventory() def test_parse_valid_config(self): # 1. Mock Inventory对象:模拟核心的添加主机方法和数据容器 mock_inventory = Mock() mock_inventory.data = InventoryData() mock_inventory.add_host = Mock() # 2. Mock Loader对象:模拟插件用到的文件读取方法 mock_loader = Mock() # 让loader返回测试用的文件路径 mock_loader.get_real_file.return_value = "/tmp/test_inv_config.yml" # 3. 模拟配置文件内容(如果插件读取本地文件) test_config_content = """ web_servers: hosts: web01: web02: """ with patch("builtins.open", mock_open(read_data=test_config_content)): # 4. 调用插件的parse方法 self.plugin.parse(mock_inventory, mock_loader, "test_config.yml") # 5. 验证插件是否正确添加了主机 mock_inventory.add_host.assert_any_call(name="web01") mock_inventory.add_host.assert_any_call(name="web02") def test_parse_empty_config(self): # 测试空配置的情况 mock_inventory = Mock() mock_inventory.data = InventoryData() mock_inventory.add_host = Mock() mock_loader = Mock() mock_loader.get_real_file.return_value = "/tmp/empty_config.yml" with patch("builtins.open", mock_open(read_data="")): self.plugin.parse(mock_inventory, mock_loader, "empty_config.yml") # 验证没有添加任何主机 mock_inventory.add_host.assert_not_called()
关键注意事项
- 按需mock:不需要模拟整个Ansible内部类的所有方法,只mock插件实际用到的部分(比如插件只用
loader.get_real_file,就只mock这个方法) - 验证行为而非状态:重点验证插件是否正确调用了
inventory的add_host/add_group方法,而不是直接检查inventory.data的内容 - 参考官方测试:Ansible源码的
test/inventory/test_plugins目录下有大量官方动态Inventory插件的测试用例,可直接参考实现逻辑
内容的提问来源于stack exchange,提问作者tempuser
相关产品推荐
相关产品推荐

