“AI辅助+配置化驱动”的接口自动化测试

发布时间:2026/5/22 22:57:22

“AI辅助+配置化驱动”的接口自动化测试 “AI辅助配置化驱动”的接口自动化测试方案直击了传统自动化测试的核心痛点是一套非常实用且高效的落地思路。一、整体演练流程拆解附核心配置/代码1. 环境准备配置化核心目标将环境信息域名、端口、环境变量配置化管理做到环境切换零代码修改。实现方式使用YAML/JSON配置文件管理多环境信息配合简单的加载工具类。# 环境配置文件env_config.yamlenvironments:dev:# 开发环境base_url:http://dev-api.example.comport:8080timeout:10variables:# 环境专属变量token:dev-token-123456user_id:1001test:# 测试环境base_url:http://test-api.example.comport:8080timeout:10variables:token:test-token-789012user_id:2001prod:# 生产环境仅演示实际慎用base_url:http://prod-api.example.comport:80timeout:15variables:token:prod-token-345678user_id:3001# 环境加载工具类env_loader.pyimportyamlimportosclassEnvLoader:def__init__(self,config_pathenv_config.yaml):self.config_pathconfig_path self.load_config()defload_config(self):加载环境配置文件ifnotos.path.exists(self.config_path):raiseFileNotFoundError(f环境配置文件{self.config_path}不存在)withopen(self.config_path,r,encodingutf-8)asf:self.configyaml.safe_load(f)defget_env(self,env_nametest):获取指定环境的配置ifenv_namenotinself.config[environments]:raiseValueError(f环境{env_name}未配置请检查env_config.yaml)returnself.config[environments][env_name]# 用法示例切换环境仅需修改参数if__name____main__:env_loaderEnvLoader()test_envenv_loader.get_env(test)print(f测试环境基础URL{test_env[base_url]}:{test_env[port]})print(f测试环境token{test_env[variables][token]})2. 接口文档生成AI辅助核心目标无需手动写接口信息AI从原始文档如Swagger、Word生成标准化接口配置。核心思路收集原始接口信息如Swagger地址、接口描述文本调用AI如GPT、通义千问按预设模板生成标准化接口配置文件输出JSON/YAML格式的接口配置包含接口路径、请求方法、参数、响应断言等。# AI生成的标准化接口配置api_config.yamlapis:user_login:# 接口唯一标识path:/api/user/loginmethod:POSTheaders:Content-Type:application/jsonrequest_body:username:${variables.username}# 引用环境变量password:${variables.password}response_assert:# 响应断言配置status_code:200jsonpath:# JSON断言-$.code:0-$.msg:登录成功-$.data.token:not_null# 断言token非空user_info:path:/api/user/infomethod:GETheaders:Content-Type:application/jsonAuthorization:Bearer ${variables.token}# 引用登录返回的tokenparams:user_id:${variables.user_id}response_assert:status_code:200jsonpath:-$.code:0-$.data.nickname:not_null3. 测试用例导出配置化AI目标基于接口配置AI生成多场景测试用例正常场景、异常场景配置化管理。实现方式将用例与接口解耦用例仅管理入参和预期结果底层逻辑复用统一的请求/断言方法。# 测试用例配置test_cases.yamltest_suites:user_login_suite:# 测试套件name:用户登录接口测试cases:-case_id:login_001name:正常登录-正确账号密码api_key:user_login# 关联接口配置variables:# 用例专属变量覆盖环境变量username:test_userpassword:test_pass123expected:# 预期结果可复用接口配置的断言也可单独定义status_code:200code:0-case_id:login_002name:异常登录-密码错误api_key:user_loginvariables:username:test_userpassword:wrong_passexpected:status_code:200code:1001msg:密码错误4. 环境依赖配置解耦核心目标管理接口间依赖如登录接口返回的token供用户信息接口使用配置化实现参数传递。核心代码示例# 依赖管理工具dependency_manager.pyclassDependencyManager:def__init__(self):self.dependency_data{}# 存储依赖数据如token、user_iddefset_dependency(self,key,value):设置依赖数据self.dependency_data[key]valuedefget_dependency(self,key):获取依赖数据returnself.dependency_data.get(key,None)defreplace_variables(self,data):递归替换数据中的变量如${variables.token}ifisinstance(data,str):forkey,valueinself.dependency_data.items():iff${{variables.{key}}}indata:datadata.replace(f${{variables.{key}}},str(value))returndataelifisinstance(data,dict):return{k:self.replace_variables(v)fork,vindata.items()}elifisinstance(data,list):return[self.replace_variables(item)foritemindata]else:returndata# 用法示例登录后存储token供后续接口使用if__name____main__:dmDependencyManager()# 模拟登录接口返回的tokenlogin_response{data:{token:abc123456}}dm.set_dependency(token,login_response[data][token])# 替换用户信息接口的headers中的token变量user_info_headers{Authorization:Bearer ${variables.token}}replaced_headersdm.replace_variables(user_info_headers)print(replaced_headers)# 输出{Authorization: Bearer abc123456}5. 自动化执行核心执行引擎目标读取所有配置文件统一执行测试用例无需修改底层代码。# 自动化执行引擎test_runner.pyimportrequestsfromenv_loaderimportEnvLoaderfromdependency_managerimportDependencyManagerimportyamlclassTestRunner:def__init__(self,env_nametest):self.env_loaderEnvLoader()self.envself.env_loader.get_env(env_name)self.dmDependencyManager()# 加载接口配置和用例配置self.api_configself.load_yaml(api_config.yaml)self.test_casesself.load_yaml(test_cases.yaml)defload_yaml(self,file_path):加载YAML配置文件withopen(file_path,r,encodingutf-8)asf:returnyaml.safe_load(f)defsend_request(self,api_key,case_variables):发送请求统一封装无需重复编码# 1. 获取接口配置apiself.api_config[apis][api_key]# 2. 合并环境变量和用例变量all_variables{**self.env[variables],**case_variables}self.dm.dependency_dataall_variables# 3. 替换变量urlf{self.env[base_url]}:{self.env[port]}{api[path]}headersself.dm.replace_variables(api[headers])# 4. 构造请求参数ifapi[method]GET:paramsself.dm.replace_variables(api.get(params,{}))responserequests.get(url,headersheaders,paramsparams,timeoutself.env[timeout])elifapi[method]POST:json_dataself.dm.replace_variables(api.get(request_body,{}))responserequests.post(url,headersheaders,jsonjson_data,timeoutself.env[timeout])else:raiseValueError(f不支持的请求方法{api[method]})returnresponsedefassert_response(self,response,expected):执行断言配置化断言assertresponse.status_codeexpected[status_code],\f状态码断言失败预期{expected[status_code]}实际{response.status_code}# JSON断言ifresponse.headers.get(Content-Type,).startswith(application/json):resp_jsonresponse.json()forjsonpath,expected_valueinexpected.get(jsonpath,{}).items():# 简化版JSONPath解析实际可使用jsonpath-ng库actual_valueself.get_json_value(resp_json,jsonpath)ifexpected_valuenot_null:assertactual_valueisnotNone,f{jsonpath}断言失败预期非空实际为空else:assertactual_valueexpected_value,\f{jsonpath}断言失败预期{expected_value}实际{actual_value}print(断言通过✅)defget_json_value(self,data,jsonpath):简化版JSONPath取值实际推荐使用jsonpath-ngkeysjsonpath.lstrip($.).split(.)valuedataforkeyinkeys:valuevalue.get(key)ifvalueisNone:breakreturnvaluedefrun_test_suite(self,suite_name):执行指定测试套件suiteself.test_cases[test_suites][suite_name]print(f开始执行测试套件{suite[name]})forcaseinsuite[cases]:print(f\n执行用例{case[case_id]}-{case[name]})try:# 发送请求responseself.send_request(case[api_key],case[variables])# 执行断言self.assert_response(response,case[expected])# 存储依赖如登录返回的tokenifcase[api_key]user_login:tokenself.get_json_value(response.json(),$.data.token)self.dm.set_dependency(token,token)print(f用例{case[case_id]}执行成功✅)exceptExceptionase:print(f用例{case[case_id]}执行失败❌{str(e)})# 执行测试if__name____main__:runnerTestRunner(env_nametest)runner.run_test_suite(user_login_suite)6. 测试报告分析配置化输出目标执行完成后自动生成标准化报告无需手动整理。实现方式集成pytest-html或自定义报告生成逻辑读取执行结果配置输出HTML/JSON报告。# 简化版报告生成report_generator.pyimportdatetimeimportjsonclassReportGenerator:def__init__(self,report_pathtest_report):self.report_pathreport_path self.results[]defadd_case_result(self,case_id,case_name,status,error_msg):添加用例执行结果self.results.append({case_id:case_id,case_name:case_name,status:status,# pass/failerror_msg:error_msg,execute_time:datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S)})defgenerate_html_report(self):生成HTML报告简化版totallen(self.results)pass_numlen([rforrinself.resultsifr[status]pass])fail_numtotal-pass_num pass_rate(pass_num/total)*100iftotal0else0htmlf html headtitle接口自动化测试报告/title/head body h1测试报告{datetime.datetime.now().strftime(%Y-%m-%d %H:%M:%S)}/h1 p总用例数{total}| 通过{pass_num}| 失败{fail_num}| 通过率{pass_rate:.2f}%/p table border1 trth用例ID/thth用例名称/thth状态/thth执行时间/thth错误信息/th/tr forresinself.results:htmlf tr td{res[case_id]}/td td{res[name]}/td td stylecolor:{greenifres[status]passelsered}{res[status]}/td td{res[execute_time]}/td td{res[error_msg]}/td /tr html /table /body /html # 保存报告withopen(f{self.report_path}/test_report.html,w,encodingutf-8)asf:f.write(html)print(f报告已生成{self.report_path}/test_report.html)# 用法在TestRunner中集成报告生成# runner TestRunner()# report ReportGenerator()# report.add_case_result(login_001, 正常登录, pass)# report.generate_html_report()二、核心依赖与环境准备安装必要依赖pipinstallrequests pyyaml jsonpath-ng pytest pytest-html目录结构建议配置化管理核心api_auto_test/ ├── config/ # 所有配置文件核心 │ ├── env_config.yaml # 环境配置 │ ├── api_config.yaml # 接口配置 │ └── test_cases.yaml # 用例配置 ├── core/ # 核心工具类无需频繁修改 │ ├── env_loader.py # 环境加载 │ ├── dependency_manager.py # 依赖管理 │ ├── test_runner.py # 执行引擎 │ └── report_generator.py # 报告生成 ├── test_report/ # 测试报告输出 └── run.py # 统一执行入口总结配置化核心将环境、接口、用例、依赖全部抽离为YAML/JSON配置文件修改数据无需改动底层执行代码实现“易维护易迭代”AI辅助核心用AI替代手动编写接口配置、测试用例大幅降低上手门槛减少重复编码流程闭环从环境准备→配置生成→自动化执行→报告输出全链路标准化解决传统测试“流程不统一、维护成本高”的痛点。这套方案落地后新手只需维护配置文件无需关心底层的请求封装、断言逻辑真正实现“低代码/零代码”的接口自动化测试。

相关新闻