首先,用 python 做接口测试,主要用到就是 requests 库和 json 库。
1.先看一个简单的示例
1.1 get请求
# -*- coding: UTF-8 -*-
import requests
get_url = 'http://127.0.0.1:8000/api/get_guest_list/'
data = {'eid':1,'phone':'13511001100'}
# 产生一个名为r的Response对象,可以从这个对象中获取我们想要的信息; #get请求传参数时,使用params关键字
r = requests.get(url=get_url, params=data, timeout=5) # timeout参数用来设定停止等待响应的时间
print(r.url) # 返回请求url
# http://127.0.0.1:8000/api/get_guest_list/?eid=1&phone=13511001100
print(r.json()) # 以JSON格式解析响应内容
# {'status': 200, 'message': 'success', 'data': {'realname': 'alen', 'phone': '13511001100', 'email': 'alen@mail.com', 'sign': True}}
print(r.status_code) # 返回状态码
# 200
print(r.raise_for_status()) # 如果发送了一个错误请求,如404、500等,可以通过raise_for_status()来抛出异常
# None
print(r.encoding) # 查看requests使用了什么编码,同时可以用r.encoding属性来改变它
# utf-8
print(r.raw) # 获取来自服务器的原始套接字响应
# <urllib3.response.HTTPResponse object at 0x0000000003061A90>
print(r.headers) # 服务器返回给我们的响应头信息,也可以在传参时通过headers=XXX来定制请求头
# {'Date': 'Sat, 10 Dec 2022 05:09:06 GMT', 'Server': 'WSGIServer/0.2 CPython/3.7.2', 'Content-Type': 'application/json', 'X-Frame-Options': 'DENY', 'Content-Length': '131', 'X-Content-Type-Options': 'nosniff', 'Referrer-Policy': 'same-origin'}
print(r.request) # 获取原来创建的Request对象
# <PreparedRequest [GET]>
print(r.request.headers) # 发送到服务器的请求头
# {'User-Agent': 'python-requests/2.28.1', 'Accept-Encoding': 'gzip, deflate, br', 'Accept': '*/*', 'Connection': 'keep-alive'}
1.2 post请求
注意 post 请求的数据的格式
# -*- coding: UTF-8 -*-
import requests,json
post_url = 'http://127.0.0.1:8000/api/add_guest/'
payload2 = {'eid':1,'realname':'tom001','phone':13510011001}
r = requests.post(post_url, data=payload2, timeout=5) # post请求传参数时,使用data关键字
print(r.json()) # 以JSON格式解析响应内容
# {'status': 200, 'message': 'add guest success'}
print(r.status_code) # 返回状态码
# 200
# 若解析不了,可能是格式不对:
# 方法一:
r = requests.post(post_url, json=payload2, timeout=5)
# 方法二:
r = requests.post(post_url, data =json.dumps(payload2), timeout=5)
2.然后通过函数调用来发送 get/post 请求
将get、post 封装成函数
# -*- coding: UTF-8 -*-
import requests
def send_get(url, data):
""" 定义send_get函数,用来接收参数,发送get请求 """
r = requests.get(url=url, params=data, timeout=3)
result = r.json()
return result
def send_post(url, data):
""" 定义send_post函数,用来接收参数,发送post请求 """
# r = requests.post(url=url, json=data, timeout=3)
r = requests.post(url=url, data=data, timeout=3)
result = r.json()
return result
def main(url, method, data):
""" 定义一个主函数,根据method是get或post,来调用send_post()或send_get() """
if method == 'POST':
r = send_post(url, data) # 如果是POST请求,则调用send_post()
else:
r = send_get(url, data) # 如果是GET请求,则调用send_get()
return r # 将结果返回出去
# get 调用
url1 = 'http://127.0.0.1:8000/api/get_guest_list/'
data1 = {'eid':1,'phone':'13511001100'}
demo1 = main(url1, 'GET', data1)
print(demo1)
# {'status': 200, 'message': 'success', 'data': {'realname': 'alen', 'phone': '13511001100', 'email': 'alen@mail.com', 'sign': True}}
# post 调用
url2 = 'http://127.0.0.1:8000/api/add_guest/'
data2 = {'eid':1,'realname':'tom003','phone':13510011003}
demo2 = main(url2, 'POST', data2)
print(demo2)
# {'status': 200, 'message': 'add guest success'}
3.定义一个类,对post请求和get请求进行封装
封装成类
3-1 含有构造器
# run_method.py
# -*- coding: UTF-8 -*-
import requests
import json
class RunMain:
""" 含有构造器 """
def __init__(self, url, method, data=None):
self.t = self.run_main(url, method, data)
# 利用json.dumps将响应数据进行json格式的编码解析
# indent=2将输出结果缩进2个字符显示
# sort_keys=False,输出结果是否按照关键字排序
# json.dumps 序列化时对中文默认使用的ascii编码,ensure_ascii=False才会输出中文
# return result
def send_post(self, url, data):
# r = requests.post(url=url, json=data)
r = requests.post(url=url, data=data)
result = r.json()
return json.dumps(result, indent=2, sort_keys=False, ensure_ascii=False)
def send_get(self, url, data):
r = requests.get(url=url, params=data)
result = r.json()
return json.dumps(result, indent=2, sort_keys=False, ensure_ascii=False)
def run_main(self, url, method, data=None):
if method == 'GET':
r = self.send_get(url, data)
else:
r = self.send_post(url, data)
return r
if __name__ == '__main__':
url1 = 'http://127.0.0.1:8000/api/get_guest_list/'
data1 = {'eid':1,'phone':'13511001100'}
test1 = RunMain(url1, 'GET', data1) # 因为有构造器 __init__,实例化时要带参数
print(test1.t)
#
# {
# "status": 200,
# "message": "success",
# "data": {
# "realname": "alen",
# "phone": "13511001100",
# "email": "alen@mail.com",
# "sign": true
# }
# }
url2 = 'http://127.0.0.1:8000/api/add_guest/'
data2 = {'eid':1,'realname':'tom004','phone':13510011004}
test2 = RunMain(url2, 'POST', data2) # 因为有构造器 __init__,实例化时要带参数
print(test2.t)
# {
# "status": 200,
# "message": "add guest success"
# }
3-2 不含构造器(推荐)
# run_method.py
# -*- coding: UTF-8 -*-
import requests
import json
class RunMain:
"""无构造器"""
def send_get(self, url, data):
res = requests.get(url=url, params=data).json()
return res
def send_post(self, url, data):
res = requests.post(url=url, data=data).json()
return res
def run_main(self, url, method, data=None):
res = None
if method == 'GET':
res = self.send_get(url, data)
else:
res = self.send_post(url, data)
return res
if __name__ == '__main__':
url1 = 'http://127.0.0.1:8000/api/get_guest_list/'
data1 = {'eid': 1, 'phone': '13511001100'}
run1 = RunMain() # 先实例化,实例化时不需要带参数
print(run1.run_main(url1, 'GET', data1))
# {'status': 200, 'message': 'success', 'data': {'realname': 'alen', 'phone': '13511001100', 'email': 'alen@mail.com', 'sign': True}}
url2 = 'http://127.0.0.1:8000/api/add_guest/'
data2 = {'eid':1,'realname':'tom005','phone':13510011005}
run2 = RunMain() # 先实例化,实例化时不需要带参数
print(run2.run_main(url2, 'POST', data2))
# {'status': 200, 'message': 'add guest success'}
ps.建议在封装运行方法类时,不要加构造器,这样就不需要在实例化时传参,在后面的主函数中从excel中取出参数后再传给类中的方法即可。