【第三章】封装测试数据读取类
回顾
上一章节我们说到了读取excel文件数据,并且处理合并单元格的数据,本章内我们优化一下excel_utils 将它调整为我们的指定模板格式
期望数据格式
优化excel_utils
现在进行优化操作
导入excel_utils
示例代码
# -*- coding: utf-8 -*-
# @Time : 2021/12/9 10:23
# @Author : Limusen
# @File : excel_demo_02
import xlrd3
from common.excel_utils import ExcelUtils
excel_data_list = []
data = ExcelUtils("做饭秘籍.xlsx", "Sheet1")
expect_list = [
{'做菜步骤': '蛋炒饭', '步骤序号': 'step_01', '操作': '油锅烧热', '是否完成': 100.0},
{'做菜步骤': '蛋炒饭', '步骤序号': 'step_02', '操作': '放油', '是否完成': 100.0},
{'做菜步骤': '蛋炒饭', '步骤序号': 'step_03', '操作': '放鸡蛋', '是否完成': 100.0},
{'做菜步骤': '蛋炒饭', '步骤序号': 'step_04', '操作': '放米饭', '是否完成': 80.0},
{'做菜步骤': '辣椒炒肉', '步骤序号': 'step_01', '操作': '油锅烧热', '是否完成': 100.0},
{'做菜步骤': '辣椒炒肉', '步骤序号': 'step_02', '操作': '放油', '是否完成': 100.0},
{'做菜步骤': '辣椒炒肉', '步骤序号': 'step_03', '操作': '放肉', '是否完成': 100.0},
{'做菜步骤': '辣椒炒肉', '步骤序号': 'step_04', '操作': '放辣椒', '是否完成': 80.0}]
# # 1.获取行的数据 i为循环的次数
# for i in range(1, data.get_row_count()):
# print(data.get_merged_value(i, 0))
# # 2.获取列的数据
# for b in range(0, data.get_col_count()):
# print(data.get_merged_value(0,b))
# 3.组装
# print(data.get_row_count())
# print(data.get_col_count())
# 先循环行
for i in range(1, data.get_row_count()):
# 先定义一个空字典
row_dict = {}
# 再根据行数 循环列数
for j in range(data.get_col_count()):
# 重新赋值
row_dict[data.get_merged_value(0, j)] = data.get_merged_value(i, j)
excel_data_list.append(row_dict)
print(excel_data_list)
代码图示
新增 get_all_excel_data
新增获取全部数据方法
示例代码
# -*- coding: utf-8 -*-
# @Time : 2021/12/8 16:40
# @Author : Limusen
# @File : excel_utils
import os
import xlrd3
# 优化获取文件路径的方式
current_path = os.path.dirname(os.path.abspath(__file__))
# 这里分开写是为了适配mac跟windows之间的// 转义,这样更兼容
excel_file_path = os.path.join(current_path, '..', 'testcase_data', '做饭秘籍.xlsx')
sheet_name = "Sheet1"
class ExcelUtils:
def __init__(self, excel_file_path=excel_file_path, sheet_name=sheet_name):
self.excel_file_path = excel_file_path
self.sheet_name = sheet_name
self.sheet_obj = self.get_sheet_obj()
def get_sheet_obj(self):
"""
创建工作蒲对象
:return:
"""
workbook_obj = xlrd3.open_workbook(excel_file_path)
sheet_obj = self.workbook_obj.sheet_by_name(sheet_name)
return self.sheet_obj
def get_row_count(self):
"""
获取总行数
:return:
"""
return self.sheet_obj.nrows
def get_col_count(self):
"""
获取总列数
:return:
"""
return self.sheet_obj.ncols
def get_merged_value(self, row_index, col_index):
"""
查询指定单元格信息
:param row_index: 想要查询的行坐标
:param col_index: 想要查询的类坐标
:return:
"""
for (min_row, max_row, min_col, max_col) in self.sheet_obj.merged_cells:
if row_index >= min_row and row_index < max_row:
if col_index >= min_col and col_index < max_col:
# 是合并单元格,单元格的值等于 合并单元格中的第一个单元格的值
cell_value = self.sheet_obj.cell_value(min_row, min_col)
break
else:
cell_value = self.sheet_obj.cell_value(row_index, col_index)
else:
cell_value = self.sheet_obj.cell_value(row_index, col_index)
return cell_value
def get_all_excel_data(self):
"""
获取全部excel表格数据 用列表组装
:return: excel数据
"""
excel_data_list = []
for i in range(1, self.get_row_count()):
# 先定义一个空字典
row_dict = {}
# 再根据行数 循环列数
for j in range(self.get_col_count()):
# 重新赋值
row_dict[self.get_merged_value(0, j)] = self.get_merged_value(i, j)
excel_data_list.append(row_dict)
return excel_data_list
if __name__ == '__main__':
# 每次做完都需要检查一下自己代码是否正确噢!
ex = ExcelUtils()
print(ex.get_merged_value(7, 0))
print(ex.get_all_excel_data())
代码图示
小结
到此优化完成excel_utils 读取到我们想要的数据格式
封装测试用例数据
excel文件
读取数据格式
上面说到我们可以获取到excel的全部数据,现在讲它组装成我们测试数据需要的格式
格式如下:
字典的setdefault()
Python 字典 setdefault() 函数和 get()方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值。
如果字典中包含有给定键,则返回该键对应的值,否则返回为该键设置的值。
示例代码
# -*- coding: utf-8 -*-
# @Time : 2021/12/9 11:10
# @Author : Limusen
# @File : testcase_demo_03
# 字典设置默认值
dict_01 = {"name": "王二狗", "age": 180}
print(dict_01)
# 使用setdefault可以新增数据到字典
dict_01.setdefault("sex", "男")
print(dict_01)
# 尝试一下如果有值的情况,再试一下setdefault
dict_01.setdefault("age", 29)
# 这个时候发现 setdefault不会改变已有的值
print(dict_01)
testdata_list = [
{'做菜步骤': '蛋炒饭', '步骤序号': 'step_01', '操作': '油锅烧热', '是否完成': 100.0},
{'做菜步骤': '蛋炒饭', '步骤序号': 'step_02', '操作': '放油', '是否完成': 100.0},
{'做菜步骤': '蛋炒饭', '步骤序号': 'step_03', '操作': '放鸡蛋', '是否完成': 100.0},
{'做菜步骤': '蛋炒饭', '步骤序号': 'step_04', '操作': '放米饭', '是否完成': 80.0},
{'做菜步骤': '辣椒炒肉', '步骤序号': 'step_01', '操作': '油锅烧热', '是否完成': 100.0},
{'做菜步骤': '辣椒炒肉', '步骤序号': 'step_02', '操作': '放油', '是否完成': 100.0},
{'做菜步骤': '辣椒炒肉', '步骤序号': 'step_03', '操作': '放肉', '是否完成': 100.0},
{'做菜步骤': '辣椒炒肉', '步骤序号': 'step_04', '操作': '放辣椒', '是否完成': 80.0}
]
# 改造
tmp_dict = {}
for i in testdata_list:
tmp_dict.setdefault(i['做菜步骤'], []).append(i)
print(tmp_dict)
代码图示
代码优化
示例代码
# -*- coding: utf-8 -*-
# @Time : 2021/12/9 13:36
# @Author : Limusen
# @File : testcase_demo_04
testcase_list = {'蛋炒饭': [{'做菜步骤': '蛋炒饭', '步骤序号': 'step_01', '操作': '油锅烧热', '是否完成': 100.0},
{'做菜步骤': '蛋炒饭', '步骤序号': 'step_02', '操作': '放油', '是否完成': 100.0},
{'做菜步骤': '蛋炒饭', '步骤序号': 'step_03', '操作': '放鸡蛋', '是否完成': 100.0},
{'做菜步骤': '蛋炒饭', '步骤序号': 'step_04', '操作': '放米饭', '是否完成': 80.0}],
'辣椒炒肉': [{'做菜步骤': '辣椒炒肉', '步骤序号': 'step_01', '操作': '油锅烧热', '是否完成': 100.0},
{'做菜步骤': '辣椒炒肉', '步骤序号': 'step_02', '操作': '放油', '是否完成': 100.0},
{'做菜步骤': '辣椒炒肉', '步骤序号': 'step_03', '操作': '放肉', '是否完成': 100.0},
{'做菜步骤': '辣椒炒肉', '步骤序号': 'step_04', '操作': '放辣椒', '是否完成': 80.0}]}
data_list = []
for key, value in testcase_list.items():
# 定义一个空字典
dict_value = {}
dict_value["菜名"] = key
dict_value["做菜步骤"] = value
data_list.append(dict_value)
print(data_list)
代码图示
封装testcase_data_utils.py
- 将测试数据转换成字典格式
示例代码
# -*- coding: utf-8 -*-
# @Time : 2021/12/9 13:42
# @Author : Limusen
# @File : testcase_data_utils
import os
from common.excel_utils import ExcelUtils
current = os.path.dirname(os.path.abspath(__file__))
excel_file_path = os.path.join(current, '..', 'testcase_data', 'testcase_infos.xlsx')
excel_sheet_name = "Sheet1"
class TestCaseDataUtils:
def __init__(self):
self.ex = ExcelUtils(excel_file_path=excel_file_path,
sheet_name=excel_sheet_name)
def test(self):
print(self.ex.get_all_excel_data())
def convert_data_info_dict(self):
"""
将测试数据转换成字典
:param testcase_info:
:return:
"""
test_case_dict = {}
for testcase in self.ex.get_all_excel_data():
test_case_dict.setdefault(testcase['测试用例编号'], []).append(testcase)
return test_case_dict
if __name__ == '__main__':
print(TestCaseDataUtils().convert_data_info_dict())
代码图示
优化代码转换格式
# -*- coding: utf-8 -*-
# @Time : 2021/12/9 13:42
# @Author : Limusen
# @File : testcase_data_utils
import os
from common.excel_utils import ExcelUtils
current = os.path.dirname(os.path.abspath(__file__))
excel_file_path = os.path.join(current, '..', 'testcase_data', 'testcase_infos.xlsx')
excel_sheet_name = "Sheet1"
class TestCaseDataUtils:
def __init__(self):
self.ex = ExcelUtils(excel_file_path=excel_file_path,
sheet_name=excel_sheet_name)
def test(self):
print(self.ex.get_all_excel_data())
def convert_data_info_dict(self):
"""
将测试数据转换成字典
:param testcase_info:
:return:
"""
test_case_dict = {}
for testcase in self.ex.get_all_excel_data():
test_case_dict.setdefault(testcase['测试用例编号'], []).append(testcase)
return test_case_dict
def convert_data_info_list(self):
test_case_list = []
for key, value in self.convert_data_info_dict().items():
type_dict = {}
type_dict["case_id"] = key
type_dict["case_step"] = value
test_case_list.append(type_dict)
return test_case_list
if __name__ == '__main__':
print(TestCaseDataUtils().convert_data_info_list())
- 到此测试数据类封装完毕,我们可以取到我们想要的数据
总结
本章节主要是优化我们的excel_utils类的内容,新增了读取全部数据的方法,封装了我们测试数据读取的方法.方便我们编写测试用例等.下一章节跟大家分享的是封装request类
代码
地址 : https://gitee.com/todayisgoodday/PythonRequest
博客园地址
https://www.cnblogs.com/yushengaqingzhijiao/category/2076022.html