絲路
我們這一章來闡述數據結果的效驗,也就是斷言
那麼斷言的方式主要分爲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中的返回碼相等即通過用例