Autogen_core 测试代码:test_cache_store.py

news2025/1/31 3:30:35

目录

    • 原始代码
    • 测试代码
    • 代码中用到的typing注解

原始代码

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方法用于将一个键值对存储到字典中。

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

测试代码

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2286724.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

变压器的漏感

测量变压器漏感的时候需要将次级绕组短路: 测量变压器初级线圈的电感方法很简单,直接用LCR测量就可,无需像测量漏感那样将次级绕组短接:

从ChatGPT热潮看智算崛起

2025年1月7日,科智咨询发布《2025年IDC产业七大发展趋势》,其中提到“ChatGPT开启生成式AI热潮,智能算力需求暴涨,算力供给结构发生转变”。 【图片来源于网络,侵删】 为何会以ChatGPT发布为节点呢?咱们一起…

攻克 AI 幻觉难题

当下,AI 已经成为我们生活中不可或缺的一部分。无论是智能语音助手,还是对话式的AI模型,它们凭借强大的算法和海量的数据,为我们答疑解惑、出谋划策。 然而,小编今天向AI提问:上山打老虎。他却回答&#x…

格式化时间的插件

1.安装dayjs包 npm i dayjs 2.组件中的应用

自创《艺术人生》浅析

艺术是生活的馈赠,艺术是苦痛的呻吟。 笔记模板由python脚本于2025-01-29 00:01:11创建,本篇笔记适合喜欢写诗读诗诵诗的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值:在于输出思考与经验,而不仅仅是知识的简单复述。 …

防御保护第一次实验:安全策略配置

一、实验拓扑 二、实验要求 三、需求分析 1.创建两个vlan 2.在ENSP中配置基于时间的ACL实现对于办公区PC访问OA Server的时间限制(工作日早8到晚6)。 3.通过配置基于MAC地址的ACL来实现对于生产区PC访问Web Server的限制(除PC3外不能访问&am…

【Pytest】生成html报告中,中文乱码问题解决方案

链接上一篇文章:https://blog.csdn.net/u013080870/article/details/145369926?spm1001.2014.3001.5502 中文乱码问题,python3,Python3.7后,还一个文件就是result.py 因为中文可以在内容中,也可能在文件名,类名&…

【ollama通过命令行启动后如何在网页端查看运行】

ollama通过命令行启动后如何在网页端查看运行 http://localhost:11434/

Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊(毛玻璃)对比,Kotlin

Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊(毛玻璃)对比,Kotlin import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.RectF …

Jetpack Compose 和 Compose Multiplatform 还有 KMP 的关系

今天刚好看到官方发布了一篇文章,用于讨论 Compose Multiplatform 和 Jetpack Compose 之间的区别,突然想起之前评论区经常看到说 “Flutter 和 CMP 对于 Google 来说项目重叠的问题”,刚好可以放一起聊一聊。 最近写的几篇内容写的太干&…

python生成图片和pdf,快速

1、下载安装 pip install imgkit pip install pdfkit2、wkhtmltopdf工具包,下载安装 下载地址:https://wkhtmltopdf.org/downloads.html 3、生成图片 import imgkit path_wkimg rD:\app\wkhtmltopdf\bin\wkhtmltoimage.exe # 工具路径,安…

解锁FPGA的故障免疫密码

我们身处“碳基智能”大步迈向“硅基智能”序曲中,前者更像是后者的引导程序,AI平民化时代,万物皆摩尔定律。 越快越好,几乎适用绝大多数场景。 在通往人工智能的征程中,算力无处不在,芯片作用无可替代。 十六年前,就已宣称自己是一家软件公司的英伟达,现已登顶全球…

【数据结构】初识链表

顺序表的优缺点 缺点: 中间/头部的插入删除,时间复杂度效率较低,为O(N) 空间不够的时候需要扩容。 如果是异地扩容,增容需要申请新空间,拷贝数据,释放旧空间,会有不小的消耗。 扩容可能会存在…

【hot100】刷题记录(6)-轮转数组

题目描述: 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转…

如何移植ftp服务器到arm板子?

很多厂家提供的sdk,一般都不自带ftp服务器功能, 需要要发人员自己移植ftp服务器程序。 本文手把手教大家如何移植ftp server到arm板子。 环境 sdk:复旦微 Buildroot 2018.02.31. 解压 $ mkdir ~/vsftpd $ cp vsftpd-3.0.2.tar.gz ~/vs…

深度学习 Pytorch 神经网络的损失函数

本节开始将以分类神经网络为例,展示神经网络的学习和训练过程。在介绍PyTorch的基本工具AutoGrad库时,我们系统地介绍过数学中的优化问题和优化思想,我们介绍了最小二乘法以及梯度下降法这两个入门级优化算法的具体操作,并使用Aut…

C++ 中用于控制输出格式的操纵符——setw 、setfill、setprecision、fixed

目录 四种操纵符简要介绍 setprecision基本用法 setfill的基本用法 fixed的基本用法 setw基本用法 以下是一些常见的用法和示例: 1. 设置字段宽度和填充字符 2. 设置字段宽度和对齐方式 3. 设置字段宽度和精度 4. 设置字段宽度和填充字符,结合…

996引擎 - NPC-添加NPC引擎自带形象

996引擎 - NPC-添加NPC引擎自带形象 截图参考添加NPC参考资料截图参考 添加NPC 编辑NPC表:Envir\DATA\cfg_npclist.xls 1.1. 需要临时隐藏NPC时可以在id前加 // 1.2. 如果NPC朝向不对,可以调整dir 列。(按8方向,上是0顺时针数。我这里给的4) 1.3. 形象代码:NPC代码、怪物…

深度研究新范式:通过Ollama和DeepSeek R1实现自动化研究

引言 在信息时代,海量数据的产生与传播速度前所未有地加快,这既为研究者提供了丰富的资源,也带来了信息筛选与处理的巨大挑战。 传统研究方法往往依赖于研究者的个人知识库、文献检索技能以及时间投入,但面对指数级增长的数据量…

Golang 并发机制-1:Golang并发特性概述

并发是现代软件开发中的一个基本概念,它使程序能够同时执行多个任务,从而提高效率和响应能力。在本文中,我们将探讨并发性在现代软件开发中的重要性,并深入研究Go处理并发任务的独特方法。 并发的重要性 增强性能 并发在提高软…