单元测试用于在隔离环境中验证 Agent 的小型、确定性逻辑单元。通过将真实 LLM 替换为内存中的伪实现(又称 fixture),你可以预先设定精确响应(文本、工具调用和错误),从而使测试快速、免费、可重复,并且无需 API 密钥。

模拟聊天模型

LangChain 提供了 GenericFakeChatModel 用于模拟文本响应。它接收一个响应迭代器(AIMessage 对象或字符串),并在每次调用时返回其中一个响应。它同时支持常规调用和流式调用。
from langchain_core.language_models.fake_chat_models import GenericFakeChatModel

model = GenericFakeChatModel(messages=iter([
    AIMessage(content="", tool_calls=[ToolCall(name="foo", args={"bar": "baz"}, id="call_1")]),
    "bar"
]))

model.invoke("hello")
# AIMessage(content='', ..., tool_calls=[{'name': 'foo', 'args': {'bar': 'baz'}, 'id': 'call_1', 'type': 'tool_call'}])
如果再次调用模型,它会返回迭代器中的下一项:
model.invoke("hello, again!")
# AIMessage(content='bar', ...)

InMemorySaver 检查点存储器

为了在测试期间启用持久化,你可以使用 InMemorySaver 检查点存储器。这样可以模拟多轮对话,以测试依赖状态的行为:
from langgraph.checkpoint.memory import InMemorySaver

agent = create_agent(
    model,
    tools=[],
    checkpointer=InMemorySaver()
)

# 第一次调用
agent.invoke(
    {"messages": [HumanMessage(content="I live in Sydney, Australia")]},
    config={"configurable": {"thread_id": "session-1"}}
)

# 第二次调用:第一条消息(悉尼位置)已被持久化,因此模型返回 GMT+10 时间
agent.invoke(
    {"messages": [HumanMessage(content="What's my local time?")]},
    config={"configurable": {"thread_id": "session-1"}}
)

后续步骤

了解如何使用真实模型提供商 API 测试 Agent,请参阅 集成测试