python自动化笔记(十一)——openpyxl之封装

封装一个可以读取任意excel文件的方法,可以指定读取的表单,当我们多次从excel中读取数据时,就不用重复地写代码,只需调用封装的类即可。

一、封装的excel类实现的需求是什么?
1、读取表头数据
2、读取表头以外的所有数据。–返回值:列表,成员是每一行数据
3、因为每个方法都需要用到表单对象,从外部加载excel数据;所以要做初始化工作,加载一个excel,选中一个表单。
注意: 从excel里读取出来的数据只有两种类型,字符串和数字,后期可根据需要去进行处理

from openpyxl import load_workbook #导入加载函数

class Excel_data: #定义一个excel类
    def __init__(self,wb_name,sh_name):  #初始化工作,加载出一个表单对象,供函数使用
    	 """
        :param wb_name: 文件路径
        :param sh_name: 表单名字
        """
        self.wb = load_workbook(wb_name) #下面函数用到的属性才需要加self,如果下面函数没用到就不用加
        self.sh = self.wb[sh_name]

    def read_title(self):  #读取表头数据
        titles = [i.value for i in list(self.sh.rows)[0]]
        return titles

    def read_all_data(self):  # 读取表头以外的所有数据
        all_data = []
        for item in list(self.sh.rows)[1:]:
            value_list = [l.value for l in item]
            dic = dict(zip(self.read_title(),value_list))
            all_data.append(dic)
        return all_data

以上excel类封装完毕,下面调用看下

二、调用封装的excel类

import unittest  # 导入unittest框架
from unittestreport import ddt, list_data  # 导入ddt数据驱动

from python01.python04.register import register # 导入被测函数
from python01.python05.cyy1204 import Excel_data # 导入封装的excel类函数

datas = Excel_data("register__da.xlsx","Sheet1") #实例化excel类
all_data = datas.read_all_data()      # 调用类函数,得到所有数据

@ddt
class TestRegister(unittest.TestCase):
    @list_data(all_data)
    def test_register(self, case):
        result = register(**eval(case["params"])) #因为读取出来的是字符串,所以需要用eval函数去掉值的双引号
        self.assertEqual(result,eval(case["check"]))  

这样就完成excel类的调用,并且,把数据传递到测试用例当中

三、封装往Excel回写数据的方法

3.1 若需要往Excel里回写数据,则封装多一个回写的方法

from openpyxl import load_workbook


class ResdExcel:
    def __init__(self, wb_name, sh_name):
        """

        :param wb_name: 文件路径
        :param sh_name: 表单名称
        """
        self.wb = load_workbook(wb_name)  # 工作薄对象
        self.sh = self.wb[sh_name]  # 表单对象
        self.wb_name = wb_name

    def all_data(self):
        """取Excel表单所有数据"""
        all_datas = []
        #获取表头数据
        titles = [i.value for i in list(self.sh.rows)[0]]
        # 获取所有数据
        for item in list(self.sh.rows)[1:]:
            value_list = [i.value for i in item]
            dic = dict(zip(titles, value_list))
            all_datas.append(dic)
        return all_datas

    def write_data(self, row, column, value):
        """
        数据写入的方法
        :param row: 写入的行
        :param column: 写入的列
        :param value: 写入的值
        :return:
        """
        # 写入数据
        self.sh.cell(row, column, value)
        # 保存数据
        self.wb.save(self.wb_name)

3.2 调用封装的excel类,并执行回写方法

import unittest
from unittestreport import ddt, list_data

from python01.python04.register import register  # 导入被测函数
from python01.python1205.Excel_Kind import ResdExcel  # 导入封装好的excel类

excel = ResdExcel("register__da.xlsx", "Sheet1")  # 实例化excel类
all_data = excel.all_data()  # 调用读取全部数据方法


@ddt
class TestRegister(unittest.TestCase):
    @list_data(all_data)
    def test_register(self, case):
        # 第一步:准备测试数据
        params = eval(case["params"])
        expected = eval(case["check"])
        # 第二步:调功能函数,获取实际结果
        res = register(**params)
        # 第三步:断言
        try:
            self.assertEqual(res, expected)
        except AssertionError as e:
            # 把测试结果写回到Excel
            excel.write_data(case["case_id"] + 1, 5, "不通过")
            # 为了让unittest识别是条失败的用例,捕获异常进行处理后,要主动把异常抛出
            raise e
        else:
            # 把测试结果写回到Excel
            excel.write_data(case["case_id"] + 1, 5, "通过")

python自动化笔记(十一)——openpyxl之封装_第1张图片
四、优化代码管理
若一个用例文件有几个或者几十个用例类时,可以把从excel中获取数据的代码放到类当中,设置成类属性,方便管理。

import unittest
from unittestreport import ddt, list_data

from python01.python04.register import register  # 导入被测函数
from python01.python1205.Excel_Kind import ResdExcel  # 导入封装好的excel类


@ddt
class TestRegister(unittest.TestCase):
    #把从excel中获取数据的代码放到类当中,设置成类属性,方便管理,因为这两行代码就是为这类服务的。
    excel = ResdExcel("register__da.xlsx", "Sheet1")  # 实例化excel类
    all_data = excel.all_data()  # 调用读取全部数据方法

    @list_data(all_data)
    def test_register(self, case):
        # 第一步:准备测试数据
        params = eval(case["params"])
        expected = eval(case["check"])
        # 第二步:调功能函数,获取实际结果
        res = register(**params)
        # 第三步:断言
        try:
            self.assertEqual(res, expected)
        except AssertionError as e:
            # 把测试结果写回到Excel
            self.excel.write_data(case["case_id"] + 1, 5, "不通过")
            # 为了让unittest识别是条失败的用例,捕获异常进行处理后,要主动把异常抛出
            raise e
        else:
            # 把测试结果写回到Excel
            self.excel.write_data(case["case_id"] + 1, 5, "通过")


@ddt
class Test02(unittest.TestCase):
    # 把从excel中获取数据的代码放到类当中,设置成类属性,方便管理,因为这两行代码就是为这类服务的。
    excel = ResdExcel("文件路径", "表单名")  # 实例化excel类
    all_data2 = excel.all_data()  # 调用读取全部数据方法

    @list_data(all_data2)
    def test_02(self):
        pass

你可能感兴趣的:(笔记,python,excel,封装)