3. 1个Tool!让Agent自动生成测试用例

上一节让 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自动生成测试用例》

posted @ 2026-08-06 07:05  老陈说编程  阅读(0)  评论(0)    收藏  举报