导读
接上篇,我们确立了基于LangGraph的状态机架构。本篇将深入代码细节,探讨该 Agent 的三大核心技术支柱:基于 Prompt 的代码生成、Docker 沙箱执行环境、以及最核心的Reflexion 自我修正机制。
一、智能代码生成:从规范到Pytest
代码生成是 Agent 的第一生产力。然而,直接让 LLM “写个测试”往往会得到无法运行的幻觉代码。我们采用了分层提示和结构化输出策略。
1、提示工程策略
我们为 LLM 设计了专门的 System Prompt,强调角色的专业性:“你是一名资深的 QA 自动化工程师,精通 Pytest 和 OpenAPI 标准。” 。
关键的 Prompt 技巧包括:
- 思维链(CoT):要求 LLM 在写代码前先解释测试逻辑。“首先,我需要调用登录接口获取 Token;然后,我将 Token 放入 Header 中调用目标接口...”
- 工具约束:明确限制使用的库。“仅使用 requests 和 pytest,不要使用 mock 库,我们需要真实的集成测试。”
- 错误处理模板:强制要求代码包含 try-except 块,以便更好地捕获运行时异常。
2、解决幻觉问题
OpenAPI 规范可能非常庞大,超出 LLM 的上下文窗口。为此,我们在生成阶段引入了RAG技术。Agent 不会一次性读取整个 Spec,而是根据当前要测试的端点,从向量数据库中检索相关的 Schema 定义。这大大提高了生成的准确性,减少了因上下文溢出导致的“遗忘”现象。
二、容器化沙箱:安全与隔离的执行环境
“在我的机器上能运行”是自动化测试的经典笑话。为了保证环境的一致性和安全性,Agent 绝不在宿主机上直接执行生成的代码,而是利用 Docker 容器。
1、架构实现
Agent 通过 Python 的 docker SDK 与 Docker 守护进程通信。
(1)镜像准备:预先构建一个包含 pytest, requests, allure-pytest 等依赖的基础镜像 test-runner:latest。
(2)代码注入:将 LLM 生成的代码字符串写入临时文件,并通过 volumes 挂载或 docker cp 命令注入容器。
(3)执行与捕获:使用 container.exec_run("pytest test_generated.py") 执行测试。关键在于设置 detach=False 从而同步等待结果,并捕获 ExitCode。
表 2:宿主机执行与 Docker 沙箱执行的风险对比
风险维度 | 宿主机直接执行 | Docker 沙箱执行 |
文件系统安全 | 极高风险。恶意代码可删除系统文件 (rm -rf /)。 | 安全。仅限于容器内部文件系统,且容器用完即毁。 |
网络安全 | 可访问内网所有资源,存在 SSRF 风险。 | 可通过 Docker Network 限制仅访问被测 API 容器。 |
环境依赖 | 依赖宿主机 Python 库,版本冲突频发(Dependency Hell)。 | 环境纯净,依赖版本通过 Dockerfile 严格锁定。 |
资源控制 | 恶意死循环可能耗尽宿主机 CPU/内存。 | 可通过--cpus和--memory参数限制容器资源 。 |
2、隔离策略
为了进一步提升安全性,我们采用了特权级限制,确保容器内的进程无法逃逸到宿主机内核。对于生成的代码,Agent 严格禁止网络访问除目标 API 以外的任何地址。
三、自我修正循环:Reflexion模式的应用
这是该 Agent 最具智能特性的部分。传统的测试脚本一旦报错,就需要人工介入。而基于 LangGraph 的 Agent 会将报错视为一次“学习机会”。
1、错误分类与决策
Agent 必须区分两类错误:
(1)测试代码错误:比如语法错误、导入丢失、变量名拼写错误。这类错误需要通过修改测试代码来修复。
(2)被测系统错误:测试代码运行正常,但断言失败(例如预期 200,实际返回 500)。这可能是一个真实的 Bug,也可能是测试期望有误。
2、修正工作流
当捕获到 Traceback 后,LangGraph 将状态流转至 Reflect 节点。该节点构建一个新的 Prompt:
"你生成的代码在执行时报错了。 错误信息:{traceback} 原始代码:{code} 请分析错误原因。如果是语法错误,请修正代码。如果是 API 返回值不符合预期,请检查是否是 Spec 理解错误,或者标记为潜在 Bug。"这种机制使得 Agent 能够自动修复诸如“忘记导入 datetime 库”或“JSON 字段名解析错误”等低级问题,从而大幅提高测试生成的成功率 。
下期预告:
系统跑通了,但它的实际效果如何?真的能降本增效吗? 请关注系列终章:《ROI 实录:引入 AI Agent 后,我们的接口测试维护成本降低了 70%》。
📡更多系列文章、开源项目、关键洞察、深度解读、技术干货
🌟请持续关注佳杰云星
💬欢迎在评论区留言或私信领取 Docker 沙箱实现源码片段~