1.从实际项目出发分析测试结果处理方法
假设我们已经获取了JSON数据
# user_data.json
{
"/api3/getbanneradvertver2": {
"status": 0,
"data": {
"banner": [{
"id": 2262,
"type": 6,
"type_id": 330,
"name": "\u524d\u7aef\u4e0b\u4e00\u4ee3\u5f00\u53d1\u8bed\u8a00TypeScript \u4ece\u57fa\u7840\u5230axios\u5b9e\u6218",
"pic": "http:\/\/szimg.caichenwang.com\/5cf721df09fc2be500000000.jpg",
"links": ""
}, {
"id": 1648,
"type": 6,
"type_id": 169,
"name": "Python3\u5165\u95e8\u673a\u5668\u5b66\u4e60 \u7ecf\u5178\u7b97\u6cd5\u4e0e\u5e94\u7528",
"pic": "http:\/\/szimg.caichenwang.com\/5d0ed2d9085bd6ed09000300.jpg",
"links": ""
}, {
"id": 1875,
"type": 6,
"type_id": 316,
"name": "\u4ece\u57fa\u7840\u5230\u5b9e\u6218 \u624b\u628a\u624b\u5e26\u4f60\u638c\u63e1\u65b0\u7248Webpack4.0",
"pic": "http:\/\/szimg.caichenwang.com\/5d0ed2ca086a9e6f09000300.jpg",
"links": ""
}, {
"id": 1999,
"type": 6,
"type_id": 342,
"name": "\u7eaf\u6b63\u5546\u4e1a\u7ea7\u5e94\u7528 Node.js Koa2\u5f00\u53d1\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u670d\u52a1\u7aef",
"pic": "http:\/\/szimg.caichenwang.com\/5ceb5d370955f30f09000300.jpg",
"links": ""
}, {
"id": 2158,
"type": 99,
"type_id": 0,
"name": "Spring Cloud\u5fae\u670d\u52a1\u5f00\u53d1\u5b9e\u8df5",
"pic": "http:\/\/img2.caichenwang.com\/5d088c4009bbebc009000300.jpg",
"links": "https:\/\/www.caichen.com\/read\/37"
}, {
"id": 1709,
"type": 6,
"type_id": 354,
"name": "Node.js\u5f00\u53d1\u4eff\u77e5\u4e4e\u670d\u52a1\u7aef \u6df1\u5165\u7406\u89e3RESTful API",
"pic": "http:\/\/szimg.caichenwang.com\/5d0ed27508f7d96909000300.jpg",
"links": ""
}],
"pic": [{
"pic": "http:\/\/www.caichen.com\/static\/img\/andriod\/pic\/actual_day@3x.png",
"pic_night": "http:\/\/www.caichen.com\/static\/img\/andriod\/pic\/actual_night@3x.png",
"type": 2
}, {
"pic": "http:\/\/www.caichen.com\/static\/img\/andriod\/pic\/path_day@3x.png",
"pic_night": "http:\/\/www.caichen.com\/static\/img\/andriod\/pic\/path_night@3x.png",
"type": 6
}, {
"pic": "http:\/\/www.caichen.com\/static\/img\/andriod\/pic\/question_day@3x.png",
"pic_night": "http:\/\/www.caichen.com\/static\/img\/andriod\/pic\/question_night@3x.png",
"type": 3
}, {
"pic": "http:\/\/www.caichen.com\/static\/img\/andriod\/pic\/note_day@3x.png",
"pic_night": "http:\/\/www.caichen.com\/static\/img\/andriod\/pic\/note_night@3x.png",
"type": 4
}, {
"pic": "http:\/\/www.caichen.com\/static\/img\/andriod\/pic\/discover_day@3x.png",
"pic_night": "http:\/\/www.caichen.com\/static\/img\/andriod\/pic\/discover_night@3x.png",
"type": 5
}]
},
"errorCode": 1001,
"errorDesc": "\u6210\u529f",
"timestamp": 1561269343507
}
-
处理JSON结果
1.有些接口不是单一的请求接口,比如我们商品进行评价,我需要判断这个用户是否完成订单,支付等。
2.在上边的格式中我们发现格式基本是字段固定
{ "/api3/.....": { "status": 0, # 状态代表成功失败,根据项目决定 "data": { "banner": [{ "id": ...., "type": ...., "type_id": ....., "name": "...", "pic": "....", "links": "..." } ..... ] }, "errorCode": ..., "errorDesc": "....", "timestamp": .... }3.编写excel测试用例
2.通过接口获取对应得code和message
需求:通过message和errorcode获取匹配的消息,根据url获取结果
# code_message.json
# 假设我访问每个端口,返回状态码与匹配信息如下,前期工作量较大
{
"api3/getbanneradvertver2":[
{"1006":"token error"},
{"1006":"用户名错误"},
{"1006":"密码错误"}
],
"api3/beta4":[
{"1006":"登陆成功"},
{"1006":"用户名错误"},
{"1006":"密码错误"}
],
"api3/getcourseintro":[
{"1006":"token error"},
{"10001":"用户名错误"},
{"10002":"密码错误"}
]
}
3.封装获取message的值
#handle_result.py
import sys
import os
import configparser
base_path = os.getcwd()
sys.path.append(base_path)
import json
from deepdiff import DeepDiff
from Util.handle_json import get_value
#print(get_value('api3/getbanneradvertver2',"/Config/code_message.json"))
'''[
{"1006,":"token error"},
{"10001":"用户名错误"},
{"10002":"密码错误"}
]'''
def handle_result(url,code):
data = get_value(url,"/Config/code_message.json")
if data !=None:
for i in data:
message = i.get(str(code))
if message:
return message
return None
def get_result_json(url,status):
data = get_value(url,"/Config/result.json")
if data !=None:
for i in data:
message = i.get(status)
if message:
return message
return None
def handle_result_json(dict1,dict2):
'''
校验格式
'''
if isinstance(dict1,dict) and isinstance(dict2,dict):
#dict1={"aaa":"AAA","bbb":"BBBB","CC":[{"11":"22"},{"11":"44"}]}
#dict2={"aaa":"123","bbb":"456","CC":[{"11":"111"},{"11":"44"}]}
cmp_dict = DeepDiff(dict1,dict2,ignore_order=True).to_dict()
if cmp_dict.get("dictionary_item_added"):
return False
else:
return True
return False
if __name__ == "__main__":
dict2 = {"aaa":"ddd","aaa1":"A1A","bbb":"BBBB","CC":[{"11":"22"},{"11":"44"}]}
dict1={"aaa":"AAA","bbb":"BBBB","aaa3":"A1A","CC":[{"11":"22"},{"11":"44"}]}
#print(handle_result('api3/getbanneradvertver2',"10002"))
#print(handle_result_json(dict1,dict2))
print(get_result_json("api3/newcourseskill","error"))
4.操作cookie
- 操作cookie文件设计
#cookie.json
{
"app": {
"aosid":"LKJALKSJDKAHH1K2JH3J12V3HJ123HASBVABNSD"
},
"web": {
"cookie":"123123123123123123123"
}
}
#handle_json.py
import sys
import os
import configparser
base_path = os.getcwd()
sys.path.append(base_path)
import json
from jsonpath_rw import jsonpath,parse
def read_json(file_name=None):
if file_name == None:
file_path = base_path+"/Config/user_data.json"
else:
file_path = base_path+file_name
with open(file_path,encoding='UTF-8') as f:
data = json.load(f)
return data
def get_value(key,file_name=None):
data = read_json(file_name)
return data.get(key)
#return data[key]
def write_value(data,file_name=None):
'''
{
url:{
}
}
'''
data_value = json.dumps(data)
if file_name == None:
path = base_path+"/Config/cookie.json"
else:
path = base_path+file_name
with open(path,"w") as f:
f.write(data_value)
if __name__ == "__main__":
data = {
"app":{
"aaaa":"bbbbbb"
}
}
- 更新cookie文件
#coding=utf-8
import sys
import os
import configparser
base_path = os.getcwd()
sys.path.append(base_path)
import json
from Util.handle_json import get_value,read_json,write_value
def get_cookie_value(cookie_key):
'''
获取cookie
'''
data = read_json("/Config/cookie.json")
return data[cookie_key]
def write_cookie(data,cookie_key):
'''
写入cookie
'''
data1 = read_json("/Config/cookie.json")
data1[cookie_key] = data
write_value(data1)
if __name__ == "__main__":
data = {
"aaaa":"1111111111111111"
}
print(write_cookie(data,'web'))
5.检查case是否通过
# handle_excel
#coding=utf8
import openpyxl
from openpyxl import workbook
import sys
from collections.abc import Iterable
import os
base_path = os.getcwd()
sys.path.append(base_path)
class HandExcel:
def load_excel(self):
'''
加载excel
'''
open_excel = openpyxl.load_workbook(base_path+"/Case/imooc.xlsx")
return open_excel
def get_sheet_data(self,index=None):
'''
加载所有sheet的内容
'''
sheet_name = self.load_excel().sheetnames
if index == None:
index = 0
data = self.load_excel()[sheet_name[index]]
return data
def get_cell_value(self,row,cols):
'''
获取某一个单元格内容
'''
data = self.get_sheet_data().cell(row=row,column=cols).value
return data
def get_rows(self):
'''
获取行数
'''
row = self.get_sheet_data().max_row
return row
def get_rows_value(self,row):
'''
获取某一行的内容
'''
row_list = []
for i in self.get_sheet_data()[row]:
row_list.append(i.value)
return row_list
def excel_write_data(self,row,cols,value):
'''
写入数据
'''
wb = self.load_excel()
wr = wb.active
wr.cell(row,cols,value)
wb.save(base_path+"/Case/imooc.xlsx")
def get_columns_value(self,key=None):
'''
获取某一列得数据
'''
columns_list = []
if key==None:
key = 'A'
columns_list_data = self.get_sheet_data()[key]
for i in columns_list_data:
columns_list.append(i.value)
return columns_list
def get_rows_number(self,case_id):
'''
获取行号
'''
num = 1
cols_data = self.get_columns_value()
for col_data in cols_data:
if case_id == col_data:
return num
num = num+1
return num
def get_excel_data(self):
'''
获取excel里面所有的数据
'''
data_list = []
for i in range(self.get_rows()):
data_list.append(self.get_rows_value(i+2))
return data_list
excel_data = HandExcel()
if __name__ == "__main__":
handle = HandExcel()
##print(handle.get_rows_number('imooc_001'))
print(handle.get_excel_data())
#run_main.py
#coding=utf-8
import sys
import os
base_path = os.getcwd()
sys.path.append(base_path)
from collections.abc import Iterable
from Util.handle_excel import excel_data
import json
from Util.handle_header import get_header
from Util.handle_result import handle_result,handle_result_json,get_result_json
from Util.handle_cookie import write_cookie,get_cookie_value
from Util.codition_data import get_data
from Base.base_request import request
#['imooc_001', '登陆', 'yes', None, 'login', 'post', '{"username":"111111"}', 'yes', 'message', None]
class RunMain:
def run_case(self):
rows = excel_data.get_rows()
for i in range(rows):
cookie=None
get_cookie = None
header = None
depend_data = None
data = excel_data.get_rows_value(i+2)
is_run = data[2]
if is_run == 'yes':
is_depend = data[3]
data1 = json.loads(data[7])
if is_depend:
'''
获取依赖数据
'''
depend_key = data[4]
depend_data = get_data(is_depend)
#print(depend_data)
data1[depend_key] = depend_data
method = data[6]
url = data[5]
is_header = data[9]
excepect_method = data[10]
excepect_result = data[11]
cookie_method = data[8]
if cookie_method == 'yes':
cookie = get_cookie_value('app')
if cookie_method == 'write':
'''
必须是获取到cookie
'''
get_cookie={"is_cookie":"app"}
if is_header == 'yes':
header = get_header()
res = request.run_main(method,url,data1,cookie,get_cookie,header)
#print(res)
code = str(res['errorCode'])
message = res['errorDesc']
if excepect_method == 'mec':
config_message = handle_result(url,code)
if message == config_message:
excel_data.excel_write_data(i+2,13,"通过")
else:
excel_data.excel_write_data(i+2,13,"失败")
excel_data.excel_write_data(i+2,14,json.dumps(res))
if excepect_method == 'errorcode':
if excepect_result == code:
excel_data.excel_write_data(i+2,14,"通过")
else:
excel_data.excel_write_data(i+2,13,"失败")
excel_data.excel_write_data(i+2,14,json.dumps(res))
if excepect_method == 'json':
if code == 1000:
status_str='sucess'
else:
status_str='error'
excepect_result = get_result_json(url,status_str)
result = handle_result_json(res,excepect_result)
if result:
excel_data.excel_write_data(i+2,13,"通过")
else:
excel_data.excel_write_data(i+2,13,"失败")
excel_data.excel_write_data(i+2,14,json.dumps(res))
if __name__ == "__main__":
run = RunMain()
run.run_case()
6.发起请求更新cookie代码
#base_request.py
import sys
import os
import configparser
base_path = os.getcwd()
sys.path.append(base_path)
import requests
import json
from Util.handle_cookie import write_cookie
from Util.handle_json import get_value
from Util.handle_init import handle_ini
class BaseRequest:
def send_post(self,url,data,cookie=None,get_cookie=None,header=None):
'''
发送post请求
'''
response = requests.post(url=url,data=data,cookies=cookie,headers=header)
if get_cookie !=None:
'''
{"is_cookie":"app"}
'''
cookie_value_jar = response.cookies
cookie_value = requests.utils.dict_from_cookiejar(cookie_value_jar)
write_cookie(cookie_value,get_cookie['is_cookie'])
res = response.text
return res
def send_get(self,url,data,cookie=None,get_cookie=None,header=None):
'''
发视get请求
'''
response = requests.get(url=url,params=data,cookies=cookie,headers=header)
if get_cookie !=None:
cookie_value_jar = response.cookie
cookie_value = requests.utils.dict_from_cookiejar(cookie_value_jar)
write_cookie(cookie_value,get_cookie['is_cookie'])
res = response.text
return res
def run_main(self,method,url,data,cookie=None,get_cookie=None,header=None):
'''
执行方法,传递method、url、data参数
'''
#return get_value(url)
base_url = handle_ini.get_value('host')
if 'http' not in url:
url = base_url+url
if method == 'get':
res = self.send_get(url,data,cookie,get_cookie,header)
else:
res = self.send_post(url,data,cookie,get_cookie,header)
try:
res = json.loads(res)
except:
print("这个结果是一个text")
print("--->",res)
return res
request = BaseRequest()
if __name__ == "__main__":
request = BaseRequest()
request.run_main('get','http://www.baidu.com/login',"{'username':'11111'}")
7.项目依赖数据
项目中通过Fiddler请求数据,查看哪些接口需要依赖数据,在excel中写明
#coding=utf-8
import sys
import os
base_path = os.getcwd()
sys.path.append(base_path)
from Util.handle_excel import excel_data
from jsonpath_rw import parse
import json
def split_data(data):
'''
拆分单元格数据
'''
#imooc_005>data:banner:id
case_id = data.split(">")[0]
rule_data = data.split(">")[1]
return case_id,rule_data
def depend_data(data):
'''
获取依赖结果集
'''
case_id = split_data(data)[0]
row_number = excel_data.get_rows_number(case_id)
data = excel_data.get_cell_value(row_number,14)
return data
def get_depend_data(res_data,key):
'''
获取依赖字段
'''
res_data = json.loads(res_data)
json_exe = parse(key)
madle = json_exe.find(res_data)
return [math.value for math in madle][0]
def get_data(data):
'''
获取依赖数据
'''
res_data = depend_data(data)
rule_data = split_data(data)[1]
return get_depend_data(res_data,rule_data)
if __name__ == "__main__":
#print(depend_data("imooc_007>data:banner:id"))
data = {
"a":"a1",
"b":"b1",
"c":[
{
"d":"d1"
},
{
"d":"d2"
}
]
}
key = 'c.[1].d'
print(get_depend_data(data,key))
8.最终数据验证
9.数据驱动和生成报告
#案例
#coding=utf-8
import sys
import os
base_path = os.getcwd()
sys.path.append(base_path)
import ddt
import unittest
from Util.handle_excel import excel_data
data = excel_data.get_excel_data()
#data = [[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7],[4,5,6,7,8]]
@ddt.ddt
class TestCase01(unittest.TestCase):
def setUp(self):
print("case开始执行")
def tearDown(self):
print("case执行结束")
@ddt.data(*data)
def test_01(self,data1):
#case编号 作用 是否执行 前置条件 依赖key url method data cookie操作 header操作 预期结果方式 预期结果 result 数据
function,is_run,condition,depend_key,url,method,request_data,cookie,header,execpet_method,execpet,result,result_data =data
#casename,casenum,isrun,method,cookie = data1
print("this is test case",function,is_run,condition,depend_key,url,method,request_data,cookie,header,execpet_method,execpet,result,result_data)
if __name__ == "__main__":
unittest.main()
#run_case_ddt.py
#coding=utf-8
import sys
import os
base_path = os.getcwd()
sys.path.append(base_path)
from collections.abc import Iterable
from Util.handle_excel import excel_data
import json
import unittest
#from ddt import ddt,data,file_data,unpack
import ddt
import HTMLTestRunner
from Util.handle_header import get_header
from Util.handle_result import handle_result,handle_result_json,get_result_json
from Util.handle_cookie import write_cookie,get_cookie_value
from Base.base_request import request
#['imooc_001', '登陆', 'yes', None, 'login', 'post', '{"username":"111111"}', 'yes', 'message', None]
data = excel_data.get_excel_data()
@ddt.ddt
class TestRunMain(unittest.TestCase):
@ddt.data(*data)
def testrun_case(self,data):
#rows = excel_data.get_rows()
#for i in range(rows):
cookie=None
get_cookie = None
header = None
#data = excel_data.get_rows_value(i+2)
is_run = data[2]
if is_run == 'yes':
method = data[5]
url = data[4]
data1 = data[6]
is_header = data[8]
excepect_method = data[9]
excepect_result = data[10]
codition = data[3]
if codition:
pass
cookie_method = data[7]
if cookie_method == 'yes':
cookie = get_cookie_value('app')
if cookie_method == 'write':
'''
必须是获取到cookie
'''
get_cookie={"is_cookie":"app"}
if is_header == 'yes':
header = get_header()
res = request.run_main(method,url,data1,cookie,get_cookie,header)
#print(res)
code = str(res['errorCode'])
message = res['errorDesc']
if excepect_method == 'mec':
config_message = handle_result(url,code)
self.assertEqual(message,config_message)
'''
if message == config_message:
excel_data.excel_write_data(i+2,12,"通过")
else:
excel_data.excel_write_data(i+2,12,"失败")
excel_data.excel_write_data(i+2,13,json.dumps(res))
'''
if excepect_method == 'errorcode':
self.assertEqual(excepect_result,code)
'''
if excepect_result == code:
excel_data.excel_write_data(i+2,12,"通过")
else:
excel_data.excel_write_data(i+2,12,"失败")
excel_data.excel_write_data(i+2,13,json.dumps(res))
'''
if excepect_method == 'json':
if code == 1000:
status_str='sucess'
else:
status_str='error'
excepect_result = get_result_json(url,status_str)
result = handle_result_json(res,excepect_result)
self.assertTrue(result)
'''
if result:
excel_data.excel_write_data(i+2,12,"通过")
else:
excel_data.excel_write_data(i+2,12,"失败")
excel_data.excel_write_data(i+2,13,json.dumps(res))
'''
def add_case():
case_path = os.path.join(base_path, "Run")
discover = unittest.defaultTestLoader.discover(case_path,pattern='test_run_*.py')
return discover
if __name__ == "__main__":
file_path = base_path+'/Report/report.html'
with open(file_path,'wb') as f:
runner = HTMLTestRunner.HTMLTestRunner(stream=f,title="this is test",description="Mushishi test")
runner.run(add_case())
f.close()
好了各位,以上就是这篇文章的全部内容了,能看到这里人啊,都是人才。
如果这个文章写得还不错,觉得「王采臣」我有点东西的话 求点赞👍求关注❤️求分享👥 对耿男我来说真的非常有用!!!
白嫖不好,创作不易,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
王采臣 | 文 【原创】
如果本篇博客有任何错误,请批评指教,不胜感激 !
更多精彩关注微信公众号,第一时间更新~