学校网站建设分工,营销推广活动方案,网页设计图片居中,外贸销售渠道有哪些引言#xff1a;目前软件测试对测试人员的能力要求 业务测试能力#xff1a;占比5-6成接口、自动化、性能测试能力#xff1a;占比4-5成流程规范#xff1a;1成#xff08;需要综合型的测试人才#xff09;#xff1a;业务能力、代码能力、开发思维#xff08;封装目前软件测试对测试人员的能力要求 业务测试能力占比5-6成接口、自动化、性能测试能力占比4-5成流程规范1成需要综合型的测试人才业务能力、代码能力、开发思维封装 接口测试工具 postmanNewmanJenkins jmeterantJenkinsapifoxapifox-cliJenkins接口测试框架 pythonrequestspytestallureyamlloggingJenkins框架1、全面熟练Requests以及底层方法调用逻辑 1.1导入requests第三方库
import requests
python3中必须先安装requests模块使用命令为pip install requests1.2底层逻辑
第一层调用
def get(url, paramsNone, **kwargs)url接口地址params参数在get请求的url后面传的参数**kwargs可变长度的字典def post(url, dataNone, jsonNone, **kwargs)url接口地址data参数表单/表格参数对应postman的 x-www-form-urlencodejson参数rawapplication/jsonpostman的四种传参方式1.form-data既有表单也有文件上传 files2.x-www-form-urlencode纯表单格式data3.rawjsonapplication/json传json格式的参数json4.binaryapplication/octrent-stream(二进制文件) data**kwargs可变长度的字典def put(url, dataNone, **kwargs):url接口地址data参数**kwargs可变长度的字典
def delete(url, **kwargs):url接口地址**kwargs可变长度的字典
第二层调用上面的4个方法其实都是调用的request方法requests.request()
def request(method, url, **kwargs):
第三层调用requests.request()调用的是session.request方法
session.request(methodmethod, urlurl, **kwargs)
第四层调用最终调用的是request()
def request(self, method, 请求方式url, 请求路径paramsNone, params参数dataNone, data参数headersNone, 请求头cookiesNone, cookies信息filesNone, 文件上传authNone, 鉴权timeoutNone, 超时allow_redirectsTrue, 重定向proxiesNone, 设置代理hooksNone, 钩子streamNone, 文件下载verifyNone, 证书验证certNone, CA证书jsonNone): json参数 1.3requests.request() 和 session.request() 的区别 我们实际工作中一般都是用 session.request() 去进行接口测试 前者的每个请求都是独立的后者会自动去关联所有请求的cookie信息。class TestRequestApi():Authorizationsess requests.session()def test_login(self):url https://xxxx/wzlApp/usersLogin/loginheaders {App-Version:3.6.9}data {phone:RwP%2BH9D9DTgD1Qf0j7J%2B3A,password:kKe2zs5e7SF%2BuzDkBeFLLQ}# 通过session的方法调用res TestRequestApi.sess.request(post,urlurl,datadata,headersheaders)print(res.json())TestRequestApi.Authorization res.json()[data][token] 1.4Requests响应部分 res.text返回字符串形式的结果res.json()返回字典形式的结果res.content返回字节类型的结果res.status_code返回状态码res.reason返回状态信息res.cookies返回cookie信息res.encoding返回编码格式res.headers返回响应头res.request.xxx得到请求数据
2、requests接口自动化测试实战 2.1接口关联的三个层次 通过类变量保存中间变量实现接口关联 ----不建议用这个方式通过单独的文件保存中间变量实现接口关联极限封装成零代码的方式实现接口关联 2.2接口关联的两种方式
1. 正则提取 re.search() 通过正则匹配一个值用下标[1]取值如没有匹配到则返回None re.findall() 通过正则匹配多个值返回的是list用下标取值如没有匹配到则返回None 一般在text文本中用正则提取 第一个是正则token: (.*?) 第二个是字符串对象res.json() 通过下标[1]提取对应的值 token re.search(token: (.?),res.text).group(1)
print(这是正则提取出来的token) re 需要先导包再引入 2. JsonPath提取 jsonpath.jsonpath() 返回的是list用下标取值如没有匹配到则返回None $ 表示根目录 如就在根目录下则直接用.名称提取res.json(),$.data 到前面的res.json()对象中通过表达式$.data取值 如有嵌套的话res.json(),$.[data][token] 通过下标提取对应的值 print(data[0]) jsonpath需要先导包再引入 data jsonpath.jsonpath(res.json(),$.data[token]) # $ 表示根目录# 就在根目录下则直接用.名称提取res.json(),$.data# 到前面的res.json()对象中通过表达式$.data取值# 有嵌套的话res.json(),$.[data][token]# 通过下标提取对应的值print(data[0])import requests
import jsonpathclass TestRequestApi():Authorizationdef test_login(self):# self,代表当前类的对象# 方法通过对象调用 TestRequestApi().test_login()# method: posturl https://xxxx/wzlApp/usersLogin/loginheaders {App-Version:3.6.9}data {phone:RwP%2BH9D9DTgD1Qf0j7J%2B3A,password:kKe2zs5e7SF%2BuzDkBeFLLQ}res requests.post(urlurl,datadata,headersheaders)print(res.json())TestRequestApi.Authorization res.json()[data][token]# $ 表示根目录# 就在根目录下则直接用.名称提取res.json(),$.data# 到前面的res.json()对象中通过表达式$.data取值# 有嵌套的话res.json(),$.[data][token]data jsonpath.jsonpath(res.json(),$.data[token])print(-----登录-----哈哈哈哈哈哈哈哈)print(这是直接获取的token TestRequestApi.Authorization)print(data[0])def test_notice(self):url https://xxxx/wzlApp/users/insertUserFeedbackheaders {App-Version:3.6.9,Authorization: TestRequestApi.Authorization}data {feedback:通过接口自动化脚本提交的意见反馈数字符--xxxx---测试。。通过接口自动化脚本提交的意见反馈数字字符--xxxxx---测试。。}res requests.post(urlurl,datadata,headersheaders)print(-----意见反馈-----哈哈哈哈哈哈哈哈)print(res.json())def test_upload(self):url https://xxxx/commonApi/upload/uploadPrivateheaders {App-Version: 3.6.9,Authorization: TestRequestApi.Authorization}data {file:open(D:/Scripts/workspace/demo/results/image/logo.png,rb)}res requests.post(urlurl, filesdata, headersheaders)print(-----上传文件接口-----哈哈哈哈哈哈哈哈)print(res.json())
3、接口自动化测试框架的封装统一请求封装 1. 去重很多重复的、冗余的代码 2. 实现统一的异常处理以及日志监控 PS: 封装的一般放在common包中~~~ requests_util.py自定义 ---当该py文件被引用或者类被其他模块引用时意味着导入这个类的所有用例会导致用例的执行冗余 通过类变量保存中间变量实现接口关联 ----不建议用这个方式见上 2.1 解释所以变量一般不要定义为类变量如果该变量被其他模块导入并执行时也会执行该类的用例。 ---可能写的有点乱但希望意思能表达清晰。