pytest 接口自动化 从百草园到三味书屋...
Posted android超级兵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytest 接口自动化 从百草园到三味书屋...相关的知识,希望对你有一定的参考价值。
pytest 接口自动化从百草园到三味书屋...
底部会给出完整代码!,
⚠️:本篇不说废话,全是干货!
开发环境
- pytest 6.2.5
- python 2.7.16
- PyCharm 2021.2.3
- system mac
- requests 2.26.0
- flask 2.0.2
- jsonpath 0.82
本篇采用接口来自玩android
requests
安装requests
pip install requests
查看是否安装成功: pip show requests
GET 请求
最简单的使用:
url: str = "https://www.wanandroid.com/"
result = requests.get(url.format("article/list/0/json"))
print(result.text)
来看看结果:
可以看到虽然请求出来了,但是感觉有点丑,来格式化一下!
import json
url: str = "https://www.wanandroid.com/"
# TODO
result = requests.get(url.format("article/list/0/json"))
print(json.dumps(json.loads(result.text), indent=4, ensure_ascii=False))
这里采用json来进行格式化
效果图:
可能会有同学问json.dumps的参数,分别是什么意思:
json.dumps("json数据", indent=4, ensure_ascii=False)
- 参数一:json数据
- 参数二:格式化后的空格
- 参数三:是否解码
一张图搞清楚:
POST请求
post请求的话一定会携带参数,这里拿登陆来举例:
loginJson =
"username": "1********0", # 这里输入自己的,如果没有自己创建一个
"password": "o******7",
resultData = requests.post(url.format("user/login"), params=loginJson)
resultData.encoding = 'utf-8'
# print(resultData.text)
# 格式化
print(json.dumps(json.loads(resultData.text), indent=4, ensure_ascii=False))
请求结果:
这里采用的是登陆的接口,如果没有账号的同学在这里注册!
最基本的使用就这么多
还有一些需要知道的参数:
添加header信息
什么是header?
header就是发送网络请求时候 请求头部的信息
比如说,在企业开发时,请求头(header)中必加的是token,token表示是每一位用户的信息.
如何添加head,以百度为例:
先来看看不加header的效果:
baiduUrl = 'https://www.baidu.com/'
response = requests.get(baiduUrl)
print(response.text)
会出现乱码:
添加header的效果:
可以看出,不仅不乱码了,而且还给格式化了一下!
⚠️: 这里的header内容不用记,一般要添加的话,让你添加的那个人都会告诉你需要添加什么!
结合pytest小实战
代码比较简单,直接看代码:
import pytest
import requests
@pytest.fixture
def requestUrl():
return "https://www.wanandroid.com/"
class TestRequests:
@pytest.mark.parametrize("index", ['0', '1', '2', '3', '4', '5',"test assert"])
def test_demo01(self, requestUrl: str, index: str):
result = requests.get(requestUrl.format("article/list//json").format(index))
# 为了方便查看,先不格式化
# print("result<>:".format(index) + json.dumps(json.loads(result.text), indent=4, check_circular=False))
print("result<>:".format(index) + result.text)
# 断言是否成功
assert result.ok
if __name__ == '__main__':
pytest.main(['-s'])
这里采用pytest的parametrize机制,一共测试7条数据
- 0-5条数据是正确的
- 第7条数据test assert 是错误的!
来看看效果:
flask
安装 flask
pip install flask
查看是否安装成功: pip show flask
什么是flask?
如果你觉得你们后台写的接口太丑,那么就可以用到flask,flask是用来本地自己写接口的!
最简单的flask
from flask import Flask
flask = Flask(__name__)
@flask.get('/')
def test_flask_demo1():
return "hello flask"
if __name__ == '__main__':
flask.run()
来看看效果:
⚠️:默认是get请求
flask - POST请求
post请求稍微麻烦一点点,post请求不能直接在浏览器访问,需要先开启服务,然后通过上面讲到的requests来访问!
例如这样:
在开发中没有人直接返回一个字符串的,都是返回的json格式的数据
例如这样:
咋们肯定不会写这么复杂,就先来个简单的.
先来了解一下json,生成json串我总结了三种方法:
- 方式一:
这是我最喜欢的方式,简单明了!
- 方式二:
这种需要手动写一点点代码,能实现,但是我个人不喜欢用 - 方式三:
这是最简单的方式,不推荐使用,不好维护
flask本地json接口
flask = Flask(__name__)
@flask.get('/')
def test_flask_demo1():
bean = StudentFlaskBean("张三", "18", True)
print("参数为:", json.dumps(bean.__dict__, indent=4, ensure_ascii=False))
return json.dumps(bean.__dict__, indent=4, ensure_ascii=False)
if __name__ == '__main__':
flask.run()
效果图:
动态写法
如果我们想要动态加载page页怎么来做呢?
只需要这样:
来看看效果图:
只要格式正确都可以输入监测到
flask一些常用的属性
- 检测post输入的内容:
request.get_data()
这种一点也不好用,因为结果前面会带个b,例如:
b'username=12345678913&pwd=666666'
request.get_json()
这种方式比较好,因为可以直接获取到某个属性!
检测get的一些常用属性:
这里比较简单,因为是get请求,所以直接在浏览器访问即可
效果图为:
到这里flask就差不多了,如果你还想进阶一下,点我查看
走到这里同学们应该会自己请求一个接口并且直接搞一个本地的url了,但是呢,本地url都是一个json,如何解析json获取到对应的数据呢?
接下来我就给大家介绍jsonpath!
jsonpath
什么是jsonpath?
从名字就能看出来,是用来解析json数据的
先来规定json数据:
resultJsonData =
"schoolInfo":
"name": "实验一中",
"time_start": "2000-1-1"
,
"grade": [
"name": "雄鹰班",
"classData": [
"name": "张三",
"age": 13.5
,
"name": "杜子腾",
"age": 13.2
]
,
"name": "猎鹰班",
"classData": [
"name": "黄飞鸿",
"age": 13.7
,
"name": "郭德纲",
"age": 14.1
]
]
来看看使用,直接上效果图:
jsonpath 表达式规范
- $ 表示根结点
- . 表示取子节点
- … 表示获取所有符合条件的内容
- * 代表所有元素的节点
- [] 表示迭代器的标识 用于处理下标等情况
- [,] 多个结果选择
- ?() 过滤操作
- @ 当前节点
炫酷高端的查找方式
这里非常简单,仔细看看就明白了,这里就不过多多介绍啦!
小实战
总结:
- requests 用来请求接口 get / post 等
- flask 用来自己写本地接口
- jsonpath 用来解析json数据
写了这么多代码,感觉还是有点懵懵的,来个小实战疏通一下.
需求:
通过flask本地写一个登陆功能,然后使用requests来请求,最后采用jsonpath解析数据,判断是否登陆成功!
相信大家已经了如指掌,直接看代码了:
接口(flask):
import json
import time
from flask import Flask, request
@flask.post('/login')
def testLogin():
username = ""
pwd = ""
msg = ""
data = None
try:
if request.json['username'] == "12345678913":
username = request.json['username']
if request.json['pwd'] == "666666":
pwd = request.json['pwd']
msg = "恭喜你,成功了,小伙子代码写的不赖啊!"
data = Data("成功返回数据啊。。", getCurrentData())
else:
msg = "密码输入错误.. 仔细检查一下啊。。"
else:
username = request.json['username']
pwd = "******"
msg = "账号输入错误。。 密码无法查看"
except Exception:
data = None
loginBean = LoginBean(username, pwd, msg, data)
return json.dumps(loginBean.__dict__, indent=4, ensure_ascii=False)
# 获取当前时间
def getCurrentData() -> str:
return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
if __name__ == '__main__':
flask.run()
实体类:
class Data:
def __init__(self, title: str, currentTime: str):
self.title = title # 成功返回标题
self.currentTime = currentTime # 成功返回当前时间
class LoginBean:
def __init__(self, username: str, pwd: str, msg, data: None):
self.username = username # 账号
self.pwd = pwd # 密码
self.msg = msg # 登陆返回信息
if data is not None:
self.data = data.__dict__ # 具体登陆信息 失败返回null
客户端:(paramData)
import json
import requests
paramData =
"username": "12345678913",
"pwd": "666666"
result = requests.post("http://127.0.0.1:5000/login", json=paramData)
print(json.dumps(json.loads(result.text), indent=4, ensure_ascii=False))
来看看实现的几种效果吧:
说明 | 图片展示 |
---|---|
账号错误 | |
密码错误 | |
参数错误 | |
输入正确 |
好了,就讲这么多,如果觉得哪一些知识点写的不全,需要补充请在评论区留言哦!
原创不易,您的点赞就是对我最大的支持!
猜你喜欢:
以上是关于pytest 接口自动化 从百草园到三味书屋...的主要内容,如果未能解决你的问题,请参考以下文章
android 图解 PhotoView,从‘百草园’到‘三味书屋’!