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。这个类定义了缓存存储操作的基本接口,包括get和set方法。get方法用于从存储中检索一个项,如果找不到指定的键,则返回默认值;set方法用于在存储中设置一个项。

  • 最后,定义了一个名为InMemoryStore的类,它继承自CacheStore并实现了get和set方法。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 模拟的)的 set 和 get 方法。具体步骤如下:

  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_value、new_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 是否被用 key 和 new_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 类(一个内存中的存储实现)的 set 和 get 方法。具体步骤如下:

  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

相关推荐
拉你进_教堂8 分钟前
小龙虾技能之【Contactless Health Risk Screening Tool | 非接触式健康风险检测分析工具】简介
人工智能·目标检测·计算机视觉·多模态大模型·openclaw小龙虾技能
梦想的初衷~11 分钟前
从通量数据到SCI论文——AI-R语言生态系统碳水热通量及其机制分析与论文实战
人工智能·机器学习·r语言·r 语言·fluxnet·涡度·生态系统碳通量
维智佳创winzsoft11 分钟前
维智佳创受邀参加中望软件ZWORLD 2026,共塑CAD二次开发AI新智能
人工智能·科技·ai·业界资讯·cad二次开发·中望cad二次开发·cad-ai设计
飞猫的边缘AI15 分钟前
马斯克的Starmind与太空边缘计算
人工智能·芯片·英伟达·边缘ai
梦想的颜色18 分钟前
【AI速览】TTS 语音克隆 + 音色稳定 + 长文本断句 + 数字人驱动全解
人工智能·语音识别·indextts2
东坡肘子20 分钟前
当 Build in Public 重新转入地下 -- 肘子的 Swift 周报 #157
人工智能·swiftui·swift
兰亭妙微UI设计公司20 分钟前
兰亭妙微界面设计公司分享:DeepSeek AI智能助手应用UI/UX设计深度解析
人工智能·ui·ux
阿里云云原生20 分钟前
千问办公 × AgentBridge:连接企业数据,让智能分析触手可及
agent
MobotStone1 小时前
花了几百万买的 AI 系统,为什么最后全成了花瓶?
人工智能
做萤石二次开发的哈哈8 小时前
连锁门店、园区、交通枢纽的视频如何统一汇集?应用模板的接入与分权管理详解
人工智能·物联网·音视频·二次开发·视频监控·蓝海aiot一站式工作台·萤石云开放平台