上一节让 Agent 自己把需求文档读进来了。文档进了上下文,下一步就该根据需求整理测试用例,并落到文件里。create_deep_agent 的 tools 参数,就是用来扩展这类业务能力的------想让它整理用例并保存成 YAML,提供对应的 Tool 即可。
配套的动画视频在《3. 1个Tool!让Agent自动生成测试用例》。
自定义 Tool 可以按四块来搭。入参模型继承 BaseModel,用来声明并校验工具入参;工具类继承 BaseTool,声明 name、description 和 args_schema。description 要写清楚这个工具做什么、需要什么参数、结果统一存到哪里,Agent 会据此决定是否调用。执行逻辑放在 _run 里,在方法内完成 YAML 文档存储等导出操作。test_tools.py完整代码如下:
from typing import Type
from pathlib import Path
from pydantic import BaseModel, Field
from langchain_core.tools import BaseTool
import os, yaml
class GenerateTestCasesInput(BaseModel):
test_cases: list = Field(description="用例列表:case_id/case_name/description/steps")
output_path: str = Field(description="YAML输出路径")
class GenerateTestCasesTool(BaseTool):
name: str = "generate_test_cases"
description: str = "将测试用例列表保存为YAML。用例含case_id、case_name、description、steps;step含action与params"
args_schema: Type[BaseModel] = GenerateTestCasesInput
def _run(self, test_cases: list, output_path: str) -> str:
try:
base_dir = os.path.dirname(os.path.abspath(__file__))
if output_path.startswith("/"):
output_path = os.path.normpath(
os.path.join(base_dir, output_path.lstrip("/"))
)
elif not os.path.isabs(output_path):
output_path = os.path.normpath(
os.path.join(base_dir, output_path)
)
for i, case in enumerate(test_cases):
if "case_id" not in case or "steps" not in case:
return f"错误:第{i + 1}个用例缺少case_id或steps"
output_file = Path(output_path)
output_file.parent.mkdir(parents=True, exist_ok=True)
with open(output_file, 'w', encoding='utf-8') as f:
yaml.dump(
{'test_cases': test_cases},
f,
allow_unicode=True,
default_flow_style=False,
)
return f"成功保存{len(test_cases)}个用例至:{output_path}"
except Exception as e:
return f"保存失败:{str(e)}"
def get_all_tools() -> list:
return [GenerateTestCasesTool()]
工具写好后,在 create_deep_agent 里加上 tools=get_all_tools() 就行。接着给 Agent 一条提示词,让它调用 generate_test_cases 生成测试用例并保存------把要求写清楚即可:读哪些文档、用哪个工具、保存到哪。run_automation_test.py完整代码如下:
import os
from dotenv import load_dotenv
from deepagents import create_deep_agent
from deepagents.backends import LocalShellBackend
from test_tools import get_all_tools
load_dotenv()
os.environ["OPENAI_API_KEY"] = os.getenv("API_KEY")
os.environ["OPENAI_BASE_URL"] = os.getenv("BASE_URL")
model = f"openai:{os.getenv('MODEL')}"
def create_test_agent():
return create_deep_agent(
model=model,
system_prompt="HarmonyOS 自动化测试专家。",
tools=get_all_tools(),
backend=LocalShellBackend(root_dir=os.getcwd(), virtual_mode=True, inherit_env=True),
debug=True,
)
def main():
agent = create_test_agent()
result = agent.invoke(
{
"messages": [
{
"role": "user",
"content": (
"读取 docs/ 下的需求文档,用 generate_test_cases 工具生成测试用例,保存到 testcases/test_data.yaml。"
),
}
]
}
)
print(result["messages"][-1].content[0]["text"])
if __name__ == "__main__":
main()
跑完后,testcases/test_data.yaml 里就会留下 Agent 整理好的用例。到这一步,从读需求到生成测试用例的链路就打通了。
配套的动画视频在《3. 1个Tool!让Agent自动生成测试用例》。