# excel_readUtil.py
from openpyxl import load_workbook
import pandas
class HandleExcel:
"""
封装excel文件处理类
"""
def __init__(self, filename, sheetname=None):
""" 定义构造方法
:param filename: 文件名=实例属性
:param sheetname: 表单名,如果表单名只有一个可以设置为默认值
"""
self.filename = filename
self.sheetname = sheetname
def get_cases(self):
"""
获取所有的测试用例,实例方法
:return:为嵌套字典的列表
"""
# 打开文件:使用load_workbook传入文件名
wb = load_workbook(self.filename) # 返回创建一个Workbook的对象, 相当是一个excel文件
if self.sheetname is None: # 定位表单,判断是否制定表单默认空,为第一个表单
ws = wb.active # active 获取第一个表单
else:
ws = wb[self.sheetname] # 否则获取指定的表单
# min_row = 最小行号,max_row=最大行号(可以不写)
# min_col = 最小列号,max_col=最大列号
# values_only = 获取单元格的值
# 获取表头的信息,使用 iter_rows方法,嵌套元祖的元祖,省略最小行号
head_data_tuple = tuple(ws.iter_rows(max_row=1, values_only=True))[0]
one_list = []
for one_tuple in tuple(ws.iter_rows(min_row=2, values_only=True)): # 不需要表头最小行号为2,不需要最大行号,最大最小列号
# zip 函数将表头的元祖与每一行用例所在的元祖进行拼接,dict转换为字典后,添加到列表当中 one_list = []
one_list.append(dict(zip(head_data_tuple, one_tuple)))
return one_list # 为嵌套字典的列表
def get_sheet_name(self):
excel_total = pandas.ExcelFile(filename)
if self.sheetname is None:
sheet_names = excel_total.sheet_names
# print(sheet_names)
return sheet_names
else:
print("当前标签名: " + self.sheetname)
def get_one_case(self, row):
"""
获取某一条测试用例
:param row: 行号
:return:嵌套字典的列表,使用位置进行获取
"""
return self.get_cases()[row - 1]
def get_max_row(self): # 获取用例数量
list1 = self.get_cases()
max_num = len(list1)
return max_num
def write_result(self, row, actual, result):
"""
写入数据到测试用例指定的行列中
:param row: 行号
:param actual: 实际结果
:param result: 用例执行的结果(Pass或者Fail)
:return:
"""
# 同一个Workbook对象, 如果将数据写入到多个表单中, 那么只有最后一个表单能写入成功,需要创建不同的对象
other_wb = load_workbook(self.filename) # 创建对象 = 打开一个文件
if self.sheetname is None:
other_ws = other_wb.active
else:
other_ws = other_wb[self.sheetname]
# 写入
if isinstance(row, int) and (2 <= row <= other_ws.max_row): # 不能修改表头,下一行开始,行号大于2,小于最大的行号
other_ws.cell(row=row, column=6, value=actual) # 在第六行写入实际结果
other_ws.cell(row=row, column=7, value=result) # 在第七行写入用例执行的结果
other_wb.save(self.filename) # save 保存文件
other_wb.close() # close关闭 ----- 读数据的时候不需要关闭,写数据的时候可关闭或不关闭
else: # 如果不是整数,行号小于2,并且大于最大的行号
print("传入的行号有误, 行号应为大于1的整数")
def choose_case(self):
list_case =self.get_cases()
num_case = self.get_max_row()
run_list = []
for i in range(0, num_case):
y = list_case[i]["是否执行"]
if y == 'y':
aa = list_case[i]["用例名称"] # 根据自己的需要进行选择
run_list.append(aa)
else:
print("跳过该用例: "+list_case[i]["用例名称"])
print(run_list)
return run_list
if __name__ == '__main__': # 自己写的模块自己用使用 main 函数
filename = "C://study//pythonT//pythonProject//test_cases//caseqq.xlsx"
sheetname = "case" # 指定第二个表单名
# 创建一个对象,filename=文件名和sheetname=表单名可以不传
# do_excel = HandleExcel(filename) # 传文件名,不传默认第一个表单
do_excel = HandleExcel(filename, sheetname)
# 获取所有的测试用例cases,使用对象调用实例方法
cases = do_excel.get_cases()
# print(cases)
# print(cases[0]['序号'])
# 写入,在第二行写入"20230918", "设置Pass"
# do_excel.write_result(2, "20230918", "设置pass")
# sheets = do_excel.get_sheet_name()
do_excel.choose_case()
python读取excel测试用例数据
于 2023-10-16 21:48:12 首次发布