如果你不太明白这篇文章是做什么的,点击下方:
前方高能!!正文开始!!
1、在lib文件夹内创建sendrequest_py文件
2、新建方法send_requests:
主要逻辑为,参数apidata为字典格式,通过字典的建获取值,将值做判断是否为空,为空传None,不为空则传入相应数据
def send_requests(apidata):
"""
分析测试用例自带参数、发送请求
:param apidata: 测试用例
:return:
"""
try:
# 从读取的表格中获取响应的参数作为传递
method = apidata["get_type"]
url = apidata["url"]
# 判断字典内请求头是否为空
if apidata["header"] == '':
#返回None
header = None
else:
#将值处理后用做请求参数
header = eval(apidata["header"])
# 判断字典内测试数据是否为空
if apidata["data"] == "":
#返回None
body_data = None
else:
#将值处理后用做请求参数
body_data = eval(apidata["data"])
s = requests.session()
re = s.request(method=method, url='http://127.0.0.1:8000' + url, headers=header, json=body_data, verify=False) #将对应的数据填入相应位置返回res
return re
except Exception as error:
logging.error("错误信息", error)
写入如下代码测试结果(不然写一大堆最后执行不了很蛋疼!):
if __name__ == '__main__':
case_dict = {'id': 1.0, 'get_type': 'get', 'interface': '相加接口',
'title': '参数正常-成功', 'header': '', 'url': '/add',
'data': "{'a': 2, 'b': 1}",
'expected': "{'code': 0, 'msg': 'ok', 'value': 3}", 'code': 0,
'status': 200, 'msg': 'ok'}
re = send_requests(case_dict)
print(re.url)
print(re.json())
运行结果如下:
封装完成,上述代码中url可进一步封装,封装置setting内,在创建方法判断执行环境,返回相应的url(底部有补充!!!!!!)
封装log.py之前先创建setting.py,新增如下(找不到文件在哪的回第一章!)
import os
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) #项目根目录
LOG_PATH = os.path.join(PROJECT_ROOT, 'log', 'api_test.log') # 日志路径
3、lib文件创建__init__.py文件代码如下:
import logging
from lib.log import init_logging
# 环境切换 loc,dev,uat
surroundings = 'loc' #用来代替get_test_url方法的参数
init_logging()
logging.info("测试日志信息👇|{}环境".format(surroundings))
4、创建log.py代码如下,使用setting.py内的LOG_PATH代替路径:
import logging
from logging import handlers
def init_logging():
# 1 初始化日志器
logger = logging.getLogger()
# 2 设置日志等级
logger.setLevel(logging.INFO)
# 3 创建控制处理器
sh = logging.StreamHandler()
# 4 创建文件处理器 - LOG_PATH为setting.py内的变量
fh = logging.handlers.TimedRotatingFileHandler(filename=LOG_PATH, when='D', interval=1, backupCount=7,
encoding='utf-8')
fmt = "%(asctime)s %(levelname)s [%(name)s] [%(filename)s %(funcName)s:%(lineno)d] - [%(message)s]"
formatter = logging.Formatter(fmt)
# 6 将格式化器添加到处理器
sh.setFormatter(formatter)
fh.setFormatter(formatter)
# 7 将处理器添加到日志
logger.addHandler(sh)
logger.addHandler(fh)
写入如下代码测试结果(不然写一大堆最后执行不了很蛋疼!):
if __name__ == '__main__':
init_logging()
logging.info('——————————————你2020必暴富——————————————————')
返回结果如下,在log内生成文件,并打印信息:
以下是对url返回的补充
5、在setting.py文件内新增(找不到文件在哪的回第一章!!)
BASE_URL = "http://127.0.0.1:8000" # 本地url
BASE_URL_dev = 'http://127.0.0.1:8000' # 假装一下url不同
BASE_URL_uat = 'http://127.0.0.1:8000' # 假装一下url不同
在前往utils.py内创建返回URL地址的方法:
def get_test_url(msg):
"""
返回不同环境的rul地址
:param msg: loc:本地环境 uat:uat环境 dev:开发环境
:return: url
"""
if msg == 'dev':
return setting.BASE_URL_dev #读取setting.py文件内的变量
elif msg == 'uat':
return setting.BASE_URL_uat
elif msg == 'loc':
return setting.BASE_URL
下面直接将该方法替换写死的url、并打印出请求参数,下面是完整代码
import logging
import requests
from lib.utlis import get_test_url
def send_requests(apidata):
"""
分析测试用例自带参数、发送请求
:param apidata: 测试用例
:return:
"""
try:
# 从读取的表格中获取响应的参数作为传递
method = apidata["get_type"]
url = apidata["url"]
if apidata["header"] == '':
header = None
else:
header = eval(apidata["header"])
# 判断表内是否有测试数据
if apidata["data"] == "":
body_data = None
else:
body_data = eval(apidata["data"])
s = requests.session()
logging.info('请求参数:{}'.format(body_data))
re = s.request(method=method, url= get_test_url('loc') + url, headers=header, json=body_data)
return re
except Exception as error:
logging.error("错误信息", error)
日常验证:
if __name__ == '__main__':
case_dict = {'id': 1.0, 'get_type': 'get', 'interface': '相加接口',
'title': '参数正常-成功', 'header': '', 'url': '/add',
'data': "{'a': 2, 'b': 1}",
'expected': "{'code': 0, 'msg': 'ok', 'value': 3}", 'code': 0,
'status': 200, 'msg': 'ok'}
re = send_requests(case_dict)
print(re.url)
print(re.json())
运行结果如下:
运行成功,其实最后这一步比较多余,但是告诉大家的是这只是一个封装思路!所有的需求都可以通过封装一个个方法所解决!(其实还是在凑点字数 0-0 )
下章封装执行脚本和断言
点击不迷路,python接口自动化测试框架结构 ( 第四章)
非常感谢您的阅读,第一次写博客文章,写的不好的地方多度包含,欢迎大佬指出代码中的不足,共同提升、共同进步!(要源代码 点赞关注后+VX dengwoi )