目录
- 第一段代码:`test_get_types`
- 第二段代码:`test_handler`
- 第三段代码:`test_nested_data_model`
- 总结
代码段是针对
autogen_core 的库的单元测试,主要关注类型检查和消息处理。让我们逐个解释每个代码段的功能:
第一段代码:test_get_types
from dataclasses import dataclass
from types import NoneType
from typing import Any, List, Optional, Unionfrom autogen_core import MessageContext
from autogen_core._routed_agent import RoutedAgent, message_handler
from autogen_core._serialization import has_nested_base_model
from autogen_core._type_helpers import AnyType, get_types
from pydantic import BaseModeldef test_get_types() -> None:assert get_types(Union[int, str]) == (int, str)assert get_types(int | str) == (int, str)assert get_types(int) == (int,)assert get_types(str) == (str,)assert get_types("test") is Noneassert get_types(Optional[int]) == (int, NoneType)assert get_types(NoneType) == (NoneType,)assert get_types(None) == (NoneType,)test_get_types()
这段代码测试了一个名为 get_types 的函数,该函数用于获取 Python 类型提示中的可能类型。
Union[int, str]和int | str:检查联合类型(Union)和 Python 3.10 引入的|运算符是否正确处理。int和str:检查基本数据类型。"test":检查非类型提示(普通字符串),预期返回None。Optional[int]:检查Optional类型,它表示一个类型加上None。NoneType和None:检查NoneType和None常量。
功能:确认 get_types 函数能够正确识别和处理不同类型的 Python 类型提示。
第二段代码:test_handler
def test_handler() -> None:class HandlerClass(RoutedAgent):@message_handler()async def handler(self, message: int, ctx: MessageContext) -> Any:return None@message_handler()async def handler2(self, message: str | bool, ctx: MessageContext) -> None:return Noneassert HandlerClass.handler.target_types == [int]assert HandlerClass.handler.produces_types == [AnyType]assert HandlerClass.handler2.target_types == [str, bool]assert HandlerClass.handler2.produces_types == [NoneType]test_handler()
这段代码测试了一个名为 HandlerClass 的类,它继承自 RoutedAgent。这个类有两个装饰为 @message_handler 的异步方法。
handler:接受一个int类型的消息和一个MessageContext对象,返回Any类型。handler2:接受一个str | bool类型的消息和一个MessageContext对象,返回None。
测试确认 handler 和 handler2 方法的 target_types 和 produces_types 属性是否正确设置。
功能:确认使用 @message_handler 装饰器的方法能够正确注册其接受和返回的类型。
第三段代码:test_nested_data_model
def test_nested_data_model() -> None:class MyBaseModel(BaseModel):message: str@dataclassclass NestedBaseModel:nested: MyBaseModel@dataclassclass NestedBaseModelList:nested: List[MyBaseModel]@dataclassclass NestedBaseModelList2:nested: List[MyBaseModel]@dataclassclass NestedBaseModelList3:nested: List[List[MyBaseModel]]@dataclassclass NestedBaseModelList4:nested: List[List[List[List[List[List[MyBaseModel]]]]]]@dataclassclass NestedBaseModelUnion:nested: Union[MyBaseModel, str]@dataclassclass NestedBaseModelUnion2:nested: MyBaseModel | strassert has_nested_base_model(NestedBaseModel)assert has_nested_base_model(NestedBaseModelList)assert has_nested_base_model(NestedBaseModelList2)assert has_nested_base_model(NestedBaseModelList3)assert has_nested_base_model(NestedBaseModelList4)assert has_nested_base_model(NestedBaseModelUnion)assert has_nested_base_model(NestedBaseModelUnion2)test_nested_data_model()
这段代码测试了一个名为 has_nested_base_model 的函数,用于检查一个数据模型中是否嵌套了 Pydantic 的 BaseModel。
MyBaseModel:一个继承自BaseModel的简单模型,包含一个字符串字段。NestedBaseModel、NestedBaseModelList、NestedBaseModelList2、NestedBaseModelList3、NestedBaseModelList4:这些类使用@dataclass装饰器,并且嵌套了MyBaseModel对象或其列表。NestedBaseModelUnion和NestedBaseModelUnion2:这些类使用@dataclass装饰器,并且嵌套了MyBaseModel对象或字符串的联合类型。
测试确认 has_nested_base_model 函数能够正确检测到嵌套的 BaseModel。
功能:确认 has_nested_base_model 函数能够正确识别数据类中嵌套的 Pydantic BaseModel。
总结
这些测试用例确保了 autogen_core 库中关于类型处理和消息处理的核心功能正确实现。具体来说,它们验证了:
- 类型提示的处理(
get_types函数)。 - 消息处理器的类型注册(通过
@message_handler装饰器)。 - 检测数据模型中的嵌套 Pydantic
BaseModel(has_nested_base_model函数)。
这些测试对于确保库的健壮性和正确性至关重要,特别是在类型提示和异步消息处理方面。
参考链接:https://github.com/microsoft/autogen/blob/main/python/packages/autogen-core/tests/test_types.py
