python读取excel测试用例数据

发布时间 2023-10-10 22:33:00作者: yimu-yimu

 

# 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()