目录
- 第一段代码:`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, Union
from 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 BaseModel
def 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 None
assert 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 None
assert 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
@dataclass
class NestedBaseModel:
nested: MyBaseModel
@dataclass
class NestedBaseModelList:
nested: List[MyBaseModel]
@dataclass
class NestedBaseModelList2:
nested: List[MyBaseModel]
@dataclass
class NestedBaseModelList3:
nested: List[List[MyBaseModel]]
@dataclass
class NestedBaseModelList4:
nested: List[List[List[List[List[List[MyBaseModel]]]]]]
@dataclass
class NestedBaseModelUnion:
nested: Union[MyBaseModel, str]
@dataclass
class NestedBaseModelUnion2:
nested: MyBaseModel | str
assert 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