python接口自动化基本流程
接口自动化
本质:通过requests和Excel(数据库)对用例进行批量的自动化回归测试。
接口自动化测试基本流程:
- 读取execl 处理数据
- 数据驱动测试,传入数据(pytest中的参数化)
- 处理请求,处理数据依赖
- 断言 用到deepdiff
- 生成测试报告/打包
- 加日志
- 发送测试报告 allure
环境:
Test session starts (platform: win32, Python 3.6.0, pytest 4.6.11, pytest-sugar 0.9.4)
rootdir: D:\pycharm2018\project\auto_tests, inifile: pytest.ini, testpaths: ./scripts
plugins: allure-pytest-2.8.29, cov-2.10.1, html-3.1.1, metadata-1.11.0, sugar-0.9.4
测试报告实现效果:
关于Excel
操作Excel:https://www.cnblogs.com/Neeo/articles/11650149.html
import xlrd
from conf import settings
book = xlrd.open_workbook(settings.FILE_PATH)
sheet = book.sheet_by_index(0)
# book.sheet_by_name('通用接口')
# print(sheet.nrows, sheet.ncols) # 获取所有行和列数
# 获取指定行
# print(sheet.row_values(0))
# print(sheet.row_values(1))
# 获取指定列
# print(sheet.col_values(0))
l = []
title = sheet.row_values(0)
print(title)
for row in range(1, sheet.nrows):
l.append(dict(zip(title, sheet.row_values(row))))
print(l)
如何处理数据依赖
在Excel中编写测试用例的时候:
- 被依赖的接口用例写在上面
- 对于依赖的字段设置规则:
- {"token":"${case_001>request_data>token}$"} #用例名/数据源/具体数据字段
jsonpath-rw
根据规则 token.data.xx 从字典中找到具体的值value。
-
前提:接口自动化测试中,存在依赖情况:test_02的某个请求参数的值,需要依赖test_01返回结果中某个字段的数据,所以就先需要拿到返回数据中特定字段的值。这里使用到python中jsonpath-rw库
官方文档:https://pypi.python.org/pypi/jsonpath-rw (更多jsonpath的语法请点击链接)
1.下载安装
pip install jsonpath-rw
2.导入
from jsonpath_rw import jsonpath,parse
3.例子介绍
1.返回的match数据,但我们想要的是value数据
jsonpath_expr = parse('foo[*].baz')
data = {'foo': [{'baz': 'news'}, {'baz': 'music'}]}
print([match for match in jsonpath_expr.find(data)])
运行结果:
[DatumInContext(value='news', path=Fields('baz'), context=DatumInContext(value={'baz': 'news'}, path=<jsonpath_rw.jsonpath.Index object at 0x025CA850>, context=DatumInContext(value=[{'baz': 'news'}, {'baz': 'music'}], path=Fields('foo'), context=DatumInContext(value={'foo': [{'baz': 'news'}, {'baz': 'music'}]}, path=This(), context=None)))), DatumInContext(value='music', path=Fields('baz'), context=DatumInContext(value={'baz': 'music'}, path=<jsonpath_rw.jsonpath.Index object at 0x025CA770>, context=DatumInContext(value=[{'baz': 'news'}, {'baz': 'music'}], path=Fields('foo'), context=DatumInContext(value={'foo': [{'baz': 'news'}, {'baz': 'music'}]}, path=This(), context=None))))]
2.获取匹配的数据match.value
jsonpath_expr = parse('foo[*].baz')
data = {'foo': [{'baz': 'news'}, {'baz': 'music'}]}
print([match.value for match in jsonpath_expr.find(data)])运行结果:['news', 'music']
3.match.value返回数据是一个list,我们要获取特定的值
jsonpath_expr = parse('foo[*].baz')
data = {'foo': [{'baz': 'news'}, {'baz': 'music'}]}
print([match.value for match in jsonpath_expr.find(data)][0])
运行结果:
news
单元测试框架
pytest
关于cookies处理
第一种
借鉴postman的cookies管理器,即每个请求都监测响应结果是否有cookies返回,如果有,就保存,以域名的形式保存该cookies
如果有同域名的请求,就自动在headers中携带该cookies
第二种
我们在请求中,判断响应结果中是否返回了cookis,如果返回了,就保存到当前的用例对象中,该对象就是一个大的字典。将cookies和值保存为一个key value
谁要用,就来拿该参数
关于urllib
参考:https://www.cnblogs.com/Neeo/articles/11520952.html
如何删除一个非空目录
用shuitil
import shutil
'''
shutil模块对文件和文件集合提供了许多高级操作。特别是,提供了支持文件复制和删除的功能
'''
# shutil.copy(src, dst) # 拷贝文件
# shutil.move(src, dst) # 移动目录或者文件
# shutil.rmtree(path) # 递归删除目录,无法直接删除文件
# shutil.make_archive(base_name, format('zip')) # 将目录或者文件以指定格式压缩
# shutil.unpack_archive(filename, extract_dir) # 解压缩
# see also: https://docs.python.org/3/library/shutil.html
关于生成测试报告的命令
参考:https://docs.python.org/zh-cn/3/library/subprocess.html
关于打包
参考:https://www.cnblogs.com/Neeo/articles/11934072.html
日志
参考:https://www.cnblogs.com/Neeo/articles/10951734.html#示例