千纸鹤

  博客园  ::  :: 新随笔  ::  ::  :: 管理
  5 随笔 :: 70 文章 :: 0 评论 :: 9301 阅读
《一》使用requests代码做接口测试
(1)百度实例
# 百度实例
url = 'http://www.baidu.com'
res = requests.get(url)
# 打印响应回来的内容(二进制文本内容)
print(res.content)
# 打印响应回来的内容(文本内容)
print(res.text)
# 打印接口地址
print(res.url)
# 打印cookie
print(res.cookies)
# 打印头部内容
print(res.headers)
# 打印json(会报错,响应回来的是文本,不是json数据)
print(res.json())

(2)get请求带参数实例(data)
# get请求带参数实例(data):字典的类型实例
# 接口信息: GET /api/gettomorrow 获取明天天气接口 (http://39.98.138.157:5000/api/gettomorrow)
# 接口地址(url) 和 接口参数(data)
url = 'http://39.98.138.157:5000/api/gettomorrow'
data = {"city":"1"}

# get请求传参是以params的形式进行传参
# def get(url, params=None, **kwargs):
res = requests.get(url=url,params=data)

# 转换为文本格式的数据
print(res.text,type(res.text))
# 转换为json格式的数据
print(res.json(),type(res.json()))

# 文本格式和json格式的区别
# <文本格式>响应的内容(数据类型为字符串类型)
# <json格式>响应的内容(数据类型为字典类型)
# 推荐使用json格式取值:可变的数据类型,方便取值

(3)post请求带参数实例(data)
# post请求带参数实例(data):字典的类型实例
# 接口信息: POST /api/login 电商登录接口(http://39.98.138.157:5000/api/login)
# 接口文档: 要求传的content type:application/json
# 接口地址(url) 和 接口参数(data)
url = 'http://39.98.138.157:5000/api/login'
data = {"password": "123456","username": "admin"}
# 打印参数的类型 print(type(data)) <class 'dict'>

# 接口文档: 要求传的content type:application/json,所以post请求传参是以json的形式进行传参
# def post(url, data=None, json=None, **kwargs):
res = requests.post(url,json=data)
print(res.json())

# 说明:什么时候用data ?什么时候用json ?
# 看Response content type(响应内容类型)是哪一种类型(json还是data还是其他?)
# 如果是json类型就推荐用json传
# 如果是json类型,非要用data传是否可以?(可以,见<下方实例>)
# data(要求传的是字符串类型) json(要求传的是字典类型)
# 什么情况下要修改content type?(接口文档和实际接口参数类型不一致的时候就要去修改)
# content type 数据类型是开发写接口文档的时候就定义好了

(4)data参数类型为:字符串(手动形式:字典改成字符串)的类型实例(需要加个请求头)
# 接口信息: POST /api/login 电商登录接口(http://39.98.138.157:5000/api/login)
# 接口文档: 要求传的content type:application/json
# 接口地址(url) 和 接口参数(data)
url = 'http://39.98.138.157:5000/api/login'
data = '{"password": "123456","username": "admin"}'
# 打印参数的类型 print(type(data)) <class 'str'>
# 加个请求头
header = {"content-type":"application/json"}
# def post(url, data=None, json=None, **kwargs):
res = requests.post(url,data=data,headers=header)
# 打印请求头
print(res.headers)
print(res.json())

(5)data参数类型为:字符串(代码形式:字典改成字符串)的类型实例(需要json.dumps(data))
# 接口信息: POST /api/login 电商登录接口(http://39.98.138.157:5000/api/login)
# 接口文档: 要求传的content type:application/json
# 接口地址(url) 和 接口参数(data)
url = 'http://39.98.138.157:5000/api/login'
data = {"password": "123456","username": "admin"}
# 打印参数的类型 print(type(data)) <class 'dict'>
# 字典改成字符串:json.dumps
data1 = json.dumps(data)
print(type(data1)) # <class 'str'>
# 加个请求头
header = {"content-type":"application/json"}
# def post(url, data=None, json=None, **kwargs):
res = requests.post(url,data=data1,headers=header)
print(res.json())

(6)data参数类型为:字符串(代码形式:字符串改成字典)的类型实例(需要json.loads(data) 或者 eval(data))
# 接口信息: POST /api/login 电商登录接口(http://39.98.138.157:5000/api/login)
# 接口文档: 要求传的content type:application/json
# 接口地址(url) 和 接口参数(data)
url = 'http://39.98.138.157:5000/api/login'
data = '{"password": "123456","username": "admin"}'
# 打印参数的类型 print(type(data)) <class 'dict'>

# 第一种方式:字符串改成字典(json.loads)
data1 = json.loads(data)
print(type(data1)) # <class 'dict'>
# 第二种方式:字符串改成字典(evel)
data1 = eval(data)
print(type(data1)) # <class 'dict'>

# json提交:字典类型数据

# 第一种方式: 加个请求头
# header = {"content-type":"application/json"}
# # def post(url, data=None, json=None, **kwargs):
# res = requests.post(url,json=data1,headers=header)
# 第二种方式: 不加请求头
res = requests.post(url,json=data1)

print(res.json())

# 总结:传json数据(json传字典,data传字符串) [重点理解:json取值]
# 1.可以直接用json传参
# 2.如果要用data传参,data参数类型数据改成字符串的类型,data=data
# 3.字符串改成字典:(1)json.loads(data) (2)eval(data)
# 4.字典改成字符串:json.dumps(data)

(7)json.load和json.dump的区别
# json.load:用于读取文件中json数据
# json.dump:用于写入文件中json数据 字典改成字符串
data = {"password": "123456","username": "admin"}

# 写入出来文件是字符串
# f = open('tt.txt','a')
# json.dump(data,f)

# 读取出来文件是字符串
f1=open('tt.txt','r')
print(f1.read(),type(f1.read())) # <class 'str'>

# 读取出来文件是字典(json.load(f1))
f2=open('tt.txt','r')
ff=json.load(f2)
print(ff,type(ff)) # <class 'dict'>
{"password": "123456", "username": "admin"} <class 'str'>
{'password': '123456', 'username': 'admin'} <class 'dict'>

(8)登录接口测试 测试一条用例(预期结果 实际结果)
# data参数类型为:字符串(代码形式:字符串改成字典)的类型实例(需要json.loads(data))
# 接口信息: POST /api/login 电商登录接口(http://39.98.138.157:5000/api/login)
# 接口文档: 要求传的content type:application/json
# 接口地址(url) 和 接口参数(data)
url = 'http://39.98.138.157:5000/api/login'
data = '{"password": "123456","username": "admin"}'
# 打印参数的类型 print(type(data)) <class 'dict'>
# 第一种方式:字符串改成字典(json.loads)
data1 = json.loads(data)
print(type(data1)) # <class 'dict'>
# 第二种方式:字符串改成字典(evel)
data1 = eval(data)
print(type(data1)) # <class 'dict'>
# def post(url, data=None, json=None, **kwargs):
# json提交:字典类型数据
res = requests.post(url,json=data1)
print(res.json())
# 如果这条用例返回来的是success 用例成功 用例失败
# 预期结果
exmsg = 'success'

# 实际结果
# 第一种方式:通过字典的方式取msg的字段的值
sjmsg = res.json()['msg']
print(sjmsg)
# 第二种方式:通过json取值 json格式的数据(数据,表达式)
# sjmsg=jsonpath.jsonpath(res.json(),'$..msg')[0]
# print(sjmsg)

# 第一种判断: if...else
if exmsg == sjmsg:
print('用例成功')
else:
print('用例失败')
# 第二种判断: assert,提示不友好,推荐使用try...except
try:
assert exmsg == sjmsg
print('用例成功')
except Exception as e:
print('用例失败')

《二》jsonpath的用法
(1)Demo实例
import jsonpath

data={
"store": {
"book": [
{
"category": "新闻学",
"author": "张三",
"title": "图书标题1",
"price": 8.95
},
{
"category": "金融学",
"author": "李四",
"title": "图书标题2",
"price": 12.00
},
{
"category": "计算机",
"author": "王五",
"title": "图书标题3",
"isbn": "0-553-21311-3",
"price": 9.99
},
{
"category": "医学",
"author": "赵六",
"title": "图书标题4",
"price": 22.99
}
],
"phone": {
"color": "red",
"price": 1999.00,
"author": "孙七"
},
"author": "周八",
"price": 1.00
},
"author": "吴九"
}

(2)语法规则说明
# $ 整个根节点对象
# @ 当前节点
# .或[] 子节点
# * 任意子节点
# .. 任意后代节点

(3)习题实例
# 1.找出book的所有author ['张三', '李四', '王五', '赵六'] jsonpath(数据,表达式)
print(jsonpath.jsonpath(data,'$.store.book[*].author'))
# 2.所有节点下的author 只要是作者都找出.. ['吴九', '周八', '张三', '李四', '王五', '赵六', '孙七']
print(jsonpath.jsonpath(data,'$..author'))
# 3.store下的所有元素
print(jsonpath.jsonpath(data,'$.store'))
# 4.book的第3个元素
print(jsonpath.jsonpath(data,'$.store.book[2]'))
# 5.book的前面2个元素 切片 [开始值:结束值 不包含结束值]
print(jsonpath.jsonpath(data,'$.store.book[:2]'))
# 6.book的最后2个元素
print(jsonpath.jsonpath(data,'$.store.book[-2:]'))
# 7.book的第1个元素到第4个元素 不包含4的元素
print(jsonpath.jsonpath(data,'$.store.book[:4]'))
# 8.book中所有带有 isbn 的元素 [?(@.)]是过滤表达式的写法 [?(@.isbn)]过滤其他只找表示式里面的内容
print(jsonpath.jsonpath(data,'$.store.book[?(@.isbn)]'))

《三》使用python代码做接口关联
test_py.py
# 电商登录接口--->电商获取个人信息接口--->电商获取商品信息接口--->电商添加购物车接口--->电商提交订单接口
# 接口关联 实现(登录到下单的一系列流程)
# 利用代码将流程实现出来 在框架中,若要实现这个流程?哪个知识点?实现好一点?
# unittest/pytest会要好点 普通写个用例和函数不友好,不方便管理用例
import jsonpath
import pytest
import requests

class TestCase:
token=None
# 响应 token号会变
# 1.响应回来的token号提取出来 保存在变量。
# 2.获得token的三种方式:
# 2-1:放在一个类变量中,都可以拿到token
# 2-2:其他方式(session)
# 2-3:返回值
# 登录
def test_login(self):
url='http://39.98.138.157:5000/api/login'
data={"password": "123456","username": "admin"}
res=requests.post(url,json=data)
print(res.json())
# 提取token 保存在变量中了
TestCase.token=jsonpath.jsonpath(res.json(), '$..token')[0]
sjmsg=jsonpath.jsonpath(res.json(),'$..msg')[0]
assert 'success'==sjmsg

# 注意 添加购物车 下单的时候需要用到这里面的userid和openid 这个怎么弄
# 获取个人信息
def test_getUserinfo(self):
url = 'http://39.98.138.157:5000/api/getuserinfo'
# 这个token不能写死 获得登录时的token
header={"token":TestCase.token}
res=requests.get(url,headers=header)
print(res.json())
sjname=jsonpath.jsonpath(res.json(),'$..nikename')[0]
assert '风清扬'==sjname

# 选择商品
def test_shopping(self):
url ='http://39.98.138.157:5000/api/getproductinfo?productid=8888'
res=requests.get(url)
print(res.json())
sjproductid=jsonpath.jsonpath(res.json(),'$..productid')[0]
assert 8888==sjproductid

# 商品添加到购物车
def test_cart(self):
pass

# 提交订单
def test_order(self):
pass

if __name__ == '__main__':
pytest.main(['-sv','test_py.py'])
posted on   隆江猪脚饭  阅读(86)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示