Python-自动化测试之接口基础
1、API接口
接口定义规则,可以在接口文档中查看:访问地址、请求方法、请求参数。
什么是接口测试?
测试接口返回数据是否和预期一致。可以使用浏览器、postman、jmeter、soupUI等接口测试工具,也可以通过代码访问接口。
2、http协议
C/S client/server,B/S browser/server
P2P,peer to peer
3、http请求
URL
http://www.example.com:80/path/to/myfile.html?key1=value1&key2=value2#SomewhereInTheDocument
http:协议; www.example.com:域名/IP; 80:端口; path/to/myfile.html:路径; key1=value1&key2=value2:查询参数; SomewhereInTheDocument:锚点
请求方法
- get 请求指定的资源,使用get的请求应该只用于获取数据。
- post 发生数据给服务器,创建或者更新资源,例如注册
- put 创建或者替换目标资源,例如修改用户名
- delete 删除资源
- options
- head
get和post的区别
get获取资源,post创建资源;get无请求主体,post有请求主体;get可以缓存,post一般不缓存;get可存放历史记录和书签,post不可以存放。
get请求传递参数的方式:1、URL。通过?name=...&pwd=...的方式。2、请求头
post请求传递参数的方式:1、URL 2、请求头 3、请求体
body参数传递的主要数据格式:
- json--> content-type:application/json
- form-->content-type:multipart/form-data
4、http响应
响应状态码:
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步操作已完成请求(重定向:访问地址1出错,自动跳转地址2)
4** 客户端错误,请求包含语法错误或者无法完成请求
5** 服务器错误,服务器在处理请求时发生错误
响应头
set-cookie
服务端返回客户端cookie信息,客户端会将返回的信息直接保存在本地,下次再访问时,会自动把cookie信息传给服务器
无状态
http协议是一种无状态的协议,服务器没有记忆能力,无法记住客户端有没有发送过请求,因此客户端发送的请求都是独立的。
这会造成一个问题,当客户端必须登录才能操作,每次请求都需要重复发送用户名和密码给服务器进行校验,频繁发送敏感信息会造成很大的安全问题。还有数据重复。
session
当用户登录时,发送用户名和密码后服务器会给客户端生成sessionid,表明这是属于哪个用户,然后在sessionid中存储该用户数据,比如这个用户的登录时间,添加的购物车信息。
服务器通过cookie的形式将sessionid返回给客户端,每次客户端请求该服务器时,会自动带上sessionid的cookie,服务器收到请求后查询有没有存储这个sessionid信息。
session是在服务器中保存的用户访问数据,sessionid是将session加密成简短的数据
例:session = 'hfshkfhsgfhdskghkfhgkdfhgkjd'
session_id = get_id(session) ='123'
cookie和session的区别
cookie是在服务端存储用户的数据,session是在客户端存储用户的数据。
session的缺点
1、占用服务器资源大
2、每次都要查询,响应速度慢
3、session通常会和cookie搭配,cookie无法跨域(跨服务器)
问题1,通过缓存数据库redis解决内存占用大的问题。可是这样会将压力从服务器转到数据库,当数据大时,数据库可能会崩掉。解决方式是配置redis集群,当单点数据库挂掉时,可以使用其他数据库中的数据。集群要做好同步,保证每个节点数据的一致性,也要做好负载均衡,尽量不要让节点因为负载挂掉。集群可以解决以上三个问题。
token
token将数据直接存在客户端。服务器并不存储用户数据,而是直接通过编码或者加密方式把用户数据作为令牌直接返回给客户端,传递方式由服务器自己设置。每次客户端都会携带这个令牌,证明自己的身份,从而得到自己的状态和数据。
这样服务器可以节省大量的存储数据,也不需要每次查询,加快了响应速度。而且传递方式也由双方协定,不管是不是跨域,都可以正常传递。
签名
token有个问题,就是很容易被伪造,任何人都可以宣称自己是某个用户,从而获取该用户是私密信息。签名可以解决这个问题。
当用户登录时,服务器提取用户名或者id组装成payload,代表用户数据,然后用herder拼接payload组装成新的数据,通过HS256这一类加密算法得到签名。然后再拼接header,payload和sign,得到token。
sign保证了token是由服务器签发的,因为只有服务器知道签名的秘钥。接下来和之前一样,每次访问新的接口,只需要带上这个token就可以了。
服务器获取header和payload,使用服务器秘钥得到新的签名,和服务器传过来的sign对比,如果一致,表示这个是合法的token,如果不一致,就是伪造的。
token VS session
session存储在服务器,占用服务器的存储资源。需要频繁查询,从而拖慢请求的处理速度。跨域困难。
token存储在客户端,客户存在客户端的cookie、indexdb、local、storage中,不需要消耗服务器的存储资源。速度很快,跨域方便。
token的缺点:不能立即注销,不能立即让token失效。
cookie只是实现token和session的一种手段。cookie只是http请求头的字段。
接口
和某个函数绑定关系,当访问一个URL时,会调用函数,函数的返回值会返回到前端。
requests
requests和jmeter、postman都是http的客户端,都可以用来访问接口。
简单用法:
安装 pip install requests
get、post
用法1
import requests# 发送一个get请求 response = requests.get("http://127.0.0.1:5000/") # 输出字符串 print(response.text) # 输出bytes 字节 print(response.content) # 输出字典 print(response.json())
text、content、json格式转换
# text-->content 编码 new_content =resp.text.encode() # content-->text 解码 new_text = resp.content.decode()
text-->字典,可以使用eval(),eval的本质是转换成可以执行的Python代码,如果text是删除数据库的代码,用eval转换后直接执行,太危险了。
json是一种特殊格式的字符串‘{"key":"value","key2":"[1,2,3]","key3":"true"}’,value值可以是数组,也可以是布尔类型(与Python的区别,Python要大写True)。必须要用双引号。Python用none表示空,json用null表示。
json_data = '{"key1":"value","key2":"[1,2,3]","key3":"true","key4":null,"key5":123}' # json转化成字典 dict_data = json.loads(json_data) print(dict_data)
输出:{'key1': 'value', 'key2': '[1,2,3]', 'key3': 'true', 'key4': None, 'key5': 123}
# python字典转化json数据格式的字符串,序列化 json_new_data = json.dumps(dict_data) print(json_new_data)
输出:{"key1": "value", "key2": "[1,2,3]", "key3": "true", "key4": null, "key5": 123}
序列化和反序列化
序列化:编程语言的数据类型转化成通用的数据类型 文本和二进制
反序列化:通用的数据格式转化成编程语言的数据类型
相同接口,同时发生get和post请求,返回的状态码不同。
import requests# get resp = requests.get('http://httpbin.org/get') print(resp) # post resp = requests.post('http://httpbin.org/get') print(resp)
输出:<Response [200]>
<Response [405]>
因为访问的接口只允许get,post被禁止。
requests支持很多的请求方法,具体哪些请求方法,可以进入源代码进行查看(在get上按住“ctr+鼠标左键”进入源代码,structure-->request可查看所有支持的请求方法。)
用法2
import requests# 在自动化测试中,如果修改用例中请求方法 (1,'url','get','...') method = 'get'# 通用的方法1 if method == 'get':requests.get('http://httpbin.org/get') elif method == 'post':requests.post('http://httpbin.org/get')# 通用的方法2 func_name = getattr(requests,method) resp = func_name('http://httpbin.org/get') print('a',resp)# 通用的方法3 resp3 = requests.request(method,'http://httpbin.org/get') print('resp3',resp3)
输出:a <Response [200]>
resp3 <Response [200]>
设置请求参数的方法
1、制定请求头
不是所有的接口可以把参数放到headers里面,服务器支持才可以。post、get都支持。
用法1:
自定义请求头,直接将请求头保存在字典中,通过headers关键字参数传递
import requestsurl = 'http://httpbin.org/get' # 添加请求头,使用字典存储自定义的请求头 headers = {"xxx":"xiaoyugan","yyy":"kunkun"} # get 建议使用关键字参数,避免使用位置参数,导致位置混乱 resp = requests.request('GET',url=url,headers=headers) print(resp.text)
输出:"C:\Program Files\Python37\python.exe" D:/Pycharm-Workspace/web_study/day18/demo_设置请求头.py
{
"args": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.24.0",
"X-Amzn-Trace-Id": "Root=1-61800842-535bd0a731bf700d391b0f2b",
"Xxx": "xiaoyugan",
"Yyy": "kunkun"
},
"origin": "112.37.161.106",
"url": "http://httpbin.org/get"
}
解析:User-Agent为客户端,可以在添加请求头时自定义客户端为浏览器:headers = {"xxx":"xiaoyugan","yyy":"kunkun","user-agent":“chrome”},将客户端修改为浏览器。
2、URL
方法1
import requestsurl = 'http://httpbin.org/get' url = f"{url}?username=yuz&pass=123"resp = requests.request('GET',url) print(resp.text)
输出:
{
"args": {
"pass": "123",
"username": "yuz"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.24.0",
"X-Amzn-Trace-Id": "Root=1-61800d2a-1dd244ab7c47e2e36f83fc4d"
},
"origin": "112.37.161.106",
"url": "http://httpbin.org/get?username=yuz&pass=123"
}
方法2
import requestsurl = 'http://httpbin.org/get' params = {"username":"yuz","pass":"123"} # params关键字参数就是设置URL参数的 resp = requests.request('GET',url,params=params) print(resp.text)
输出:
{
"args": {
"pass": "123",
"username": "yuz"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.24.0",
"X-Amzn-Trace-Id": "Root=1-61800e48-042edc3d620cd5ad2c286ef6"
},
"origin": "112.37.161.106",
"url": "http://httpbin.org/get?username=yuz&pass=123"
}
3、form data
import requestsurl = 'http://httpbin.org/post' data = {"username":"yuz","pass":"123"} # 存在字典中,然后通过data关键参数传递 resp = requests.request('POST',url,data=data) print(resp.text)
输出:
{
"args": {},
"data": "",
"files": {},
"form": {
"pass": "123",
"username": "yuz"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "21",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.24.0",
"X-Amzn-Trace-Id": "Root=1-61800fbf-78699b7c71a9c85c571f2537"
},
"json": null,
"origin": "112.37.161.106",
"url": "http://httpbin.org/post"
}
4、可以支持form data 、URL、headers同时传递参数
5、json 数据
自动修改 "Content-Type": "application/json",
import requestsurl = 'http://httpbin.org/post' data = {"username":"yuz","pass":"123"} # 存在字典中,然后通过data关键参数传递 resp = requests.request('POST',url,json=data) print(resp.text)
输出:
{
"args": {},
"data": "{\"username\": \"yuz\", \"pass\": \"123\"}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "34",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.24.0",
"X-Amzn-Trace-Id": "Root=1-61801072-2791faf83d8ebdf54fd49a6a"
},
"json": {
"pass": "123",
"username": "yuz"
},
"origin": "112.37.161.106",
"url": "http://httpbin.org/post"
}
注意:不能同时使用form data和json同时传递参数,因为他们都是请求体。
token的处理流程
1、首先登录,获取登录接口返回的token值,包含token type,bearer
2、再访问其他接口时,带上token值
3、token放在请求的什么位置传输由开发说了算,一般标准的规范是放在Authorization请求头中,而且通常会设置一个前缀Bearer,JWT
Python-自动化测试之接口基础相关推荐
- Python自动化开发之基础篇--Day1
一.Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC ...
- python 接口自动化测试_python接口自动化测试之接口数据依赖
作者:泰斯特test 链接:https://juejin.im/post/5cc11f6be51d45401f566d14 在做自动化测试时,经常会对一整套业务流程进行一组接口上的测试,这时候接口之间 ...
- 接口自动化测试之接口测试基础
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 文章目录 一.分层的自动化测试 1.传统自动化测试 2.测试金字塔 3.分层自动化测试 二.接口测试基础知识 1.接口的含义 2. ...
- python接口自动化 一个变量 其他接口要用_python接口自动化测试之接口数据依赖的实现方法...
在做自动化测试时,经常会对一整套业务流程进行一组接口上的测试,这时候接口之间经常会有数据依赖,那么具体要怎么实现这个依赖呢. 思路如下: 抽取之前接口的返回值存储到全局变量字典中. 初始化接口请求时, ...
- Python自动化测试之cookie绕过登录(保持登录状态)
目录 前言 cookie工作原理 cookie绕过登录 1,哪些场景需要使用cookie绕过登录? 2,接下来举例说明怎样编写python脚本,利用cookie机制绕过登录. 3,思路: 4,实际操作 ...
- python自动化测试环境搭建_selenium+python自动化测试之环境搭建
最近由于公司有一个向谷歌网站上传文件的需求,需要进行web的自动化测试,选择了selenium这个自动化测试框架,以前没有接触过这门技术,所以研究了一下,使用python来实现自动化脚本,从环境搭建到 ...
- 自动化测试之 web - 基础篇
Web自动化测试,基于python+selenium+pytest 一.环境准备 1.1 驱动安装 1.2 selenium 安装 1.3 chrome 启动参数( 以下皆以chrome浏览器作为举例 ...
- python自动化测试之Appium自动化测试环境搭建
[文章末尾给大家留下了大量的福利] 前言: 好几个小伙伴在问appium环境搭建咋整勒,这不就整出来了嘛,接下来几篇文章就把常用的所有的环境搭建都写完把 Appium 介绍 Appium是一个开源工具 ...
- Python自动化一--接口测试基础知识,jmeter操作介绍
一,接口概念 1)系统对外的接口:比如你要从别的网站或服务器上获取资源或信息,别人肯定不会把数据库共享给你,他只能给你提供一个他们写好的方法来获取数据,你引用他提供的接口就能使用他写好的方法,从而达到 ...
最新文章
- RabbitMQ 的引言
- android沉浸式 字体,全面解析android沉浸式状态栏
- 基于升序链表的定时器
- 图像处理:给验证码图片做降噪处理及数据清洗
- 虚拟机linux挂载光盘显示:mount: you must specify the filesystem type
- 对系统组件化接口设计的一点看法
- Entity Framework 关系约束配置
- 利用 Python 制作酷炫的飞船大战!|原力计划
- ITAA学员的经典对白
- 《程序是怎样跑起来的》第六章有感
- Workflow 规则大全 最新版
- 关于怎么计算某一年的第一天为周几的问题
- matlab 求副瓣电平,一种阵列天线一维方向图的副瓣电平计算方法与流程
- Python 刷题笔记:背包问题
- 永城2021高考成绩查询,永城中考成绩查询2021
- 小沙的remake(牛客)排序+ 树状数组 + dp
- Linux中软件管理的yum命令
- 基于tomcat的javaweb在线教学网站的开发--完成登录、注册以及考试页面
- Android 11 适配更新APK安装
- 小波基函数的选择和小波构造