最优雅的http请求库(python的http请求库有很多,比如urllib2,urllib3,httplib)。
requests库简介
requests库是基于urllib3库封装的第三方http请求库,在python中requests应用最广泛的应该属网络爬虫方面,对于测试来说,我们对于requests的应用主要是接口测试方面。
实例(1)创建一个请求:
import requests #导入requests模块 ''' 号称最优雅的http请求库 ''' #创建一个http请求: res_get = requests.get('http://httpbin.org/get‘) #get请求 res_post = requests.post('http://httpbin.org/post', data={'key': 'value'}) #post请求 res_put = requests.put('http://httpbin.org/put', data={'key': 'value'}) #put请求 res_delete = requests.delete('http://httpbin.org/delete') #delete请求 res_head = requests.head('http://httpbin.org/head') #head请求 res_options = requests.options('http://httpbin.org/options') #options请求 #将所有响应结果放入列表中 res_list = [res_get, res_post, res_put, res_delete, res_head, res_options] #打印出所有的响应结果 for i in range(len(res_list)): print(f'\n第{i + 1}个http请求的响应结果:', res_list[i].text)
实例(2)传递url参数:
import requests
'''
1、带参数的get请求
get请求使用字典的形式传参 ''' parm = {'key1': 'value1', 'key2': 'value2'} res_get = requests.get('http://172.25.8.167:1080/get', params=parm) print(res_get.text, '\n请求url为:', res_get.url) ''' 2、当传入字典的值为null时,也会将字典的键传入url中 ''' parm = {'key1': 'value1', 'key2': ''} res_get = requests.get('http://172.25.8.167:1080/get', params=parm) print(res_get.text, '\n请求url为:', res_get.url) ''' 3、传入字典的值可以是一个列表 ''' parm = {'key1': 'value1', 'key2': ['value2', 'value3']} res_get = requests.get('http://172.25.8.167:1080/get', params=parm) print(res_get.text, '\n请求url为:', res_get.url)
实例(3)post请求传递参数:
import requests import json ''' 1、post请求 以字典的方式传入参数 ''' parm = {'key': 'value'} res_post = requests.post('http://172.25.8.167:1080/post', data=parm) print(res_post.text) ''' 2、post请求 以元祖列表的方式传入参数,也可以直接以元祖方式传入 ''' parm = [('key1', 'value1'), ('key2', 'value3')] res_post = requests.post('http://172.25.8.167:1080/post', data=parm) print(res_post.text) ''' 3、post请求 以json方式传入参数 ''' url = 'http://172.25.8.167:1080/post' payload = {'some': 'data'} res_post = requests.post(url, data=json.dumps(payload)) print(res_post.text) ''' 4、post请求 将文件以参数的方式传入 ''' url = 'http://172.25.8.167:1080/post' payload = {'file': open('report.xls', 'rb')} res_post = requests.post(url, data=json.dumps(payload)) print(res_post.text)
实例4:了解requests响应处理机制:
import requests parm = [('key1', 'value1'), ('key2', 'value3')] res_post = requests.post('http://172.25.8.167:1080/post', data=parm) print("\n以text格式处理返回响应结果", res_post.text) print("\n以json格式处理返回响应结果", res_post.json(), "\n") print("\n以二进制流格式处理返回响应结果", res_post.content, "\n") print("\n响应的URL:", res_post.url, "\n") print("\n响应的cookies:", res_post.cookies, "\n") print("\n响应的编码:", res_post.encoding, "\n") print("\n响应的http状态响应码:", res_post.status_code, "\n") print("\n响应的header:", res_post.headers, "\n")
实例5:封装(用于接口测试):
import requests class requests_run: ''' 封装requests,用于接口测试 ''' def requests_post(self, url, data, header): if header != None: res = requests.post(url=url, headers=header, data=data) else: res = requests.post(url=url, data=data) return res def requests_get(self, url, data, header=None): if header != None: res = requests.get(url=url, headers=header, params=data) else: res = requests.get(url=url, params=data) return res def requests_main(self, url, method, data=None, header=None): if method == 'post': res = self.requests_post(url, data, header) else: res = self.requests_get(url, data, header) return res class Http_Request: ''' 更简洁的封装 ''' @staicmethod def http_request(self,url, data, method, header=None): if method = 'post': res = requests.post(url, data, header) else: res = requests.get(url, data, header) return res
实例5:结合Excel实现简单的接口自动化
from requests_demon4 import RequestsRun from with_excel import with_excel #之前写的一个python读取excel的类 import json csyl = with_excel('requests_test.xlsx','Sheet1') csyl_new = csyl.setnull_todict() for i in csyl_new: print(f'第{i["id"]}测试用例开始执行') # print(i["url"], i["method"], i["data"]) url = i["url"] method = i["method"] if i["data"] == '': data = None res = RequestsRun().requests_main(url, method) else: data = eval(i["data"]) res = RequestsRun().requests_main(url, method, data) print(f'第{i["id"]}测试用例结果为:\n', json.dumps(res.json(), ensure_ascii=False, sort_keys=True, indent=2))
附:python读取Excel的操作
1 import pandas as pd 2 3 path = 'test.xlsx' 4 sheet_name = 'test_data' 5 ''' 6 pd.read_excel(io, sheet_name=0, header=0, names=None, index_col=None, usecols=None) 7 io:很明显, 是excel文件的路径+名字字符串 8 sheet_name:返回指定的sheet 9 如果将sheet_name指定为None,则返回全表 10 如果需要返回多个表, 可以将sheet_name指定为一个列表, 例如['sheet1', 'sheet2'] 11 name:如果没有表头, 可用此参数传入列表做表头 12 header:指定数据表的表头,默认值为0, 即将第一行作为表头 13 index_col:用作行索引的列编号或者列名,如果给定一个序列则有多个行索引。一般可以设定index_col=False指的是pandas不适用第一列作为行索引。 14 usecols:读取指定的列, 也可以通过名字或索引值 15 ''' 16 17 18 19 class with_excel: 20 21 #构造函数,调用类时就运行 22 def __init__(self, path=None, sheet_name=None): 23 if path and sheet_name: 24 self.path = path 25 self.sheet_name = sheet_name 26 else: 27 self.path = 'test.xlsx' 28 self.sheet_name = 'test_data' 29 self.data = self.open_excel() 30 31 #获取表格数据 32 def open_excel(self): 33 df = pd.read_excel(self.path, self.sheet_name) 34 return df 35 36 #获取表中单元格行数 37 def get_lines(self): 38 lines = self.data.shape[0]#获取了最后一行的行数 39 return lines 40 41 #获取一个单元格的内容(获取多行的内容) 42 def get_cell_data(self, row, col): 43 return self.data.iloc[row, col] 44 45 #将表格数据转字典 46 def to_dict(self): 47 test_data = [] 48 for i in self.data.index.values: # 获取与表头对应的字典数据 49 row_data = self.data.loc[i].to_dict() 50 test_data.append(row_data) 51 return test_data
总结:
利用python来做接口自动化,这里的过程只是练手代码而已,如果将这些代码都熟练的掌握了,那咱们就有做python接口自动化的基础了。