python接口自动化测试实战( 第五章)
2019-07-02 本文已影响14人
6780441d2bcc
如果你不太明白这篇文章是做什么的,点击下方进入介绍篇:
点击跳转到介绍篇,你可以知道自己能收获什么,和将要做的功能点和是否值得学习,别再迷茫了,不日进,则日退,学习才是你应该做的事情。
进入介绍篇了解你将要走的路:python接口自动化测试(第一章)
开始改变人生之旅,不在被开发嫌弃,不在害怕面试没有亮点,没有竞争力。
上一章已经可以把element相关接口的配置文件读取出来了,接下来咱们读取testcase文件:
文件下载地址可以加qq群进行获取,也可以通过下面的开源项目地址,把文件提取出来
在上一篇文章内,咱们也将把表格测试数据,转换成自己想要的内容,给做到了
已经跟着做到这一步的同学,是不是感觉略有小成呢?
数据转换的工作咱们已经做的差不多了
接下来,咱们开始封装requests
import requests? 引用包,没有安装的同学可以使用 pip install??requests 进行安装,工具内也可以直接安装
在control包下增加log.py和httpcaps.py文件
image咱们在utils.py下增加一个函数,用来创建文件工具函数
# 判断当前目录是否存在
def mkdir(p):
path = Path(p)
# 如果文件不存在 则创建
if not path.is_dir():
path.mkdir()
log.py代码如下:
import logging
import datetime
from pathlib import Path
import sys
from control.utils import mkdir
# 获得当前的时间
def today():
now = datetime.datetime.now()
return now.strftime('%Y%m%d')
# 获取logger实例,如果参数为空则返回root logger
logger = logging.getLogger("seautotest")
# 指定logger输出格式
formatter = logging.Formatter(
'%(asctime)s [%(levelname)s] %(filename)s line:%(lineno)d: %(message)s')
# 创建log文件夹
mkdir('log')
# 文件日志
log_file = str(Path('log') / '{}.log'.format(today()))
file_handler=logging.FileHandler(log_file, mode='a', encoding='utf-8', delay=False)
# file_handler = logging.FileHandler(filename=log_file, encoding="utf-8")
file_handler.setFormatter(formatter) # 可以通过setFormatter指定输出格式
# 控制台日志
console_handler = logging.StreamHandler(sys.stdout)
console_handler.formatter = formatter # 也可以直接给formatter赋值
# 为logger添加的日志处理器
logger.addHandler(file_handler)
logger.addHandler(console_handler)
# 指定日志的最低输出级别,默认为WARN级别
# DEBUG,INFO,WARNING,ERROR,CRITICAL
logger.setLevel(logging.INFO)
开始封装httpcaps.py
import requests
from control.log import logger
from control.utils import iscompare_json, writetoken
def htpp_requests(step, junit, sort='get'):
data = step['data'].replace("\n", "")
http_type, parmars = datatating(data)
# 记录为何不通过
content = ''
# 记录是否通过
list_record = []
if http_type == 'headers':
httrequst = getattr(requests, sort)(step['element'], headers=eval(parmars))
else:
httrequst = getattr(requests, sort)(step['element'], eval(parmars))
status = httrequst.status_code
# 1.接口不等于200,不进行验证和断言
if status != 200:
logger.error('接口出错了%s' % status)
return
# 获得接口的返回值
response = httrequst.json()
expected = step['expected']
testdot = step['testdot']
# 如果是登录的接口,将登录的token写入文本
if testdot in ('登录接口验证'):
logger.info(response['data']['token'])
writetoken(response['data']['token'])
# 2.验证断言内容 断言只有在预期结果写了#('xxx','xxx')这种才会进行
if '#' in step['expected']:
# 1预期结果 2需要断言的内容 是元祖类型 ,返回:断言通过 返回'' ,反之返回不通过的字段
is_as_pass = asset_content(expected, response)
# 通过
if is_as_pass == '':
content += '断言通过'
pass
# 不通过
else:
list_record.append(1)
content += '断言不通过%s' % is_as_pass
# 3.验证返回值json格式
result = iscompare_json(eval(expected), response)
if result == 'Pass':
content += '对比格式通过'
else:
list_record.append(1)
content += 'json对比格式不通过'
if len(list_record) >= 1:
step['score'] = 'Fail'
junit.failure('testdot:' + step['testdot'] + '-' + 'step:' + step['no'] + '-' + 'element:' + step[
'element'] + '-' + ', %s' % content)
else:
step['score'] = 'Pass'
step['_resultinfo'] = content
step['output'] = response
logger.info(step['element'])
logger.info(response)
return step
# 处理json类型和参数
def datatating(data):
if data.strip():
http_info = data.split('=', 1)
# 获得类型
http_type = http_info[0]
# 获得请求的参数
parmars = http_info[1]
else:
# 获得类型
http_type = 'parmars'
# 获得请求的参数
parmars = "{' ': ' '}"
return http_type, parmars
# 如果有#号将进行处理,没有不处理
def affirm(expected):
# 返回的是list
ex_list = expected.split('#')
# 0代表是预期结果,1是代表是断言的内容
# eval处理是元祖类型
return ex_list[0], eval(ex_list[1])
def asset_content(expected, response):
# 处理预期结果的内容,切割出来断言
# 1.是预期结果 2.是需要断言的内容 元祖类型
expected, astent = affirm(expected)
fail_tent = ''
for t in astent:
if t not in str(response):
fail_tent += '接口没有此值:%s,' % t
return fail_tent
封装完成后,咱们调用试一下看看如何,因为公司的接口不方便开放,所以只能自己动手写一个了,目录下增加这个py文件
import flask, json
server = flask.Flask(__name__) # __name__代表当前的python文件。把当前的python文件当做一个服务启动
@server.route('/index', methods=['get', 'post']) # 第一个参数就是路径,第二个参数支持的请求方式,不写的话默认是get
def index():
res = {'msg': '这是我开发的第一个接口', 'msg_code': 0}
return json.dumps(res, ensure_ascii=False)
server.run(port=8888, debug=True, host='127.0.0.1')
先运行httptunn.py文件
开始调试httpcaps.py代码增加如下
if __name__ == '__main__':
step = {'no': '1', 'testdot': '获取验证码功能验证', 'keyword': 'API', 'page': '',
'element': 'http://127.0.0.1:8888/index',
'data': "parmars={'phone': '17547817934', 'type': '1'}",
'expected': "{'msg': '这是我开发的第一个接口', 'msg_code': 0}", 'output': {'msg': '这是我开发的第一个接口', 'msg_code': 0},
'score': 'Pass', 'remark': '', '_keyword': 'API', '_element': '获取短信验证码',
'_expected': "{'msg': '这是我开发的第一个接口', 'msg_code': 0}", '_output': ''}
print(htpp_requests(step, 'get'))
运行截图如下:
image小伙伴如果你运行失败了,出现了错误,将下一章节进行解决你现在的问题哦
遇到报错不要慌,总是会有解决办法的~
接口自动化第六章,开始继续学习吧~
源码下载地址复制地址打开,不然会没有权限:https://gitee.com/zhangmeng1314/seautotet-public.git
感谢您的阅读,本人是希望能帮助到想进步学习的同学,大佬勿喷,我会一直维护此项目争取做的更好,我也是一个小白,希望和大家一起成长,第一次写博客文章,大家有意见感觉写的不好不清楚,评论区留言都可以的哦,我会用最简单的方式去解答您的问题,谢谢
qq群:234922431