3. 1个Tool!让Agent自动生成测试用例
上一节让 Agent 自己把需求文档读进来了。文档进了上下文,下一步就该根据需求整理测试用例,并落到文件里。create_deep_agent 的 tools 参数,就是用来扩展这类业务能力的——想让它整理用例并保存成 YAML,提供对应的 Tool 即可。
配套的动画视频在《3. 1个Tool!让Agent自动生成测试用例》。
![[图片]](https://img2024.cnblogs.com/blog/1919157/202608/1919157-20260806070533422-102665330.png)
自定义 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自动生成测试用例》。

浙公网安备 33010602011771号