封装一个可以读取任意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, "通过")
四、优化代码管理
若一个用例文件有几个或者几十个用例类时,可以把从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