[接口测试-实战]02 py+requests实战
2017-08-23 本文已影响259人
亭子青年
来自一个把孩子丢给奶奶带,自己来写博客的宝妈。大家好,我是亭子,还是那个有态度的tester。
最近在跟“大婶”的一个关于接口测试的课程,课程中讲解的项目主要以py2+mysql+httplib方式进行,而我本机使用的是py3+requests的环境,所以,我就跟着“大婶”的思路来使用自己的环境来进行实战,才有了《接口测试-实战》的这一系列文章。下面是我这一系列文章的目录,欢迎大家指正。
文章目录
- 简介
- 代码
简介
这篇文章依旧是实战文,也是《接口测试-实战》系列的第二篇文章,记录的是关于requests的实战,实战内容主要是对requests进行二次封装,方便使用,这里主要写了三个文件“config.py”,"ophttp.py","optool.py",下面依次对每个文件进行简单说明
(1) config.py:配置文件,将项目需要的一些配置信息存放在这个文件里,方便统一管理,例如database的信息,接口的base_url的信息等
(2) optool.py:封装的需要使用的一些简单函数,比如拼接url的函数,因为不知道把这些函数放在什么位置,索性单独把他们分离出来。
(3) ophttp.py:重头戏,对requests库进行封装,封装之后只提供一个方法给外部调用,这个方法在会根据你指定的发送请求的方式(get、post)来执行代码,那么我们在访问http接口的时候,不论是get协议还是post协议,无论是否你带什么参数等,都直接调用这一个方法,简单方便,具体实现请看代码,代码中注释比较多
代码
这个文件就不解释了
# config.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
'''
@author:ht
@desc:配置文件,主要配置一些主要数据,供代码调用
'''
environ = {"base_url":"http://httpbin.org",'timeout':20} #接口基本url
这个文件我还是不解释了
#optool.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
'''
@author:ht
@desc:常用函数封装
'''
from config import environ
import json
#拼接url
def join_url( endpoint):
'''
拼接url
:param endpoint:
:return:
'''
return "/".join([environ.get("base_url"), endpoint])
# 格式化json,返回字符串对象
def better_show_json(json_str):
#将json对象准换为字符串并格式化
return json.dumps(json_str,indent=4)
if __name__ == "__main__":
pass
下面的代码中注释好多的
#ophttp.py
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
'''
@author:ht
@desc:
requests库的再封装
根据入参的method发送http请求,返回结果
'''
import requests
from mylogging import mylogger
from optool import *
class OpHTTP:
#get请求,私有方法,
def __get(self,url,params=None,**kwargs):
'''
根据传入的数据进行get请求调用
:param url:请求url地址
:param params:get参数
:param kwargs:其他参数
:return:返回的是一个dict类型的数据
(1)200:请求正常,返回json格式的数据
格式:result = {"resultCode": 200, "message": "请求成功,返回json格式的数据", "content": responce.json()}
(2)201:请求正常,返回string类型的数据
格式: result = {"resultCode": 201, "message": "请求成功,返回string格式的数据","content": responce.text}
(3)300:response的status code 不等于200,content为空字符串
格式:result = {"resultCode": 300, "message": "接口请求的状态码错误-非200", "content": ""}
(4)400:请求过程出现异常,content为空字符串
格式:result = {"resultCode": 400, "message": "接口请求过程出现异常", "content": ""}
'''
try:
responce = requests.get(url,params,timeout=environ.get("timeout"),**kwargs)
if responce.status_code == 200:
#判断返回的结果是否是json格式的数据:通过headers的Content-Type来获取接口返回数据格式
#如果是json格式的数据,那么返回包含json对象的结果,否则返回content
if "application/json" in responce.headers.get("Content-Type"):
result = {"resultCode":200,"message":"请求成功,返回json格式的数据","content":responce.json()}
else:
result = {"resultCode":201,"message":"请求成功,返回string格式的数据",
"content":responce.text} #responce.text:根据接口返回的信息,会自动将原始数据转换成字符串类型的数据,格式是根据headers里面来转的
else:
result = {"resultCode": 300, "message": "接口请求的状态码错误-非200", "content": ""}
except BaseException as e:
mylogger.info("[http_requests_get_info] - url=%s,params=%s,**kwargs=%s"%(url,params,kwargs)) #打印出get请求的参数信息
mylogger.exception(e)
result = {"resultCode": 400, "message": "接口请求过程出现异常", "content": ""}
finally:
return result
#post方法,私有方法
def __post(self,url, data=None, json=None, **kwargs):
'''
根据传入的数据进行post请求调用
:param url:请求url地址
:param data:参数
:param json:json格式的参数
:param kwargs:其他参数
:return:返回的是一个dict类型的数据
(1)200:请求正常,返回json格式的数据
格式:result = {"resultCode": 200, "message": "请求成功,返回json格式的数据", "content": responce.json()}
(2)201:请求正常,返回string类型的数据
格式: result = {"resultCode": 201, "message": "请求成功,返回string格式的数据","content": responce.text}
(3)300:response的status code 不等于200,content为空字符串
格式:result = {"resultCode": 300, "message": "接口请求的状态码错误-非200", "content": ""}
(4)400:请求过程出现异常,content为空字符串
格式:result = {"resultCode": 400, "message": "接口请求过程出现异常", "content": ""}
'''
try:
responce = requests.post(url, data=data, json=json, timeout=environ.get("timeout"), **kwargs)
if responce.status_code == 200:
if "application/json" in responce.headers.get("Content-Type"):
result = {"resultCode": 200, "message": "请求成功,返回json格式的数据", "content": responce.json()}
else:
result = {"resultCode": 201, "message": "请求成功,返回string格式的数据",
"content": responce.text} # responce.text:根据接口返回的信息,会自动将原始数据转换成字符串类型的数据,格式是根据headers里面来转的
else:
result = {"resultCode": 300, "message": "接口请求的状态码错误-非200", "content": ""}
except BaseException as e:
mylogger.info("[http_requests_post_info] - url=%s,params=%s,json=%s,kwargs=%s]"%(url,data,json,kwargs)) #打印出post请求的参数信息
mylogger.exception(e)
result = {"resultCode": 400, "message": "接口请求过程出现异常", "content": ""}
finally:
return result
#发送http请求,根据你传入的method参数决定执行get还是post请求
def send_request(self,url,method="post",params=None,data=None,json=None,**kwargs):
'''
根据你传入的method参数决定执行get还是post请求
:param url: 接口地址
:param method: post(默认)或者get,小写,如果传入post,则使用post的方式发送http请求,如果传入get,则使用get的方式发送请求
:param params: dict类型的参数(还有其他类型等),使用get(带参数)方式发送http请求的时候需要传入,默认None
:param data: dict类型的参数,默认为None,使用post(带参数)方式发送http请求的时候传入
:param json: json格式的参数,默认为None,使用post(带参数)方式发送http请求的时候传入
:param kwargs:---headers:cookies:auth:timeout(本类已经在配置文件中进行读取):allow_redirects:proxies:stream
:return:返回的是一个dict类型的数据
(1)200:请求正常,返回json格式的数据
格式:result = {"resultCode": 200, "message": "请求成功,返回json格式的数据", "content": responce.json()}
(2)201:请求正常,返回string类型的数据
格式: result = {"resultCode": 201, "message": "请求成功,返回string格式的数据","content": responce.text}
(3)300:response的status code 不等于200,content为空字符串
格式:result = {"resultCode": 300, "message": "接口请求的状态码错误-非200", "content": ""}
(4) 301:调用自定义方法传入的参数有问题
格式:{"resultCode": 301, "message": "传入参数值错误", "content": ""}
(5)400:请求过程出现异常,content为空字符串
格式:result = {"resultCode": 400, "message": "接口请求过程出现异常", "content": ""}
'''
try:
if method=="post":
result = self.__post(url=url,data=data,json=json,**kwargs)
elif method == "get":
result = self.__get(url=url,params=params,**kwargs)
else:
result = {"resultCode": 301, "message": "传入参数值错误", "content": ""} #方法的入参有错误,无法正常解析
except BaseException as e:
result = {"resultCode": 400, "message": "接口请求过程出现异常", "content": ""}
mylogger.info("def send_request(self,url=%s,method=%s,params=%s,data=%s,json=%s,**%s)"%(url,method,params,data,json,kwargs))
mylogger.exception(e)
return result
if __name__ == "__main__":
#test
# 实例化一个封装的requests对象
myhttp = OpHTTP()
#构造接口的url地址
new_url = join_url("anything")
# # 请求不带参数的post方法
# result01 = myhttp.send_request("http://httpbin.org/anything")
# print(better_show_json(result01.get("content"))) #调用better_show_json方法,格式化输出,让json格式的数据输出更漂亮
#
# # 请求带参数的post方法
# data = {"name":"ht","password":"ting"}
# result02 = myhttp.send_request(url=new_url,data=data)
# print(better_show_json(result02.get("content")))
#
# # 请求带参数的post方法
# json = {"name":"ht","password":"ting"}
# result03 = myhttp.send_request(url=new_url,json=json)
# print(better_show_json(result03.get("content")))
#
# #请求不带参数的get方法
# result04 = myhttp.send_request(new_url,method="get")
# print(better_show_json(result04.get("content")))
#请求带参数的get方法
params = {"name":"ht","password":"ting"}
result05 = myhttp.send_request(new_url,method="get",params=params)
print(result05)
print(result05.get("resultCode"))
print(result05.get("message"))
print(better_show_json(result05.get("content")))
后记
感谢大婶的课程,感谢大婶帮我查看代码质量。
以后我们要在文章中来点心灵鸡汤可好。