文章目录
写在前面: 我是
「软测小刘
」,这个昵称来源于我的生活,对测试保持激情,敢于探索 细心大胆。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。
这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。
用知识改变命运,让我们的家人过上更好的生活。
接口自动化测试框架封装实现
之前分析完了接口测试框架的设计与架构,下面我们就来一步一步的完成接口自动化测试框架的实现。
1、创建测试框架项目
为 Student Management System Interface testing framework
创建一个测试项目 SMSITF
。
项目名上右键 —> New —> Python Package —> 创建common目录。
同理创建
interface目录:存放接口的目录。
script目录:存放测试用例的目录。
Config目录:存放配置文件。配置一些常量,例如数据库的相关信息,接口的相关信息等。
Data目录:存放公共部分数据,比如测试数据,excel文件等等。
Log目录:存放logging日志信息。
Reports目录:存放接口测试报告目录。
创建好后如下图:
接下来我们要一步一步实现这个框架里边的功能。
Dictionary
和Python Package
目录说明:Dictionary
在Pycharm中就是一个文件夹,放置资源文件,该文件夹其中并不包含__init.py__
文件。Python Package
文件夹会自动创建__init.py__
文件,换句话说Python Package
就是创建一个目录,其中包括一组模块和一个__init.py__
文件。
2、封装发送请求方法
一些公共的方法,要写在common目录中,主要是封装使用requests库发送请求的方法。
其他所有的公共的方法都可以封装在common目录中。
"""
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))
3、封装获取接口返回结果指定内容
该文件是封装处理返回值结果的一些方法。
我们需要用到一个Python中的模块 JsonPath
,下面就先来介绍一下 JsonPath
模块。
(1) JsonPath
介绍
用来解析多层嵌套的Json数据。
JsonPath
是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括: Javascript
, Python
, PHP
和 Java
。
JsonPath
对于 JSON 来说,相当于 XPath 对于 XML。
(2) JsonPath
安装
安装方法: pip install jsonpath
使用方法如下:
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} 这种方式比较通用
"""
JsonPath
官方文档:http://goessner.net/articles/JsonPath
github上有它的应用:https://github.com/json-path/JsonPath(Java中的 JsonPath
使用文档)
(3)JsonPath与XPath语法对比
Json结构清晰,可读性高,复杂度低,非常容易匹配,下表中对应了XPath的用法。
XPathJSONPath描述 /
$
根节点 .
@
现行节点 /
.
or []
取子节点 ..
n/a取父节点,Jsonpath未支持 //
..
就是不管位置,选择所有符合条件的条件 *
*
匹配所有元素节点 @
n/a根据属性访问,Json不支持,因为Json是个Key-value递归结构,不需要属性访问。 []
[]
迭代器标示(可以在里边做简单的迭代操作,如数组下标,根据内容选值等)| [,]
支持迭代器中做多选。 []
?()
支持过滤操作.n/a ()
支持表达式计算 ()
n/a分组,JsonPath不支持
(4)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))