
概述在上一篇中我们看到了AI生成Pytest用例的效果对于一个简单的计算函数Agent在10秒钟内生成了5个测试用例并且覆盖了正常、异常、边界的场景这些如果人工手写的话则要10多分钟如果你以为AI Agent只是帮你写代码的智能版Copilotno no noAI Agent对自动化测试的改变不在“写”这个动作上而在“维护”这个死结上。本篇中我们来了解一个完整的“Pytest AI Agent”测试系统到底长什么样数据是怎么流的以及你自己怎么搭一个最简易的版本出来AI Agent要解决的问题传统的脚本驱动有三个死结1. 脚本和代码强绑定接口字段变了脚本挂。页面元素ID变了脚本挂。第三方服务地址换了脚本挂。你写的每一行断言都是对未来的一次赌博赌这些东西不会变。2. 维护成本随规模指数增长100个用例的时候改一轮还扛得住。1000个用例的时候改一轮需要一周。10000个用例的时候……你根本不敢随便改。3. 人肉翻译的效率天花板需求文档是中文测试步骤是中文但你要把它们翻译成Python代码、翻译成断言。这个翻译过程没有任何复用价值下个需求来了重新翻一遍。AI Agent要解决的就是这三个死结一个完整的AI Agent测试系统长什么样**下图是整体结构┌─────────────────────────────────────┐ │ 1. 意图理解模块 │ │ (需求描述/代码变更 → 测试策略) │ └─────────────────┬───────────────────┘ ↓ ┌─────────────────────────────────────┐ │ 2. 用例生成模块 │ │ (测试策略 → Pytest代码) │ └─────────────────┬───────────────────┘ ↓ ┌─────────────────────────────────────┐ │ 3. 执行与收集模块 │ │ (运行pytest → 收集结果) │ └─────────────────┬───────────────────┘ ↓ ┌─────────────────────────────────────┐ │ 4. 分析与修复模块 │ │ (失败分析 → 自动修复 → 重跑) │ └─────────────────────────────────────┘2.1 意图理解模块把“人话”翻译成“测试策略”传统模式下你拿到需求文档自己理解其中的逻辑还要整理测试点设计用例场景等意图理解模块做的是同一件事只不过它用LLM来做输入是一段自然语言描述比如“用户使用正确的用户名和密码登录后应该能看到个人主页主页上显示用户的昵称和头像。”输出是一个结构化的测试策略{test_scenarios:[{name:正常登录,steps:[访问登录页,输入用户名,输入密码,点击登录],expected:跳转到个人主页显示昵称和头像},{name:密码错误,steps:[访问登录页,输入用户名,输入错误密码,点击登录],expected:提示用户名或密码错误停留在登录页}]}这个模块的价值把“人工理解需求”变成了“AI辅助理解需求”也就是说我们只需要用自然语言对AI描述我们要测什么就行2.2 用例生成模块把“测试策略”翻译成“Pytest代码”这个模块上一篇已经演示过了——输入源代码输出Pytest测试代码。但在完整系统中它不只是看源代码。它还会看你项目里的conftest.py有哪些现成的fixture可以用你项目里的测试规范命名规范、断言风格相关的API文档或Swagger定义对于AI来说上下文越丰富生成的代码质量就越高。2.3 执行与收集模块跑测试收结果这个模块很简单就是调用pytest.main()然后把运行结果收集起来。但注意一个关键点执行和断言是确定性的。AI生成用例Pytest把关验证用例的正确性assert的结果、pytest.raises捕获的异常、以及测试执行的结果是确定的2.4 分析与修复模块解决了写测试用例的问题接下来该解决改测试用例的事情了当Pytest运行用例失败这个模块会做三件事分析失败原因是断言错了是元素定位变了是接口返回格式变了提出修复方案根据失败原因生成对应的代码修改自动修复并重跑应用修改重新执行Pytest验证是否通过这就是自愈测试Self-healing TestGitHub上已经出现了ai-testing-lab这样的实验仓库专门探索AI辅助测试和自愈测试。checkagent是一个pytest插件专门用于测试AI Agent工作流了解这些后你是否觉得AI对于测试来说也很近了呢确定性 vs 非确定性很多人对AI Agent测试最大的疑虑是AI生成的东西是随机的可信度或者说准确度是否可靠”这里需要区分两个概念AI生成是概率性的 同样的输入GPT今天生成的代码和明天生成的可能不一样输出比较随机。用例执行的结果是确定性的 同样的测试代码今天跑和明天跑结果应该一样除非测试对象代码变了。所以正确的做法是AI处理不确定性的部分也就是用例的生成、逻辑的理解、测试失败后的修复确定性的部分比如执行、断言、验证则交给Pytest这样既提升了效率又保证了质量。30行代码看清Agent测试系统的结构直接上代码下面这个脚本模拟了一个最简单的AI Agent测试框架。说明这里还没有接入真正的LLM先展示整个框架的结构组成# minimal_agent_runner.pyimportjsonimportpytestfrompathlibimportPathfromtypingimportDict,ListclassMinimalTestAgent: 一个极简的测试Agent模拟器。 不调用LLM但展示了完整的输入→生成→执行→输出闭环。 def__init__(self,workspace:str./agent_workspace):self.workspacePath(workspace)self.workspace.mkdir(exist_okTrue)defload_scenario(self,scenario_file:str)-Dict:加载测试场景描述模拟意图理解withopen(scenario_file,r)asf:returnjson.load(f)defgenerate_test_code(self,scenario:Dict)-str: 根据场景生成Pytest代码模拟用例生成。 真实场景中这里会调用LLM现在我们用模板硬编码。 func_namescenario[function]test_casesscenario[test_cases]lines[import pytest,ffrom{scenario.get(module,calculator)}import{func_name},,,fclass Test{func_name.capitalize()}:,f 测试{func_name}函数,]forcaseintest_cases:lines.append(f def test_{case[name]}(self):)ifraisesincase:lines.append(f with pytest.raises({case[raises]}):)lines.append(f{func_name}({case[input]}))else:lines.append(f assert{func_name}({case[input]}) {case[expected]})lines.append()return\n.join(lines)defrun_tests(self)-Dict:执行Pytest并收集结果模拟执行与收集resultpytest.main([str(self.workspace/test_generated.py),-v,--tbshort])return{exit_code:result,passed:result0}defrun(self,scenario_file:str)-Dict:完整的执行闭环print(Step 1: 加载测试场景...)scenarioself.load_scenario(scenario_file)print(Step 2: 生成Pytest测试代码...)test_codeself.generate_test_code(scenario)test_fileself.workspace/test_generated.pytest_file.write_text(test_code)print(f已生成:{test_file})print(Step 3: 执行Pytest...)resultself.run_tests()print(Step 4: 测试结果)print(f{✅ 全部通过ifresult[passed]else❌ 存在失败})returnresultif__name____main__:# 准备一个测试场景描述模拟意图scenario{module:calculator,function:divide,test_cases:[{name:normal_division,input:10, 2,expected:5.0},{name:negative_division,input:-10, 2,expected:-5.0},{name:divide_by_zero,input:10, 0,expected:None,raises:ValueError},{name:zero_divided,input:0, 5,expected:0.0},]}# 保存场景文件withopen(scenario.json,w)asf:json.dump(scenario,f,indent2)# 运行AgentagentMinimalTestAgent()agent.run(scenario.json)运行一下python minimal_agent_runner.py输出Step 1: 加载测试场景... Step 2: 生成Pytest测试代码... 已生成: ./agent_workspace/test_generated.py Step 3: 执行Pytest... test session starts collected 4 items test_generated.py::TestDivide::test_normal_division PASSED test_generated.py::TestDivide::test_negative_division PASSED test_generated.py::TestDivide::test_divide_by_zero PASSED test_generated.py::TestDivide::test_zero_divided PASSED 4 passed in 0.02s Step 4: 测试结果 ✅ 全部通过这30行代码做了下面4个事情加载场景模拟意图理解 输入是JSON格式的“我要测什么”生成代码模拟用例生成输出是Pytest测试用例文件执行Pytest模拟执行收集 运行生成的用例收集测试结果输出结果模拟分析反馈查看测试结果是通过还是失败五、总结在日常的测试工作中我们要把AI Agent当作提效的工具来用如下表总结模块做什么谁来做意图理解需求→测试策略LLM用例生成测试策略→Pytest代码LLM执行收集跑pytest收结果Pytest分析修复失败→分析→修复→重跑LLM Pytest读完这篇文章后Agent测试的骨架就有了但里面的AI能力还是空的后续我们把真正的LLM接进来从“模拟Agent”变成“真正的AI Agent测试系统”