框架整体使用Python3+Requests+Excel:包含对实时token的获取
1、------base
-------runmethond.py
runmethond:对不同的请求方式进行封装
import json import requests requests.packages.urllib3.disable_warnings() class RunMethod: def post_main(self, url, data, header=None): res = None if header != None: res = requests.post(url=url, data=data, headers=header,verify=False) else: res = requests.post(url=url, data=data,verify=False) return res.json() def get_main(self, url, data=None, header=None): res = None if header != None: res = requests.get(url=url, params=data, headers=header, verify=False) else: res = requests.get(url=url, params=data, verify=False) return res.json() def run_main(self, method, url, data=None, header=None): res = None if method == 'Post': res = self.post_main(url, data, header) else: res = self.get_main(url, data, header) return json.dumps(res, indent=2, sort_keys=True, ensure_ascii=False) if __name__ == '__main__': url = 'http://httpbin.org/post' data = { 'cart': '11' } run = RunMethod() run_test = run.run_main(method="Post", url=url, data=data) print(run_test)
2、------data
------data_config.py
data_config:获取excel模块中数据
class global_val: Id = '0' request_name = '1' url = '2' run = '3' request_way = '4' header = '5' case_depend = '6' data_depend = '7' field_depend = '8' data = '9' expect = '10' result = '11' def get_id(): """获取case_id""" return global_val.Id def get_request_name(): """获取请求模块名称""" return global_val.request_name def get_url(): """获取请求url""" return global_val.url def get_run(): """获取是否运行""" return global_val.run def get_run_way(): """获取请求方式""" return global_val.request_way def get_header(): """获取是否携带header""" return global_val.header def get_case_depend(): """case依赖""" return global_val.case_depend def get_data_depend(): """依赖的返回数据""" return global_val.data_depend def get_field_depend(): """数据依赖字段""" return global_val.field_depend def get_data(): """获取请求数据""" return global_val.data def get_expect(): """获取预期结果""" return global_val.expect def get_result(): """获取返回结果""" return global_val.result
3、-----data
-----dependent_data.py
dependent_data:解决数据依赖问题
from util.operation_excel import OperationExcel from base.runmethod import RunMethod from data.get_data import GetData from jsonpath_rw import jsonpath, parse import json class DependentData: """解决数据依赖问题""" def __init__(self, case_id): self.case_id = case_id self.opera_excel = OperationExcel() self.data = GetData() def get_case_line_data(self): """ 通过case_id去获取该case_id的整行数据 :param case_id: 用例ID :return: """ rows_data = self.opera_excel.get_row_data(self.case_id) return rows_data def run_dependent(self): """ 执行依赖测试,获取结果 :return: """ run_method = RunMethod() row_num = self.opera_excel.get_row_num(self.case_id) request_data = self.data.get_data_for_json(row_num) # header = self.data.is_header(row_num) method = self.data.get_request_method(row_num) url = self.data.get_request_url(row_num) res = run_method.run_main(method, url, request_data) return json.loads(res) def get_data_for_key(self, row): """ 根据依赖的key去获取执行依赖case的响应然后返回 :return: """ depend_data = self.data.get_depend_key(row) response_data = self.run_dependent() return [match.value for match in parse(depend_data).find(response_data)][0]
4、-----data
-----get_data.py
get_data:获取excel数据
from util.operation_excel import OperationExcel from data import data_config from util.operation_json import OperationJson class GetData: """获取excel数据""" def __init__(self): self.opera_excel = OperationExcel() def get_case_lines(self): """获取excel行数,即case的个数""" return self.opera_excel.get_lines() def get_is_run(self, row): """获取是否执行""" flag = None col = int(data_config.get_run()) run_model = self.opera_excel.get_cell_value(row, col) if run_model == 'yes': flag = True else: flag = False return flag def is_header(self, row): """ 是否携带header :param row: 行号 :return: """ col = int(data_config.get_header()) header = self.opera_excel.get_cell_value(row, col) if header != '': return header else: return None def get_request_method(self, row): """ 获取请求方式 :param row: 行号 :return: """ # col 列 col = int(data_config.get_run_way()) request_method = self.opera_excel.get_cell_value(row, col) return request_method def get_request_url(self, row): """ 获取url :param row: 行号 :return: """ col = int(data_config.get_url()) url = self.opera_excel.get_cell_value(row, col) return url def get_request_data(self, row): """ 获取请求数据 :param row:行号 :return: """ col = int(data_config.get_data()) data = self.opera_excel.get_cell_value(row, col) if data == '': return None return data def get_data_for_json(self, row): """ 通过关键字拿到data数据 :param row: :return: """ opera_json = OperationJson() request_data = opera_json.get_data(self.get_request_data(row)) return request_data def get_expcet_data(self, row): """ 获取预期结果 :param row: :return: """ col = int(data_config.get_expect()) expect = self.opera_excel.get_cell_value(row, col) if expect == "": return None else: return expect def write_result(self, row, value): """ 写入结果数据 :param row: :param col: :return: """ col = int(data_config.get_result()) self.opera_excel.write_value(row, col, value) def get_depend_key(self, row): """ 获取依赖数据的key :param row:行号 :return: """ col = int(data_config.get_data_depend()) depend_key = self.opera_excel.get_cell_value(row, col) if depend_key == "": return None else: return depend_key def is_depend(self, row): """ 判断是否有case依赖 :param row:行号 :return: """ col = int(data_config.get_case_depend()) # 获取是否存在数据依赖列 depend_case_id = self.opera_excel.get_cell_value(row, col) if depend_case_id == "": return None else: return depend_case_id def get_depend_field(self, row): """ 获取依赖字段 :param row: :return: """ col = int(data_config.get_field_depend()) data = self.opera_excel.get_cell_value(row, col) if data == "": return None else: return data
5、-----dataconfig
-----case.xls
case.xls:用例数据
6、-----dataconfig
-----data.json
data.json:请求数据,根据自己实际业务,且与case层的请求数据列是关联的
{ "user": { "username": "1111111", "password": "123456" }, "filtrate": { "type_id": "2", "brand_id": "1", "model_id": "111" }, "search": { "page": "1", "keyword": "oppo", "type": "12" }, "token": { "token": "" }
7、-----dataconfig
-----token.json
token.json:实时自动将获取的token写入到该文件
{"data": {"token": "db6f0abee4e5040f5337f5c47a82879"}}
8、-----main
-----run_test.py
run_test:主运行程序
from base.runmethod import RunMethod from data.get_data import GetData from util.common_util import CommonUtil from data.dependent_data import DependentData # from util.send_email import SendEmail from util.operation_header import OperationHeader from util.operation_json import OperationJson class RunTest: def __init__(self): self.run_method = RunMethod() self.data = GetData() self.com_util = CommonUtil() # self.send_email = SendEmail() def go_on_run(self): """程序执行""" pass_count = [] fail_count = [] res = None # 获取用例数 rows_count = self.data.get_case_lines() # 第一行索引为0 for i in range(1, rows_count): is_run = self.data.get_is_run(i) if is_run: url = self.data.get_request_url(i) method = self.data.get_request_method(i) request_data = self.data.get_data_for_json(i) expect = self.data.get_expcet_data(i) header = self.data.is_header(i) depend_case = self.data.is_depend(i) if depend_case != None: self.depend_data = DependentData(depend_case) # 获取依赖的响应数据 depend_response_data = self.depend_data.get_data_for_key(i) # 获取依赖的key depend_key = self.data.get_depend_field(i) # 更新请求字段 request_data[depend_key] = depend_response_data # 如果header字段值为write则将该接口的返回的token写入到token.json文件,如果为yes则读取token.json文件 if header == "write": res = self.run_method.run_main(method, url, request_data) op_header = OperationHeader(res) op_header.write_token() elif header == 'yes': op_json = OperationJson("../dataconfig/token.json") token = op_json.get_data('data') request_data = dict(request_data, **token) # 把请求数据与登录token合并,并作为请求数据 res = self.run_method.run_main(method, url, request_data) else: res = self.run_method.run_main(method, url, request_data) if expect != None: if self.com_util.is_contain(expect, res): self.data.write_result(i, "Pass") pass_count.append(i) else: self.data.write_result(i, res) fail_count.append(i) else: print(f"用例ID:case-{i},预期结果不能为空") # 发送邮件 # self.send_email.send_main(pass_count, fail_count) print(f"通过用例数:{len(pass_count)}") print(f"失败用例数:{len(fail_count)}") if __name__ == '__main__': run = RunTest() run.go_on_run()
9、-----util
-----common_util.py
common_util:用于断言
class CommonUtil: def is_contain(self, str_one, str_two): """ 判断一个字符串是否在另一个字符串中 :param str_one: :param str_two: :return: """ flag = None if str_one in str_two: flag = True else: flag = False return flag
10、-----util
-----operation_excel.py
operation_excel:操作excel
import xlrd from xlutils.copy import copy class OperationExcel: """操作excel""" def __init__(self, file_name=None, sheet_id=None): if file_name: self.file_name = file_name self.sheet_id = sheet_id else: self.file_name ='../dataconfig/case1.xls' self.sheet_id = 0 self.data = self.get_data() def get_data(self): """ 获取sheets的内容 :return: """ data = xlrd.open_workbook(self.file_name) tables = data.sheets()[self.sheet_id] return tables def get_lines(self): """ 获取单元格行数 :return: """ tables = self.data return tables.nrows def get_cell_value(self, row, col): """ 获取单元格数据 :param row: 行 :param col: 列 :return: """ tables = self.data cell = tables.cell_value(row, col) return cell def write_value(self, row, col, value): """ 回写数据到excel :param row:行 :param col:列 :param value:值 :return: """ read_data = xlrd.open_workbook(self.file_name) write_data = copy(read_data) sheet_data = write_data.get_sheet(0) sheet_data.write(row, col, value) write_data.save(self.file_name) def get_row_data(self, case_id): """ 根据对应的case_id获取对应行的内容 :param case_id: 用例id :return: """ row_num = self.get_row_num(case_id) row_data = self.get_row_value(row_num) return row_data def get_row_num(self, case_id): """ 根据case_id获取对应行号 :param case_id: :return: """ num = 0 cols_data = self.get_cols_data() for col_data in cols_data: if case_id in col_data: return num num = num + 1 def get_row_value(self, row): """ 根据行号,找到该行的内容 :param row:行号 :return: """ tables = self.data row_data = tables.row_values(row) return row_data def get_cols_data(self, col_id=None): """ 获取某一列的内容 :param col_id:列号 :return: """ if col_id != None: cols = self.data.col_values(col_id) else: cols = self.data.col_values(0) return cols if __name__ == '__main__': opera = OperationExcel() opera.get_data() print(opera.get_data().nrows) print(opera.get_lines()) print(opera.get_cell_value(1, 2))
11、-----util
-----operation_header.py
operation_header:实时获取登录token及将token写入到token.json文件
import json from util.operation_json import OperationJson from base.runmethod import RunMethod class OperationHeader: def __init__(self, response): self.response = json.loads(response) def get_response_token(self): ''' 获取登录返回的token ''' token = {"data":{"token":self.response['data']['token']}} return token def write_token(self): op_json = OperationJson() op_json.write_data(self.get_response_token()) if __name__ == '__main__': url = "http://xxxxx" data = { "username": "1111", "password": "123456" } run_method=RunMethod() # res = json.dumps(requests.post(url, data).json()) res=run_method.run_main('Post', url, data) op = OperationHeader(res) op.write_token()
12、-----util
-----operation_json.py
operation_json:操作json文件
import json class OperationJson: """操作json文件""" def __init__(self,file_path=None): if file_path==None: self.file_path="../dataconfig/data.json" else: self.file_path=file_path self.data = self.read_data() def read_data(self): """ 读取json文件 :param file_name:文件路径 :return: """ with open(self.file_path) as fp: data = json.load(fp) return data def get_data(self, id): """根据关键字获取对应数据""" return self.data[id] # 写入json def write_data(self, data): with open("../dataconfig/token.json", 'w') as fp: fp.write(json.dumps(data)) if __name__ == '__main__': # file_path = "../dataconfig/data.json" opejson = OperationJson() print(opejson.read_data()) print(opejson.get_data('filtrate'))
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]