You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 16:22:49