試:從第一個(gè)可運(yùn)行用例到失敗排查)
CrewAI 單元測(cè)試從第一個(gè)可運(yùn)行用例到失敗排查【免費(fèi)下載鏈接】crewAIFramework for orchestrating role-playing, autonomous AI agents. By fostering collaborative intelligence, CrewAI empowers agents to work together seamlessly, tackling complex tasks.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/cr/crewAICrewAI 讓多個(gè)智能體分工協(xié)作任何一處判斷偏差都可能被整條任務(wù)鏈放大。本文帶你走通一次完整的 CrewAI 單元測(cè)試閉環(huán)確認(rèn)環(huán)境、寫(xiě)出不依賴模型的首個(gè)用例、隔離外部調(diào)用、定位失敗原因。先確認(rèn)測(cè)試環(huán)境能跑起來(lái)安裝依賴并做基線驗(yàn)證倉(cāng)庫(kù)根目錄有uv.lock說(shuō)明依賴由 uv 管理??寺}(cāng)庫(kù)git clone https://gitcode.com/GitHub_Trending/cr/crewAI后執(zhí)行uv sync安裝環(huán)境。別急著看源碼先挑一個(gè)輕量用例當(dāng)基線運(yùn)行uv run pytest lib/crewai/tests/test_imports.py -q能收集到用例且不報(bào)導(dǎo)入錯(cuò)誤環(huán)境就算就緒??炊夸?conftest.py 的隔離機(jī)制根目錄的 conftest.py 注冊(cè)了幾個(gè) autouse 夾具每個(gè)用例都獲得獨(dú)立的臨時(shí)存儲(chǔ)目錄寫(xiě)入CREWAI_STORAGE_DIR環(huán)境變量、清空事件總線狀態(tài)、按順序加載.env.test與本地.env。這意味著用例之間互相不污染你的測(cè)試結(jié)果不會(huì)因?yàn)閳?zhí)行順序而改變多智能體測(cè)試?yán)锱棘F(xiàn)失敗的一大來(lái)源就被切掉了。寫(xiě)第一個(gè)不依賴模型的用例挑一個(gè)確定性的斷言點(diǎn)多智能體測(cè)試容易一上來(lái)就盯著模型輸出但首個(gè)用例應(yīng)選純邏輯點(diǎn)。lib/crewai/tests/test_task.py 里的 guardrail任務(wù)輸出校驗(yàn)器接收結(jié)果并返回是否通過(guò)加修正值二元組參數(shù)檢查就是好例子簽名校驗(yàn)是確定性的輸入錯(cuò)、輸出必錯(cuò)最適合當(dāng)?shù)谝粋€(gè)測(cè)試。import pytest from crewai import Task from pydantic import ValidationError def test_bad_guardrail_rejected(): with pytest.raises(ValidationError): Task(description列出5個(gè)選題, expected_output要點(diǎn)列表, guardraillambda x, y: (True, x))運(yùn)行并解讀結(jié)果用-k按名字過(guò)濾、-x在首個(gè)失敗處停住。這條用例通過(guò)說(shuō)明你已跑完一次最小閉環(huán)構(gòu)造輸入、斷言異常類型、解讀輸出。下一步才考慮需要模型參與的用例。用 cassette 隔離外部模型調(diào)用為什么不能直接打真實(shí)接口LLM 響應(yīng)不穩(wěn)定、消耗費(fèi)用直接調(diào)用會(huì)讓測(cè)試忽過(guò)忽掛。倉(cāng)庫(kù)的做法是 vcr 錄制真實(shí) HTTP 請(qǐng)求的響應(yīng)被存成 cassette 文件統(tǒng)一放在 lib/crewai/tests/cassettes/目錄結(jié)構(gòu)鏡像測(cè)試文件位置。標(biāo)了pytest.mark.vcr()的用例運(yùn)行時(shí)直接回放錄好的響應(yīng)不發(fā)任何真實(shí)請(qǐng)求?;胤乓?guī)則與 CI 差異conftest.py里 record_mode 默認(rèn)是oncecassette 不存在就錄制一次存在就回放而在 CI 環(huán)境檢測(cè)到GITHUB_ACTIONS會(huì)被強(qiáng)制成none只允許回放。所以本地跑這批 CrewAI mock 測(cè)試不需要真實(shí) API key本地能過(guò)CI 也能過(guò)行為一致。測(cè)試失敗時(shí)如何定位原因先分清環(huán)境問(wèn)題和邏輯問(wèn)題遇到失敗先按三類排查環(huán)境變量缺失看根目錄是否存在.env.test、cassette 缺失新用例第一次運(yùn)行且本地?zé)o錄制權(quán)限、狀態(tài)污染通常被 conftest 的自動(dòng)夾具擋住出現(xiàn)時(shí)檢查是否新加了事件監(jiān)聽(tīng)。配合-x加上短用例名可以快速二分到具體那條。借助追蹤日志看中間步驟CrewAI 自帶 tracing追蹤機(jī)制會(huì)記錄每一步的輸入、輸出與耗時(shí)。當(dāng)一個(gè)多智能體任務(wù)在中間某步失敗時(shí)與其反復(fù)打印變量不如讀追蹤記錄確認(rèn)是哪個(gè)智能體、哪一次調(diào)用偏離了預(yù)期。這套思路同樣適用于線上系統(tǒng)出問(wèn)題時(shí)做 CrewAI 調(diào)試。把 CrewAI pytest 測(cè)試接入日常流程只跑改動(dòng)相關(guān)的部分全量套件較慢日常改完代碼先跑受影響的目錄# 只跑任務(wù)相關(guān)用例失敗即停 uv run pytest lib/crewai/tests/test_task.py -k guardrail -x涉及異步任務(wù)改動(dòng)時(shí)再補(bǔ)跑 lib/crewai/tests/task/ 下的對(duì)應(yīng)文件。對(duì)齊 CI 的行為.github/workflows/tests.yml 定義了上游的測(cè)試流程PR 觸發(fā)、Python 3.10 到 3.13 四個(gè)版本乘以 8 個(gè)分組的矩陣、cassette 在 CI 上只回放。你本地跑通的標(biāo)準(zhǔn)應(yīng)當(dāng)與它一致不依賴錄制權(quán)限、不依賴特定 Python 版本的小技巧。提交前的自檢清單用例能在干凈環(huán)境獨(dú)立運(yùn)行不依賴其他用例的執(zhí)行順序涉及模型調(diào)用的用例走 cassette 回放不需要真實(shí) API key失敗時(shí)你能說(shuō)清楚是環(huán)境問(wèn)題還是斷言本身失敗只跑過(guò)與改動(dòng)相關(guān)的測(cè)試文件且知道如何擴(kuò)展到對(duì)應(yīng)目錄這條新的 CrewAI 單元測(cè)試覆蓋了本次改動(dòng)的核心邏輯而不是只驗(yàn)證沒(méi)報(bào)錯(cuò)【免費(fèi)下載鏈接】crewAIFramework for orchestrating role-playing, autonomous AI agents. By fostering collaborative intelligence, CrewAI empowers agents to work together seamlessly, tackling complex tasks.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/cr/crewAI創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考