Skip to content

第 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. 空检索结果需要测试吗?

动手实践 ​

  1. 加入非字符串输入,在应用边界明确拒绝。
  2. 给审批例子增加批准和拒绝两条自动化测试。
  3. 定义真实模型集成测试的成本上限和通过标准。

官方参考 ​

核验日期:2026-09-17。