丝路
我们这一章来阐述数据结果的效验,也就是断言
那么断言的方式主要分为3种
1、针对错误码和提示信息是否对应的效验,也就是我们预期的错误码返回的提示信息和实际错误码返回的提示信息是否一致
2、errorcode,只针对错误码进行效验,这个接口是否通过
3、json,针对json格式进行效验
这一章将在用例执行主函数代码实现
首先我们做针对错误码和提示信息是否对应的效验,也就是在我们本地,要有一个json文件,来维护管理我们的预期结果
我们就需要对照接口文档来整理我我们就预期结果
这个json文件呢,首先我们的需要通过一个url,来找到我们接口的预期结果,因为这个项目接口是单一接口,在实际的项目中,我们一定要注意每个接口的返回信息不一定是相同的
所以这部分的处理回在接口自动化中,工作量很大,但是后期的维护就相对很简单了,这里咱们就码好部分调用即可
这个串也送给大家,其实可以看明白我们的思路,通过url,获取动一个列表,这个列表中是一些键值对,如果预期结果是206901,它的message就要提示错误的type或text参数,实际结果是不是返回错误的type或text参数就代表这用例能否通过
{
"charconvert/change.from": [
{"206901": "错误的type或text参数"},
{"10001": "错误的请求KEY"},
{"10002": "该KEY无请求权限"},
{"10003": "KEY过期"},
{"10004": "错误的OPENID"},
{"10005": "应用未审核超时,请提交认证"},
{"10007": "未知的请求源"}
]
}
errorcode+message
那么上代码之前我们思考一下其中的逻辑,上点伪代码来让大家思路更加清晰一些
首先呢我们需要知道,我们对这个用例使用的哪一种效验方式,errorcode?errorcode+message?or json?
所以我们就要判断
if 使用的效验方式 == “errorcode+message”:
#我们就要知道我们的返回的错误码是啥子,返回的实际提示信息是什么?
返回的错误码 = 我们的响应结果.get(“errorcode的键名”)
实际提示信息 = 我们的响应结果.get(“message的键名”)
#到这里,就差一个预期的message,咱们拿到和实际提示信息来对比一下,你俩一样就说明,通过了,不一样,Failure。
到这,怎么获取到预期的message呢?
其实上边说过了,我们写一个方法来操作json文件,通过url,获取到预期的message即可,先上一下一段run_main的代码
# -*- coding: utf-8 -*-
# @Time : 2020/1/14 13:42
# @Author : Willam.zja
# @FileName: run_main.py
# @Software: PyCharm
# @Blog :https://blog.csdn.net/enemy_sprites
import os
import sys
sys.path.append(os.getcwd())
base_path = os.path.abspath(os.path.dirname(os.getcwd()))
from Utils.handle_excel import excel_method
from Utils.handle_ini import ReadIni
from Base.base_requests import request
import ast
class RunMain(object):
"""
用例执行的主函数
"""
def run_case(self):
#获取用例数
lines = excel_method.get_lines()
for i in range(lines-1):
data_list = excel_method.get_row_data(i+2)
# print(data_list)
is_run = data_list[ReadIni().get_int_value('is_run')]
if is_run == 'yes':
method = data_list[ReadIni().get_int_value('method')]
url = data_list[ReadIni().get_int_value('url')]
params = ast.literal_eval(data_list[ReadIni().get_int_value('params')])
res = request.run_main(method,url,params)
expect_method = data_list[ReadIni().get_int_value('expect_method')]
if excel_method == 'errorcode+message':
errorcode = res.get('error_code')
message = res.get('reason')
expect_message = ?
if __name__ == '__main__':
RunMain().run_case()
下边那个问号怎么搞定,来Utils写一个针对meesage+error的json文件的操作方法–进入正题
思路简单,加载json数据其实就是文件操作,打开with open打开文件,r可读模式,utf-8编码格式,其数据用json.load转化为json即可,加载完成后,只要对加载出的数据进行一个get值即可,写入也是同样的思路,打开文件,转化为字符串,write写入,上代码片
# -*- coding: utf-8 -*-
# @Time : 2020/1/14 15:34
# @Author : Willam.zja
# @FileName: handle_json.py
# @Software: PyCharm
# @Blog :https://blog.csdn.net/enemy_sprites
import os
import sys
sys.path.append(os.getcwd())
base_path = os.path.abspath(os.path.dirname(os.getcwd()))
from Utils.handle_excel import excel_method
from Utils.handle_ini import ReadIni
import json
class HandleJson(object):
def __init__(self,file_path=None):
if file_path == None:
self.file_path = '/'.join([base_path,'Config/errorcode_message.json'])
else:
self.file_path = file_path
def load_json(self):
"""
加载json数据
:return:
"""
with open(self.file_path,'r',encoding='UTF-8') as f:
return json.load(f)
def get_value(self,url):
"""
获取json数据下,指定url下的数据
:param url: 操作的接口url
:return: url下的操作数据
"""
data = self.load_json()[url]
return data
def write_json(self,data):
"""
向json文件中写入数据
:param data:
:return:
"""
data = json.dumps(data)
with open(self.file_path,'w') as f:
f.write(data)
if __name__ == '__main__':
print(HandleJson().get_value('charconvert/change.from'))
针对json的操作方法就写好了,现在要针对不同的预期结果做不同的处理
在Utils中封装一个针对预期结果的模块
import os
import sys
sys.path.append(os.getcwd())
base_path = os.path.abspath(os.path.dirname(os.getcwd()))
from Utils.handle_json import HandleJson
def handle_mr_json(url,errorcode):
errorcode = str(errorcode)
data = HandleJson(base_path+'/Config/errorcode_message.json').get_value(url)
if data != None:
return [i.get(errorcode) for i in data if i.get(errorcode)][0]
if __name__ == '__main__':
print(handle_mr_json('charconvert/change.from', 206901))
这里封装以了个方法,传入url,errorcode其实就是一个key,获取到相应的提示信息,那么这个提示信息我们就可以放在run_main中执行
有的小伙伴会说,不是4条用例吗,怎么就执行了一条呢
这就对了,因为我们测试用例中,只有一条使用了返回错误码对应提示信息的效验方式
json格式效验
首先呢,我们需要对比实际结果返回的json格式,和预期的json格式是否一样,那么就要判断键是否相同,这里python有个三方库,pip install deepdiff安装,用其中的方法来对比json格式,所以在效验之前,我们需要准备好预期的json结构,那么结构一般的接口中,正常的数据返回和异常的数据返回的json结构是不同的,所以我们就要判断,接口是success还是error,在这里我们先去做预期的接口数据
创建json文件,写入正向的格式与异常格式
{
"charconvert/change.from": [
{"success": {"error_code": 0, "reason": "Return Successd!", "instr": "csdn论坛Millet-接口自动化测试", "outstr": "csdn论坛Millet-接口自动化测试"}},
{"error": {"resultcode": "101", "reason": "KEY ERROR!", "result": [], "error_code": 10001}}
]
}
回到handle_result模块中,添加对比方法和对两个json格式对比效验的方法
def handle_json_json(url,status_code):
status_code = str(status_code)
data = HandleJson(base_path+'/Config/construction_result.json').get_value(url)
if data != None:
return [i.get(status_code) for i in data if i.get(status_code)][0]
def handle_constrast_json(dict1,dict2):
if isinstance(dict1,dict) and isinstance(dict2,dict):
cmp_dict = DeepDiff(dict1,dict2,ignore_order=True).to_dict()
if cmp_dict.get('dictionary_item_added'):
return False
else:
return True
return False
这里说一下deepdiff,两个json格式总格式效验,如果键和值发生了变化,则会给与相应的提示,根据提示判断,json格式是否变化,做了个判断,变化返回False,不变化返回True,写下来在run_main中调用
errorcode
直接在用例预期结果中填写返回码,与实际response中的返回码相等即通过用例