为什么大模型项目必须写自动化测试?cgft-llm Pytest代码测试完整教程
【免费下载链接】cgft-llmcgft-llm 是一个学习大语言模型(LLM)开发的开源资源。它提供代码、文档和视频教程,帮助用户通过实践掌握前沿核心 LLM 技术项目地址: https://gitcode.com/echonoshy/cgft-llm
大模型项目写自动化测试,本质是把"模型输出的不确定性"变成"可验证的稳定性"。本文以 cgft-llm 大模型实战项目为例,讲清楚 LLM 开发为什么必须写自动化测试,并给出一份完整的 Pytest 代码测试教程:涵盖断言、Fixture 夹具、参数化、Mark 分类等核心概念,以及大模型项目质量保障必备的 pytest 命令行参数,新手也能快速上手。
为什么大模型项目必须写自动化测试
1. 模型输出不稳定,"人肉测试"永远测不全
传统 Web 项目里,同样输入几乎总有同样输出;而 LLM 项目不是:
- 同一 prompt 多次调用结果不同,靠人工抽查必然漏掉坏 case;
- 采样参数(temperature、top_p)微调就会改变输出分布,手动回归测试跟不上;
- 依赖版本、上下文长度变化都会悄悄影响表现。
自动化测试用断言持续校验"结构、格式、边界条件",每次改动后一键回归,是应对不确定性的唯一可靠方式。
2. 大模型链路长,越复杂越需要测试兜底
典型的 LLM 应用不是"一次模型调用",而是一条长链路。以 cgft-llm 中的 Function Calling 自动发邮件项目为例:用户意图 → 模型生成函数调用 → 解析参数 → 执行发送,任何一环出错,问题都会在生产环境才暴露:
对应代码可参考 02-llm-core/function-calling/app.py 与 02-llm-core/function-calling/README.md。
RAG 知识库系统同理:文档加载 → 切分 → 向量化 → 检索 → 拼装 Prompt → 模型作答,链路更长,更需要对每个环节做独立的单元测试:
相关实现见 02-llm-core/llama-index/README.md。
Pytest 代码测试:5 个核心概念一次看懂
pytest 是 Python 自动化测试的首选框架,也是 cgft-llm"动手加入开源"系列中的代码测试工具。完整教程文档:03-open-source/docs/pytest.md
断言:一行 assert 代替整个断言库
pytest 直接使用 Python 原生assert,无需额外引入断言库:
# 验证正常逻辑 assert 1 + 1 == 2 # 验证错误输入时是否正确抛出异常 import pytest def test_divide_zero(): with pytest.raises(ValueError): divide(1, 0)对 LLM 项目来说,"错误输入抛出异常"这类边界测试(空 prompt、超长上下文)尤其重要。
测试发现:pytest 如何自动找到你的测试文件
不需要手动注册,按命名约定即可被自动发现:
| 规则 | 约定 |
|---|---|
| 文件名 | test_*.py或*_test.py |
| 函数/方法 | 以test_开头 |
| 类 | 以Test开头 |
在项目根目录直接运行pytest即可自动搜索当前目录及子目录(详见 pytest.md 发现规则)。
Fixture 夹具:大模型测试准备与清理的规范写法
大模型测试经常需要"昂贵的准备"(初始化模型客户端、连接向量库)。Fixture 让准备工作只执行一次并在会话结束时自动清理:
@pytest.fixture(scope="session") def llm_client(): yield create_client(...) # 整个测试会话只初始化一次作用域选择建议:
| 作用域 | 适用场景 |
|---|---|
function(默认) | 每条用例独立的测试数据 |
session | 模型客户端、数据库连接池等全局资源 |
Mark 标记:冒烟测试单独跑,慢测试按需跳过
真实调用大模型的测试又慢又花钱。用 Mark 给测试分类,就能灵活筛选:
pytest -m "smoke" # 只跑核心冒烟测试 pytest -m "not slow" # 跳过涉及真实模型调用的慢测试这是 LLM 项目 CI 流水线里最常用的技巧。
参数化:数据驱动批量验证多组 Prompt
@pytest.mark.parametrize让一个测试函数跑多组输入输出,非常适合批量校验不同 Prompt 的响应:
@pytest.mark.parametrize("prompt, must_contain", [ ("天气如何", "天气"), ("写一段代码", "代码"), ]) def test_reply_contains(prompt, must_contain): reply = call_llm(prompt) assert must_contain in reply大模型项目测试必备命令行参数
| 命令 | 作用 | 典型用途 |
|---|---|---|
pytest -v | 显示详细输出 | 查看每个测试函数结果 |
pytest -s | 显示 print 输出 | 调试 fixture 与模型日志 |
pytest -m | 按 Mark 标记运行 | pytest -m "smoke" |
pytest -k | 按名称关键字筛选 | pytest -k "rag or prompt" |
pytest -n 4 | 多进程并行(需 pytest-xdist) | 加速大批量用例 |
完整参数表见 03-open-source/docs/pytest.md。
学习路径与延伸资源 📚
建议按以下顺序上手大模型项目自动化测试:
- 通读 Pytest 核心概念文档:03-open-source/docs/pytest.md
- 为自己的 LLM 项目写 3 个用例:输出格式断言、异常边界、参数化 Prompt
- 引入
smoke/slow标记,CI 中先跑冒烟测试 - 配套工程化实践,形成完整质量闭环:
- 依赖管理:03-open-source/docs/uv.md
- 代码规范检查:03-open-source/docs/ruff.md
- 提交前自动检查:03-open-source/docs/pre-commit.md
把"测试"当作大模型项目的一等公民,你会收获一个每次改动都敢点"提交"的项目。
【免费下载链接】cgft-llmcgft-llm 是一个学习大语言模型(LLM)开发的开源资源。它提供代码、文档和视频教程,帮助用户通过实践掌握前沿核心 LLM 技术项目地址: https://gitcode.com/echonoshy/cgft-llm
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考