python + request的基础复习20220816(持续更新。。。)
前后端分离的处理过程:
前端发送的请求内容---网络协议(媒介)---服务器端接收处理请求的地方(接口)---进行运算,产出结果,生成响应内容-----网络协议(介质)---返回响应(前端展示出来)
请求(request):用户下发
网络协议:传输渠道,目前业内最为核心的是HTTP协议
接口:接收从传输渠道传递过来的请求数据
响应:接口运算的结果,会在执行之后返回至前端
实际请求下发可以不需要经过前端界面,例如:
登录操作:
输入账号--提交表单--校验--返回登录成功或失败
开展接口测试的原因:
1、为了确保系统的安全
2、能够更早介入测试工作,从而降低缺陷的修复成本
3、尽可能多地发现系统中存在的问题
4、接口是目前企业需求量特别大的测试手段,也是测试人员加薪利器
如何实现接口测试:
模拟请求,直接下发至接口、获取返回响应、校验响应内容是否正确。
postman、Jmeter、LR、Requests都是用于模拟请求和接收响应的形式。
网络协议:HTTP是核心的协议
1、规范
url=网络协议://IP:port/path?args1=1&args2=2
2、基本信息:
http端口默认80
https端口默认443
之前有记录,https://www.cnblogs.com/ww-xiaowei/p/15851004.html
接口自动化------------------------------------------------------
动态参数处理:通过自带的函数,时间戳函数,随机数函数
1、基础知识
理解cookie,session,token授权原理及实战
理解http、webservice、Dubbo接口协议
2、API接口的概念和接口测试的概念
3、API接口测试计划,测试流程以及测试策略方案
4、API接口测试用例设计
5、API接口测试执行
6、API接口测试报告
一、既然有工具类实现接口自动化,为什么还要做自动化?
工具类的弊端(Jmeter+git+Jenkins):
团队协作(即使用git,也可能无法满足协作)
功能太死板(复杂的加密接口,签名接口等)
排错,定位接口问题不方便
市场需求:
1、接口数量大了以后,要团队协作编写时,版本管理方便。
2、可以复用的功能,可以抽象出来,再维护时仅修改公共方法,很方便
3、支持多种不同协议
4、多接口串联(参数传递)
5、数据库验证,日志监控。
6、web自动化+接口自动化 组合的需求
二、Python+requests模块
requests第三方库,主要用于发送http请求,做接口自动化。
pip install requests
三、requests全局观
发送请求rep=requests.request()
发送post\get\put\delete请求
【reponse对象】
rep.text 返回的字符串的数据
rep.content 返回字节格式的数据
rep.json 返回字典格式的数据
rep.status_code 返回状态码
rep.reason 返回状态信息
rep.cookies 返回cookie信息
rep.encoding 返回编码格式
rep.headers 返回响应header信息
响应状态码:用于表示本次请求的发送是否完成,完成状态是什么?
2**:表示成功
3**:表示重定向
4**:表示路径错误
5**:表示服务器端异常
四、接口实战
请求方式:get、post、delete、put
请求参数类型:键值对、json格式、文件格式
注意:get 请求通过param来传递参数
post 请求通过json 或 data 传参
rep=requests.get(url=host+path_preLogin,param=param,headers=headers)
rep=requests.post(url=host+path_preLogin,data=param,headers=headers)
rep=requests.post(url=host+path_preLogin,json=param,headers=headers)
json.dumps(data) 字典转换为string类型
json.loads(data) str转换为字典格式
data只能传简单的只有键值对的dict(只有1层无嵌套的) 或者是str格式
json 一般只能传dict 格式(简单 和 嵌套都可以)
线性脚本:No (面向过程)
用pytest 用例管理框架:
默认规则,编写格式要求:
1、py文件必须以 test_开头 或者_test结尾。
2、类名必须以Test开头
3、测试用例(方法名)必须以tet_开头
【4.1】pytest用例管理框架
安装pytest:pip install pytest
pytest搜集用例的默认规则:
1.py文件必须以test_开头 或者 _test结尾。
2.类名必须以Test开头
3.测试用例必须以test_ 开头
参照:https://www.bilibili.com/video/BV1B34y1Y7Rq?p=5&spm_id_from=pageDriver
【4.2】Python中 参数传递
【4.2.1】 定义类属性,(类变量)
import pytest import requests class TestSession: #类变量:通过类名访问 access_token ='' def test_session(self): #组装参数 host="https://open.sit.fuseinsurtech.com" path_preLogin='/insurance-finance-vs-api/api/fuse/user/login' param={ "udid":"55385F93-8A5E-4859-B690-F5CEB0F18619", "loginPassWord":"457948", "phoneType":"iPhone 6", "netType":"Wifi", "loginWay":0, "countryCode":"02130000000000", "deviceId":"55385F93-8A5E-4859-B690-F5CEB0F18619", "deviceType":"iOS", "loginCity":"四川省成都市", "systemVersion":"12.5.5", "osVision":"12.5.5", "loginCid":"510100", "vision":"3.16.27", "customPhone":"628123457948", "loginIp":"61.157.13.52", "phoneModel":"iPhone 6", "model":"iOS", "loginVerifyCode":"", "appVersion":"3.16.27" } headers={ "Connection":"keep-alive", "appVersion": "3.16.27", "appVersionNumber": "30160027", "content-type":"application/json", "clienttype":"ANDROID", "timezone":"UTC+8", "language":"en_US", "accept-encoding":"gzip", "charset":"utf-8", "fusetoken":"" } #post(url, data=None, json=None, **kwargs): rep=requests.post(url=host+path_preLogin,json=param,headers=headers) print(rep.status_code) print(rep.content) print(rep.json()) got_session = rep.json()['resultObj']['userTokken'] TestSession.access_token = rep.json()['resultObj']['userTokken'] if __name__ == '__main__': c = TestSession() c.test_session() # pytest.main()
cookie鉴权:网页的接口基本上都要cookie鉴权
rep = request.post(url,data=data,headers=headers,cookies=TestSendRequest.cks) #是TestSendRequest.cks 是类变量 或类属性
【To do】cookie鉴权的方式【?】 搞一下web后台登陆后,新增user的接口
【TO do】通过session实现cookie 鉴权,这种常用。【?】APP 登陆接口+APP下单接口
实际运用中:APP的接口间用的token鉴权,放在请求header中的~,用不到session、cookie鉴权
可以参照:https://blog.csdn.net/chairongdian/article/details/124478670
参照:(https://www.bilibili.com/video/BV1B34y1Y7Rq?p=5&spm_id_from=pageDriver&vd_source=8c511af054d2d9daf9ba0c04e53137c8)
【TO do】接口自动化框架封装的第一步,就是统一请求方式。
rep = requests.request("post",url=host+path_preLogin,json=param,headers=headers)
rep = requests.request("get",url=host+path_preLogin,param=param,headers=headers)
用例管理框架:Python脚本,对应的框架:unittest 或pytest java 语言,对应的框架:Junit 或 testng
4.3 【 多线程 运行】
https://www.bilibili.com/video/BV1B34y1Y7Rq?p=9&spm_id_from=pageDriver&vd_source=8c511af054d2d9daf9ba0c04e53137c8
由运行方式控制:
1、main 主函数运行(命令行的方式) pytest.main(['-vs','-n=2','--rerun=2','--html=./report/result.html'])
-v 输出更加详细的运行信息
-s 输入调试信息
-n 多线程运行
--reruns 数字 失效用例重跑
--html=报告的路径
2、实际工作中使用pytest.ini 的配置文件来配置运行。
4.4 【 Yaml 数据关联】
https://www.bilibili.com/video/BV1B34y1Y7Rq?p=14&vd_source=8c511af054d2d9daf9ba0c04e53137c8
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
2019-07-23 【转】局部变量和全局变量---------------【答不对,你还敢说你精通、熟悉python?】