作者:mobiledu2502853587 | 来源:互联网 | 2023-06-08 13:25
引言:你是如何做接口自动化的,用的工具于技术有哪些?2个维度:工具:postman、jmeter代码:requests一、Requests概述Requests在官方的文档中,有这么
引言:你是如何做接口自动化的,用的工具于技术有哪些?
2个维度:
工具:postman、jmeter
代码:requests
一、Requests概述
Requests在官方的文档中,有这么介绍的⼀句话,具体为:HTTP For Humans,翻译过来就是:“让HTTP服务人类”。Requests是非常优秀的⼀个Python的第三方库,它在HTTP的应用层的协议中,客户端与服务端的交互请求, 非常的轻量级,交互非常的友好。
安装:pip install requests
二、Requests的源码结构
在如上的流程图中,我们可以看出,我们常用的请求方法GET,POST,PUT,DELETE的方法,在Requests里都能够很好的得到支持和处理。
三、Requests请求方法的参数
在⼀个请求方法中,我们关心的是它到底需要带哪些参数,主要可以总结为:
简单的我们可以把它总结为:请求地址,请求方法,请求参数(不是必填),和其他的非必填的信息
四、get方法实战
具体展示如下,以百度为例:
结果如下:
其中r.text和r.content区别:
用了request.get方法后,返回一个response对象,这个对象里面存的是服务器返回的所有信息,包括响应头,响应状态码等。
其中返回的网页部分会存在.content和.text两个对象中。如果需要获得这些网页原始数据,我们可以通过r.text 或 r.content来获取数据。
- .text 存的是.content 编码后的字符串
- .content中间存的是字节码
一般来说 ,text直接用比较方便,返回的是字符串,但是,有时候会解析不正常,导致返回的是一堆乱码。这时需要用.content.decode('utf-8'),使其正常显示。
总的来说,text是现成的字符串,.content还要编码,但是.text不是所有时候显示都正常(需要用.content.decode()进行手动编码)
想要提取文本就用text,但是如果你想要提取图片、文件,就要用到content。
五、post方法实战
在post的请求方法中,它的形式参数存在两种,⼀种是json形式,还有⼀个是data形式。
json使用场景:请求数据格式是application/json
import requests
def login():
r=requests.post(
url="http://47.95.142.233:8000/login/auth/",
headers={'Content-Type':'application/json'},
json={"username":"13484545195","password":"asd888"})
return r.json()["token"]
print(login())
data使用场景:请求数据格式是表单
当为json类型时,如果使用data=,需要序列化处理该如何处理?
import requests
def login():
r=requests.post(
url="http://47.95.142.233:8000/login/auth/",
headers={'Content-Type':'application/json'},
data=json.dumps({"username":"13484545195","password":"asd888"}))
return r.json()["token"]
print(login())
六、参数传递
一般情况,想要实现参数传递的方法:
1、函数返回值
2、把动态参数写到一个文件里面,使用到的时候再读取(使用的较多)
a、函数返回值的方式:
import requests
import json
def login():
r=requests.post(
url="http://47.95.142.233:8000/login/auth/",
headers={'Content-Type':'application/json'},
data=json.dumps({"username":"13484545195","password":"asd888"}))
return r.json()["token"]
def index():
r=requests.get(
url="http://47.95.142.233:8000/interface/index",
headers={"Authorization":"JWT {token}".format(token=login())})
print(r.status_code)
print(r.json())
index()
b、读取的方式:
import requests
import json
def write(content):
with open("token", "w") as f:
f.write(content)
def read():
with open("token", "r") as f:
return f.read()
def login():
r=requests.post(
url="http://47.95.142.233:8000/login/auth/",
headers={'Content-Type':'application/json'},
data=json.dumps({"username":"13484545195","password":"asd888"}))
write(content=r.json()["token"])
def index():
r=requests.get(
url="http://47.95.142.233:8000/interface/index",
headers={"Authorization":"JWT {token}".format(token=login())})
print(r.status_code)
print(r.json())
login()
index()
七、实战-风暴平台
import unittest
import requests
import json
# 将文件写入到filename里
def write(filename,content):
with open(filename, "w") as f:
f.write(content)
# 读取文件filename的内容
def read(filename):
with open(filename, "r") as f:
return f.read()
# 登录接口,将获取到的token,通过变量r,写入filename里
def login():
r=requests.post(
url="http://47.95.142.233:8000/login/auth/",
headers={'Content-Type':'application/json'},
json={"username":"13484545195","password":"asd888"})
return r
# 由于每次访问都会在头里调用token,那么将其分离出来,并且将文件名命名为:token
def headers():
return {"Authorization": "JWT {token}".format(token=read(filename="token"))}
# 添加产品的方法
def addProduct():
r=requests.post(
url="http://47.95.142.233:8000/interface/product/",
headers=headers(),
json={"name":"无涯课堂","product_type":"WEB","version":"1.0.0","master":"无涯","description":"this is a test data"})
# 从添加产品的接口里,获取了产品的id,把id写入到名为:productid的文件里
# 如果是int类型的要强制转换为str
write(filename="productid",cOntent=str(r.json()["id"]))
return r
# 查询产品名称
def findProduct(findname):
r=requests.get(
url="http://47.95.142.233:8000/interface/products?name=findname".format(findname=findname),
headers=headers()
)
return r
# 修改产品
def modifyProduct():
r=requests.put(
url="http://47.95.142.233:8000/interface/product/{productid}/".format(
productid=read(filename="productid")),
headers=headers(),
json={"name":"接口产品","product_type":"WEB","version":"V1.0.1","master":"Rose","description":"this is an API product."}
)
return r
# 删除产品的方法,删除产品是没有参数的
def delProduct():
# 产品id的调用
r=requests.delete(
url="http://47.95.142.233:8000/interface/product/{productid}/".format(
productid=read(filename="productid")),headers=headers(),
)
return r
class ApiTest(unittest.TestCase):
# 初始化动作,并且把登录接口获取到的token写到文件中去
def setUp(self) -> None:
r=login()
write(filename="token",cOntent=r.json()["token"])
# 清理动作,什么都不做
def tearDown(self) -> None:
pass
def test_index(self):
'''验证查看首页'''
r=requests.get(
url="http://47.95.142.233:8000/interface/index",
headers=headers())
self.assertEqual(r.status_code,200)
self.assertEqual(r.json()["count"]["api"],0)
def test_add_product(self):
'''测试产品的添加'''
r=addProduct()
delProduct()
self.assertEqual(r.status_code,201)
self.assertEqual(r.json()["name"],"无涯课堂")
def test_find_productMoren(self):
'''默认查询产品名称'''
addProduct()
r=findProduct(findname="")
self.assertEqual(r.status_code,200)
def test_find_productMohu(self):
'''模糊查询产品名称'''
addProduct()
r=findProduct(findname="无")
self.assertEqual(r.status_code,200)
def test_find_productJingque(self):
'''精确查询产品名称'''
addProduct()
r=findProduct(findname="无涯课堂")
self.assertEqual(r.status_code,200)
def test_modify_productName(self):
'''修改产品的名称'''
addProduct()
r=modifyProduct()
delProduct()
self.assertEqual(r.json()["name"],"接口产品")
def test_modify_productType(self):
'''修改产品的类型'''
addProduct()
r=modifyProduct()
delProduct()
self.assertEqual(r.json()["product_type"],"WEB")
def test_modify_productVersion(self):
'''修改产品的版本'''
addProduct()
r=modifyProduct()
delProduct()
self.assertEqual(r.json()["version"],"V1.0.1")
def test_modify_productMaster(self):
'''修改产品的负责人'''
addProduct()
r=modifyProduct()
delProduct()
self.assertEqual(r.json()["master"],"Rose")
def test_modify_productDescription(self):
'''修改产品的描述'''
addProduct()
r=modifyProduct()
delProduct()
self.assertEqual(r.json()["description"],"this is an API product.")
def test_del_product(self):
'''删除产品'''
addProduct()
r=delProduct()
self.assertEqual(r.status_code,204)
if __name__ == '__main__':
unittest.main()