看懂 CrewAI 单元测试的 3 个核心机制
【免费下载链接】crewAIFramework for orchestrating role-playing, autonomous AI agents. By fostering collaborative intelligence, CrewAI empowers agents to work together seamlessly, tackling complex tasks.项目地址: https://gitcode.com/GitHub_Trending/cr/crewAI
我第一版 CrewAI 单元测试,20 个用例跑了 20 分钟还烧掉 API 配额;而这份仓库的 275 个测试文件能离线跑完,0 次真实网络请求。它是怎么做到的?
先跑起来 🧪
两条命令足够。pytest、vcrpy 这些测试依赖不在某个 pip extra 里,而是放在根目录pyproject.toml的dev依赖组,所以要用 uv 在工作区层面安装:
# 工作区级安装,包含全部测试依赖 uv sync --all-groups # 运行一个纯离线的最小用例 cd lib/crewai && uv run pytest tests/test_task.py::test_task_tool_reflect_agent_tools -v运行后你会看到1 passed,几秒结束。没有配置任何 API key,全程没有网络请求——这个用例只验证"Task 的工具会继承 Agent 的工具",不需要真调模型。
CrewAI 单元测试的 3 个离线机制
lib/crewai/tests/ 下的 275 个测试文件,靠三层保障串起来,每层都对应仓库里一个具体目录或配置文件。
磁带:API 响应是放录的,不是现调的
cassettes/ 目录里的 591 个 yaml 是录制好的"API 响应磁带"。测试标上@pytest.mark.vcr(),vcrpy 就按请求匹配、回放对应 yaml 里的响应。录制时所有 api-key 之类敏感头会被替换成占位符防泄漏;CI 环境则强制record_mode=none——没有磁带直接失败,等于把整套测试焊死在离线状态。
# 加一行标注,本用例就从 cassettes/ 下对应 yaml 回放响应 @pytest.mark.vcr() def test_agent_calls_llm(...): ...autouse fixture:每个用例都是独立小环境
根目录 conftest.py 里有三个autousefixture,每个用例前后各跑一遍:setup_test_environment建临时目录写入CREWAI_STORAGE_DIR,互不污染存储;cleanup_event_handlers和reset_event_state清空事件总线订阅与计数,前一个用例的事件不会漏进后一个。密钥文件.env.test也在这里被自动加载。如果你写自己的 CrewAI 单元测试并订阅了事件,照这个模式来:fixture 里注册 handler,yield之后清掉。
并行切分:275 个文件也能在半小时内跑完
并行分两级。本地由根pyproject.toml的addopts提供-n auto --dist=loadfile --block-network:同一文件落到同一 worker,避免磁带争用;--block-network直接在 worker 层封掉 socket,没网是真没网。CI 再把套件用--splits 8切进 8 个作业、--maxfail=3快速止损,配置见 .github/workflows/tests.yml。
常见坑:为什么你的 CrewAI 单元测试还在打真 API ⚠️
- 现象:用例突然调了真实 API。原因:没录磁带,或
record_mode被改成new。修复:命令前加PYTEST_VCR_RECORD_MODE=none,需要录新磁带时再显式放开。 - 现象:
pip install -e lib/crewai后 pytest 报缺插件。原因:测试依赖在根pyproject.toml的dev组,不在 pip extra 里。修复:改用uv sync --all-groups,再用uv run pytest。 - 现象:新写的 vcr 用例本地过、CI 报 "cassette not found"。原因:CI 强制
record_mode=none,没磁带即失败。修复:本地先录一次,把 yaml 和用例一起提交。
下一步往哪走
两个方向。想读懂任务行为,从 lib/crewai/tests/task/ 入手,同级的 tests/test_task.py 是最容易模仿的写法:先 mock 掉Agent.execute_task,再断言调用参数,不碰模型。团队用例多了、需要可视化配置测试参数,可以看企业版的测试平台界面:
先打开 tests/task/ 通读一个测试文件,你下个项目就能复刻这套 0 网络的 CrewAI 单元测试。
【免费下载链接】crewAIFramework for orchestrating role-playing, autonomous AI agents. By fostering collaborative intelligence, CrewAI empowers agents to work together seamlessly, tackling complex tasks.项目地址: https://gitcode.com/GitHub_Trending/cr/crewAI
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考