第 11 章 · 测试状态转移与回归边界
测试图不必每次都付费调用模型。把可预测的分支、状态更新、拒绝路径先测稳,再单独对模型做集成与质量评估。
工作机制与设计选择
单元测试检查节点输出;图集成测试检查最终状态及路径;真实模型评估检查事实性和工具选择,而不是精确匹配每个字。本章将图构建放在函数里,每次测试得到独立实例。这样可避免共享 checkpointer、store 或可变全局状态让测试互相影响。
示例
python
import unittest
from typing import TypedDict
from langgraph.graph import StateGraph, START, END
class State(TypedDict):
text: str
accepted: bool
def validate(state: State):
return {"accepted": bool(state["text"].strip())}
def make_graph():
builder = StateGraph(State)
builder.add_node("validate", validate)
builder.add_edge(START, "validate")
builder.add_edge("validate", END)
return builder.compile()
class GraphTests(unittest.TestCase):
def test_node(self):
self.assertEqual(validate({"text": "ok"}), {"accepted": True})
def test_graph_cases(self):
for text, expected in [("", False), (" ", False), ("hello", True)]:
with self.subTest(text=text):
result = make_graph().invoke({"text": text, "accepted": False})
self.assertEqual(result["accepted"], expected)
self.assertEqual(result["text"], text)
if __name__ == "__main__":
unittest.main()运行与验收
保存为 test_graph.py,执行 python test_graph.py;应输出 OK。这里使用标准库 unittest,无需增加 pytest 依赖。通过并不说明模型质量合格,只说明这些确定性契约满足要求。
容易踩的坑
不要只测成功路径。中断恢复、次数耗尽、未知工具、重复请求和空检索结果更能揭露生产问题。测试数据必须固定,避免依赖变化中的公开网页。
🧪 随堂测验
点击你认为正确的选项。答错时会展示正确答案与原因解析。
1. 单元测试必须请求模型吗?
2. 为什么每次建新图?
3. 模型质量适合只比字符串吗?
4. 空检索结果需要测试吗?
动手实践
- 加入非字符串输入,在应用边界明确拒绝。
- 给审批例子增加批准和拒绝两条自动化测试。
- 定义真实模型集成测试的成本上限和通过标准。
官方参考
核验日期:2026-09-17。