接口自动化zy用例文件加署名用例层定义使用httprunnerAPI层实例化测试用例类1.旧方式每个接口写一个函数2.新方法声明式实体类3.API实体类的必要属性4.API实体的可选属性完整实体类示例API文件结构规范统一执行器Client实现使用实例命名规范接口自动化测试分析用例文档接口参数覆盖用例脚本编写规范一、API层编写规范二、公共API封装用例文件加署名用例添加署名1.注释-- coding: utf-8 --Time : ${DATE} ${TIME}Author : Antonio WangFileName: ${NAME}.py2.效果用例层定义使用httprunner同一个单接口的测试用例需要写在同一个文件例如正向负向不同参数化条件下的测试用例。一个类就是一个测试文件包含一个接口的全部用例继承HttpRunner自动化框架会自动识别Test开头的类为测试用例。字典形式类似于yaml文件但是yaml文件内字典结构固定HttpRunner封装的参数化装饰器parametrize装饰器本质上是一个函数参数化的过程就是给装饰器传参。装饰器有两个参数前一个为参数化后的对象后一个是需要参数化的数据列表/字典。params是参数名将来作为test-startselfparams的形参。Parameters{。数据列表。}是HttpRunner的参数化构造器。参数化数据字典的key是用例ID标识会出现在测试报告中。字典value是一个列表每个tuple是一组参数。test_start方法HttpRunner的入口方法框架用它执行用例。super().test_start(params)会自动把参数解包注入config的变量中。此法通用一般不需改只需继承父类。6.config配置块方法作用config“名称”设置用例名称出现在测试报告中.base_url(“ ”)基础URL所有step的亲切路径都拼在后面.variables(**{ “,” })全局变量所有step都能引用.verifyFalse跳过SSL证书测试环境通常关闭teststeps测试步骤每一步里需要做的事步骤均为step内部数据如step事一事二。。。 方法作用Step(RunRequest(“步骤名”))定义一个请求步骤先为步骤起名.setup_hook(“KaTeX parse error: Expected }, got EOF at end of input: …request_params(request)}”)在正式发送请求前调用的钩子函数$request 是请求对象可以在此修改请求.get(path请求路径)发送 GET 请求path 拼接到 base_url 后面.with_params(**Params)将之前的参数传入设置 query 参数params 是一个封装好的字典.validate()进入断言阶段往下所有语句均为断言设置.assert_equal(“body.err_code”, 0)断言响应 JSON 中的 err_code 字段等于 0.assert_equal(“body.err_msg”, “ok”)断言 err_msg 等于 “ok”API层实例化测试用例类1.旧方式每个接口写一个函数函数多分散难管理2.新方法声明式实体类一个接口一个类类中的属性就是请求参数/请求信息路径、参数。方法、请求体参数值使用占位符因为具体参数在后续实例化后才传入。核心思想:从“函数/用例”转向“实体类/声明式”1.将每个API接口定义为独立的实体类2.类的属性描述请求的全部元信息3.参数使用占位符$变量名代替具体值4.由统一的执行器负责参数填充和请求发送。3.API实体类的必要属性属性说明methodGET/POST/PUT/DELETE等path基础路径暂时不含参数参数一般在问号后面例如method“GETpath“/api/wallet/invoice/v2/audit/info/”4.API实体的可选属性普通参数属性说明paramspath问号后的参数payloadJSON的请求体POST/PUT请求headers请求头动态使用path_params动态请求参数增强参数属性说明desc接口描述用于生成文档stringmodule标注接口模块便于分类stringtimeout超时时间秒intretry重试次数int完整实体类示例GET请求带参数POST请求使用动态参数比如新建用户获得的userID增强参数API文件结构规范关键点1.api/ 文件夹不再是存放函数的地方而是纯实体类文件夹2.每个模块文件如 wallet.py包含该模块所有API实体类3.实体类不包含任何业务逻辑只有属性声明统一执行器Client实现classAPIClient:def__init__(self,base_url,default_headersNone):self.base_urlbase_url self.default_headersdefault_headersor{}defexecute(self,api_class,**kwargs): 执行API请求 :param api_class: API实体类 :param kwargs: 实际参数值如 page1, tokenxxx # 1. 解析并填充参数final_paramsself._resolve_placeholders(api_class.params,kwargs)final_payloadself._resolve_placeholders(api_class.payload,kwargs)final_headers{**self.default_headers,**api_class.headers}# 2. 处理路径参数urlself._build_url(api_class.path,kwargs)# 3. 发送请求ifapi_class.methodGET:resprequests.get(url,paramsfinal_params,headersfinal_headers,timeoutgetattr(api_class,timeout,30))elifapi_class.methodPOST:resprequests.post(url,jsonfinal_payload,headersfinal_headers,timeoutgetattr(api_class,timeout,30))# ... 其他方法# 4. 响应处理ifhasattr(api_class,response_model):returnapi_class.response_model(**resp.json())returnresp.json()def_resolve_placeholders(self,template,values):将占位符替换为实际值ifnottemplate:returnNoneresult{}forkey,placeholderintemplate.items():var_nameplaceholder.replace($,)result[key]values.get(var_name)returnresultdef_build_url(self,path,values):处理路径参数forkey,valueinvalues.items():pathpath.replace(f${key},str(value))pathpath.replace(f{{{key}}},str(value))returnself.base_urlpath使用实例# 初始化客户端clientAPIClient(base_urlhttps://api.example.com)# 调用GET接口responseclient.execute(GetWalletInvoiceV2AuditInfo,page1,rowsPerPage10,typeall,statuspending,tokeneyJhbGciOiJIUzI1NiIs...)# 调用POST接口responseclient.execute(PostWalletInvoiceCreate,amount100.50,typerecharge,remark充值测试,user_id12345,tokeneyJhbGciOiJIUzI1NiIs...)命名规范规则实例类名 请求方式 路径全拼接驼峰GetWalletInvoiceV2AuditInfo类名 请求方式 业务含义简短版PostInvoiceCreate类内使用占位符变量用$做前缀“$p a g e 、 page、page、user_id”(加$)接口自动化测试分析用例文档接口参数覆盖随机型在指定范围或指定长度内任意取值比如一个整数取值在0-65535、长度为10的字符串.枚举型依次取每一个值比如性别男、女、快递地址的省、市、区。边界值对取值范围内的最大、最小、最大1、最小-1取值。异常值null、类型最大值和最小值、空字符。默认值对某些非必选参数采用默认值。非法值类型不匹配、超出类型范围、超出操作系统限制、系统关键字用例脚本编写规范一、API层编写规范类命名请求方法api路径不允许存在重复的命名参数命名params和payload同一个接口有多个不同参数格式用_1、_2命名类描述、参数描述如下二、公共API封装封装脚本放到api_v2/一级目录/common/common.py下对于模块封装脚本过多可以在common下创建一个新的py文件封装API类命名规则请求方法接口的功能公共API只处理通用逻辑尽量不处理验证逻辑同一个接口只允许封装一次不允许重复封装
接口自动化(zy)
发布时间:2026/7/15 3:58:01
接口自动化zy用例文件加署名用例层定义使用httprunnerAPI层实例化测试用例类1.旧方式每个接口写一个函数2.新方法声明式实体类3.API实体类的必要属性4.API实体的可选属性完整实体类示例API文件结构规范统一执行器Client实现使用实例命名规范接口自动化测试分析用例文档接口参数覆盖用例脚本编写规范一、API层编写规范二、公共API封装用例文件加署名用例添加署名1.注释-- coding: utf-8 --Time : ${DATE} ${TIME}Author : Antonio WangFileName: ${NAME}.py2.效果用例层定义使用httprunner同一个单接口的测试用例需要写在同一个文件例如正向负向不同参数化条件下的测试用例。一个类就是一个测试文件包含一个接口的全部用例继承HttpRunner自动化框架会自动识别Test开头的类为测试用例。字典形式类似于yaml文件但是yaml文件内字典结构固定HttpRunner封装的参数化装饰器parametrize装饰器本质上是一个函数参数化的过程就是给装饰器传参。装饰器有两个参数前一个为参数化后的对象后一个是需要参数化的数据列表/字典。params是参数名将来作为test-startselfparams的形参。Parameters{。数据列表。}是HttpRunner的参数化构造器。参数化数据字典的key是用例ID标识会出现在测试报告中。字典value是一个列表每个tuple是一组参数。test_start方法HttpRunner的入口方法框架用它执行用例。super().test_start(params)会自动把参数解包注入config的变量中。此法通用一般不需改只需继承父类。6.config配置块方法作用config“名称”设置用例名称出现在测试报告中.base_url(“ ”)基础URL所有step的亲切路径都拼在后面.variables(**{ “,” })全局变量所有step都能引用.verifyFalse跳过SSL证书测试环境通常关闭teststeps测试步骤每一步里需要做的事步骤均为step内部数据如step事一事二。。。 方法作用Step(RunRequest(“步骤名”))定义一个请求步骤先为步骤起名.setup_hook(“KaTeX parse error: Expected }, got EOF at end of input: …request_params(request)}”)在正式发送请求前调用的钩子函数$request 是请求对象可以在此修改请求.get(path请求路径)发送 GET 请求path 拼接到 base_url 后面.with_params(**Params)将之前的参数传入设置 query 参数params 是一个封装好的字典.validate()进入断言阶段往下所有语句均为断言设置.assert_equal(“body.err_code”, 0)断言响应 JSON 中的 err_code 字段等于 0.assert_equal(“body.err_msg”, “ok”)断言 err_msg 等于 “ok”API层实例化测试用例类1.旧方式每个接口写一个函数函数多分散难管理2.新方法声明式实体类一个接口一个类类中的属性就是请求参数/请求信息路径、参数。方法、请求体参数值使用占位符因为具体参数在后续实例化后才传入。核心思想:从“函数/用例”转向“实体类/声明式”1.将每个API接口定义为独立的实体类2.类的属性描述请求的全部元信息3.参数使用占位符$变量名代替具体值4.由统一的执行器负责参数填充和请求发送。3.API实体类的必要属性属性说明methodGET/POST/PUT/DELETE等path基础路径暂时不含参数参数一般在问号后面例如method“GETpath“/api/wallet/invoice/v2/audit/info/”4.API实体的可选属性普通参数属性说明paramspath问号后的参数payloadJSON的请求体POST/PUT请求headers请求头动态使用path_params动态请求参数增强参数属性说明desc接口描述用于生成文档stringmodule标注接口模块便于分类stringtimeout超时时间秒intretry重试次数int完整实体类示例GET请求带参数POST请求使用动态参数比如新建用户获得的userID增强参数API文件结构规范关键点1.api/ 文件夹不再是存放函数的地方而是纯实体类文件夹2.每个模块文件如 wallet.py包含该模块所有API实体类3.实体类不包含任何业务逻辑只有属性声明统一执行器Client实现classAPIClient:def__init__(self,base_url,default_headersNone):self.base_urlbase_url self.default_headersdefault_headersor{}defexecute(self,api_class,**kwargs): 执行API请求 :param api_class: API实体类 :param kwargs: 实际参数值如 page1, tokenxxx # 1. 解析并填充参数final_paramsself._resolve_placeholders(api_class.params,kwargs)final_payloadself._resolve_placeholders(api_class.payload,kwargs)final_headers{**self.default_headers,**api_class.headers}# 2. 处理路径参数urlself._build_url(api_class.path,kwargs)# 3. 发送请求ifapi_class.methodGET:resprequests.get(url,paramsfinal_params,headersfinal_headers,timeoutgetattr(api_class,timeout,30))elifapi_class.methodPOST:resprequests.post(url,jsonfinal_payload,headersfinal_headers,timeoutgetattr(api_class,timeout,30))# ... 其他方法# 4. 响应处理ifhasattr(api_class,response_model):returnapi_class.response_model(**resp.json())returnresp.json()def_resolve_placeholders(self,template,values):将占位符替换为实际值ifnottemplate:returnNoneresult{}forkey,placeholderintemplate.items():var_nameplaceholder.replace($,)result[key]values.get(var_name)returnresultdef_build_url(self,path,values):处理路径参数forkey,valueinvalues.items():pathpath.replace(f${key},str(value))pathpath.replace(f{{{key}}},str(value))returnself.base_urlpath使用实例# 初始化客户端clientAPIClient(base_urlhttps://api.example.com)# 调用GET接口responseclient.execute(GetWalletInvoiceV2AuditInfo,page1,rowsPerPage10,typeall,statuspending,tokeneyJhbGciOiJIUzI1NiIs...)# 调用POST接口responseclient.execute(PostWalletInvoiceCreate,amount100.50,typerecharge,remark充值测试,user_id12345,tokeneyJhbGciOiJIUzI1NiIs...)命名规范规则实例类名 请求方式 路径全拼接驼峰GetWalletInvoiceV2AuditInfo类名 请求方式 业务含义简短版PostInvoiceCreate类内使用占位符变量用$做前缀“$p a g e 、 page、page、user_id”(加$)接口自动化测试分析用例文档接口参数覆盖随机型在指定范围或指定长度内任意取值比如一个整数取值在0-65535、长度为10的字符串.枚举型依次取每一个值比如性别男、女、快递地址的省、市、区。边界值对取值范围内的最大、最小、最大1、最小-1取值。异常值null、类型最大值和最小值、空字符。默认值对某些非必选参数采用默认值。非法值类型不匹配、超出类型范围、超出操作系统限制、系统关键字用例脚本编写规范一、API层编写规范类命名请求方法api路径不允许存在重复的命名参数命名params和payload同一个接口有多个不同参数格式用_1、_2命名类描述、参数描述如下二、公共API封装封装脚本放到api_v2/一级目录/common/common.py下对于模块封装脚本过多可以在common下创建一个新的py文件封装API类命名规则请求方法接口的功能公共API只处理通用逻辑尽量不处理验证逻辑同一个接口只允许封装一次不允许重复封装