写在前面:我是「软测小刘」,这个昵称来源于我的生活,对测试保持激情,敢于探索细心大胆。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。这博客是对自己学习的一点点总结及记录,如果您对Java、算法感兴趣,可以关注我的动态,我们一起学习。
用知识改变命运,让我们的家人过上更好的生活。
接口自动化测试框架封装实现
之前分析完了接口测试框架的设计与架构,下面我们就来一步一步的完成接口自动化测试框架的实现。
创建测试框架项目
同理创建
创建好后如下:接下来我们要一步一步实现这个框架里边的功能。
封装发送请求方法
'''
send_method.py 文件说明:
1,封装接口请求方式
根据项目接口文档提供的内容进行封装
不同的项目,sendmethod也不太一样,如请求体格式等。
2.封装思路-结合接口三要素
请求方式+请求地址
请求参数
返回值
3.以学生管理系统SMS为例:
结合学生管理系统项目的接口文档,封装SendMethod类
'''
import requests
import json
class SendMethod:
'''
结合学生管理系统SMS,请求方式包括如下:
get ---> parmas标准请求参数
post--->请求参数类型 json
put --->请求参数类型 json
delete ---> parmas标准请求参数
'''
@staticmethod
def send_method(method, url, parmas=None, json=None):
'''
封装适用于学生管理系统项目的接口请求
:param method: 请求方式
:param url: 请求地址
:param parmas: get和delete请求参数
:param json: post和put请求参数
:param headers: 请求头
:return:
'''
if method == 'get' or method == 'delete':
response = requests.request(method=method, url=url, params=parmas)
elif method == 'post' or method == 'put':
response = requests.request(method=method, url=url, json=json)
else:
response = None
print('请求方式不正确')
if method == 'delete':
return response.status_code
else:
return response.json()
@staticmethod
def json_2_python(res):
'''
格式化返回数据
:param res:接口返回的数据
:return:
'''
return json.dumps(res, indent=2, ensure_ascii=False)
if __name__ == '__main__':
method = 'post'
url = 'http://127.0.0.1:8000/api/departments/'
data = {
'data': [
{
'dep_id': 'T02',
'dep_name': '接口测试学院',
'master_name': 'Test-Master',
'slogan': 'Here is Slogan'
}
]
}
res = SendMethod.send_method(method=method, url=url, json=data)
print(SendMethod.json_2_python(res))
封装获取接口返回结果指定内容
该文件是封装处理返回值结果的一些方法。
我们需要用到一个Python中的模块JsonPath,下面就先来介绍一下JsonPath模块。
JsonPath介绍
用来解析多层嵌套的Json数据。
JsonPath是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript,Python,PHP和Java。
JsonPath对于JSON来说,相当于XPath对于XML。
JsonPath安装
安装方法:pipinstalljsonpath
使用方法如下:
import jsonpath模块
res = jsonpath.jsonpath(response, f'$..{keyword}')[0]
'''
jsonpath方法说明
jsonpath(obj, expr, result_type='VALUE', debug=0, use_eval=True):
# obj表是要处理的json对象。
# expr是jsonpath匹配表达式。$..{keyword} 这种方式比较通用
'''
github上有它的应用:https://githucom/json-path/JsonPath
JsonPath与XPath语法对比
Json结构清晰,可读性高,复杂度低,非常容易匹配,下表中对应了XPath的用法。
根节点.@
现行节点/.
or[]
取子节点..
n/a取父节点,Jsonpath未支持//..
就是不管位置,选择所有符合条件的条件**
匹配所有元素节点@
n/a根据属性访问,Json不支持,因为Json是个Key-value递归结构,不需要属性访问。[][]
迭代器标示|[,]
支持迭代器中做多选。[]?()
支持过滤操作.n/a()
支持表达式计算()
n/a分组,JsonPath不支持
getKeyword_forResult.py文件实现
'''
getKeyword_forResult.py文件说明:
1.作用
在接口返回值中,通过关键获取获取对应字段内容
2,前提:需要安装一个库:jsonpath库
安装jsonpath : pip install jsonpath
使用jsonpath模块进行处理更加方便
'''
import jsonpath
class GetKeyword:
@staticmethod
def get_keyword(response: dict, keyword):
'''
通过关键字获取对应返回值,如果有多个值,只返回第一个,
如果关键字不存在,返回False。
:param:response 数据源 字典格式
:param:keyword 要获取的字段
:return:
'''
try:
return jsonpath.jsonpath(response, f'$..{keyword}')[0]
except:
print('关键字不存在')
@staticmethod
def get_keywords(response: dict, keyword):
'''
通过关键字获取一组数据
:param response: 数据源 dict格式
:param keyword: 如果关键字不存在,返回False
:return:
'''
try:
return jsonpath.jsonpath(response, f'$..{keyword}')
except:
print('关键字不存在')
if __name__ == '__main__':
response = {
'count': 2,
'next': '下一页',
'previous': None,
'results': [
{
'dep_id': '10',
'dep_name': 'tester_10',
'master_name': 'master_10',
'slogan': '随便'
},
{
'dep_id': '11',
'dep_name': 'tester_11',
'master_name': 'master_11',
'slogan': '随便'
}
]
}
keyword = 'dep_id'
print(GetKeyword.get_keywords(response, keyword))
文章为作者独立观点,不代表 股票程序化软件自动交易接口观点