Autogen_core 测试代码:test_cache_store.py

目录

原始代码

python 复制代码
from typing import Dict, Generic, Optional, Protocol, TypeVar

T = TypeVar("T")


class CacheStore(Protocol, Generic[T]):
    """
    This protocol defines the basic interface for store/cache operations.

    Sub-classes should handle the lifecycle of underlying storage.
    """

    def get(self, key: str, default: Optional[T] = None) -> Optional[T]:
        """
        Retrieve an item from the store.

        Args:
            key: The key identifying the item in the store.
            default (optional): The default value to return if the key is not found.
                                Defaults to None.

        Returns:
            The value associated with the key if found, else the default value.
        """
        ...

    def set(self, key: str, value: T) -> None:
        """
        Set an item in the store.

        Args:
            key: The key under which the item is to be stored.
            value: The value to be stored in the store.
        """
        ...


class InMemoryStore(CacheStore[T]):
    def __init__(self) -> None:
        self.store: Dict[str, T] = {}

    def get(self, key: str, default: Optional[T] = None) -> Optional[T]:
        return self.store.get(key, default)

    def set(self, key: str, value: T) -> None:
        self.store[key] = value

这段代码定义了一个缓存存储的基本接口和一个基于内存的实现。

  • 首先,它从typing模块导入了一些泛型类型定义,用于后续的类型注解。

  • 接着,定义了一个类型变量T,这是一个泛型占位符,用于表示存储在缓存中的数据的类型。

  • 然后,定义了一个名为CacheStore的协议类,它是一个泛型类,参数为T。这个类定义了缓存存储操作的基本接口,包括getset方法。get方法用于从存储中检索一个项,如果找不到指定的键,则返回默认值;set方法用于在存储中设置一个项。

  • 最后,定义了一个名为InMemoryStore的类,它继承自CacheStore并实现了getset方法。InMemoryStore使用一个字典self.store来在内存中存储数据。get方法通过键来获取存储中的值,如果键不存在,则返回默认值;set方法用于将一个键值对存储到字典中。

总的来说,这段代码定义了一个缓存存储的接口和一个简单的内存存储实现,使得可以通过键来存取数据,并提供了一个默认值机制。

测试代码

python 复制代码
from unittest.mock import Mock

from autogen_core import CacheStore, InMemoryStore


def test_set_and_get_object_key_value() -> None:
    mock_store = Mock(spec=CacheStore)
    test_key = "test_key"
    test_value = object()
    mock_store.set(test_key, test_value)
    mock_store.get.return_value = test_value
    mock_store.set.assert_called_with(test_key, test_value)
    assert mock_store.get(test_key) == test_value

test_set_and_get_object_key_value()

第一段代码定义了一个名为 test_set_and_get_object_key_value 的测试函数。这个函数测试了一个缓存存储对象(通过 Mock 模拟的)的 setget 方法。具体步骤如下:

  1. 创建一个 Mock 对象 mock_store,它模拟了 CacheStore 类。
  2. 定义了一个测试用的键 test_key 和一个测试用的值 test_value(这里是一个新的 object 实例)。
  3. 调用 mock_store.set(test_key, test_value) 来模拟设置键值对。
  4. 设置 mock_store.get 方法的返回值为 test_value,这样当调用 get 方法时,它会返回之前设置的值。
  5. 通过 mock_store.set.assert_called_with(test_key, test_value) 断言 set 方法是否被正确调用。
  6. 断言 mock_store.get(test_key) 的返回值是否等于 test_value

这个测试函数检查了存储对象是否能够正确地设置和获取键值对。

python 复制代码
def test_get_non_existent_key() -> None:
    mock_store = Mock(spec=CacheStore)
    key = "non_existent_key"
    mock_store.get.return_value = None
    assert mock_store.get(key) is None


test_get_non_existent_key()

第二段代码定义了一个名为 test_get_non_existent_key 的测试函数。这个函数测试了当请求一个不存在的键时,缓存存储对象的行为。具体步骤如下:

  1. 创建一个 Mock 对象 mock_store,模拟了 CacheStore 类。
  2. 定义一个不存在的键 key
  3. 设置 mock_store.get 方法的返回值为 None
  4. 断言 mock_store.get(key) 的返回值是否为 None

这个测试函数检查了当请求的键不存在时,存储对象是否返回 None

python 复制代码
def test_set_overwrite_existing_key() -> None:
    mock_store = Mock(spec=CacheStore)
    key = "test_key"
    initial_value = "initial_value"
    new_value = "new_value"
    mock_store.set(key, initial_value)
    mock_store.set(key, new_value)
    mock_store.get.return_value = new_value
    mock_store.set.assert_called_with(key, new_value)
    assert mock_store.get(key) == new_value

test_set_overwrite_existing_key() 

第三段代码定义了一个名为 test_set_overwrite_existing_key 的测试函数。这个函数测试了设置一个已经存在的键时,缓存存储对象是否会覆盖旧的值。具体步骤如下:

  1. 创建一个 Mock 对象 mock_store,模拟了 CacheStore 类。
  2. 定义了一个键 key 和两个值 initial_valuenew_value
  3. 调用 mock_store.set(key, initial_value) 来模拟设置初始键值对。
  4. 再次调用 mock_store.set(key, new_value) 来模拟覆盖设置键值对。
  5. 设置 mock_store.get 方法的返回值为 new_value
  6. 断言 mock_store.set 是否被用 keynew_value 调用。
  7. 断言 mock_store.get(key) 的返回值是否等于 new_value

这个测试函数检查了设置已存在的键时,存储对象是否正确地覆盖了旧的值。

python 复制代码
def test_inmemory_store() -> None:
    store = InMemoryStore[int]()
    test_key = "test_key"
    test_value = 42
    store.set(test_key, test_value)
    assert store.get(test_key) == test_value

    new_value = 2
    store.set(test_key, new_value)
    assert store.get(test_key) == new_value

    key = "non_existent_key"
    default_value = 99
    assert store.get(key, default_value) == default_value
    
test_inmemory_store()

第四段代码定义了一个名为 test_inmemory_store 的测试函数。这个函数测试了 InMemoryStore 类(一个内存中的存储实现)的 setget 方法。具体步骤如下:

  1. 创建一个 InMemoryStore 实例,用于存储整数类型。
  2. 定义了一个测试用的键 test_key 和一个测试用的值 test_value
  3. 调用 store.set(test_key, test_value) 来设置键值对。
  4. 断言 store.get(test_key) 的返回值是否等于 test_value
  5. 定义一个新的值 new_value,并使用 store.set(test_key, new_value) 来覆盖之前的键值对。
  6. 断言 store.get(test_key) 的返回值是否等于 new_value
  7. 定义一个不存在的键 key 和一个默认值 default_value
  8. 断言 store.get(key, default_value) 的返回值是否等于 default_value

这个测试函数检查了 InMemoryStore 是否能够正确地设置和获取键值对,以及当键不存在时是否返回默认值。

总的来说,这些代码片段是对缓存存储系统的单元测试,它们确保了存储接口的正确实现,包括设置和获取键值对以及处理不存在的键的情况。

代码中用到的typing注解





参考链接:https://github.com/microsoft/autogen/blob/main/python/packages/autogen-core/tests/test_cache_store.py

相关推荐
何双新2 小时前
Odoo AI 智能查询系统
前端·人工智能·python
生命是有光的4 小时前
【机器学习】机器学习算法
人工智能·机器学习
Blossom.1184 小时前
把 AI 塞进「自行车码表」——基于 MEMS 的 3D 地形预测码表
人工智能·python·深度学习·opencv·机器学习·计算机视觉·3d
小鹿的工作手帐7 小时前
有鹿机器人:为城市描绘清洁新图景的智能使者
人工智能·科技·机器人
TechubNews8 小时前
香港数字资产交易市场蓬勃发展,监管与创新并驾齐驱
人工智能·区块链
DogDaoDao9 小时前
用PyTorch实现多类图像分类:从原理到实际操作
图像处理·人工智能·pytorch·python·深度学习·分类·图像分类
小和尚同志9 小时前
450 star 的神级提示词管理工具 AI-Gist,让提示词不再吃灰
人工智能·aigc
金井PRATHAMA10 小时前
大脑的藏宝图——神经科学如何为自然语言处理(NLP)的深度语义理解绘制新航线
人工智能·自然语言处理
大学生毕业题目10 小时前
毕业项目推荐:28-基于yolov8/yolov5/yolo11的电塔危险物品检测识别系统(Python+卷积神经网络)
人工智能·python·yolo·cnn·pyqt·电塔·危险物品
星期天要睡觉10 小时前
深度学习——卷积神经网络CNN(原理:基本结构流程、卷积层、池化层、全连接层等)
人工智能·深度学习·cnn