一、相关概念
使用python对excel进行操作之前,我们需要了解excel的组成,分别是:
- 工作薄workbook
- 工作表sheet
- 单元格cell
对excel的操作,实质上是对excel中workbook、sheet以及cell的操作。
二、操作流程
- 使用excel提前将测试用例准备好
- 导入操作excel需要使用的模块:openpyxl
- 工作簿的加载:wb = load_workbook("excel的存放路径")
- 获取存放测试用例的表单:sh = wb["表单名称"]
- 获取表单中所有的数据,并使用列表保存--按行获取
- rows = list(sh.rows)
- 说明:使用sh.rows获取的每一行是一个元组,元组中的成员是cell
- 遍历行:获取每一行中所有数据,此时我们需要区分一下表头数据和非表头数据
- 使用字典存放每一行的测试用例
- 遍历的表头行数据,可以用作dict中的key
- 遍历的非表头行数据,可以用作dict中的value
- 对于非表头行,每一行就是一个测试用例数据
- 将存放每一行测试用例的dict,添加到存放所有测试用例的列表中
三、代码实现
- 方式一:使用zip(推荐)
1 ''' 2 读取excel中的测试用例,并使用列表进行保存 3 使用zip将表头信息与行中的信息已字典的形式关联 4 ''' 5 6 import os 7 from openpyxl import load_workbook 8 9 file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),"login_case.xlsx") 10 11 datas_case = [] #用于保存测试用例 12 13 wb = load_workbook(file_path) # 获取工作簿workBook 14 sh = wb["login"] # 获取工作表 15 rows = list(sh.rows) # 获取工作表中所有行,行中的元素以元组的形式进行存放 16 17 titles = [] # 用户存放表头信息 18 for key in rows[0]: # 遍历表头 19 titles.append(key.value) 20 pass 21 22 # 遍历非表头行 23 for row in rows[1:]: 24 values = [] # 用于存放行中元素 25 for cel in row: # 遍历行中的单元格 26 values.append(cel.value) 27 pass 28 res = dict(zip(titles,values)) # 将行中的元素与表头信息组合,形成测试用例 29 res["expected"] = eval(res["expected"]) # 将字符串转换成字典 30 datas_case.append(res) # 将测试用例存放在列表中 31 pass 32 33 print(datas_case)
- 方式二:原生方式
1 ''' 2 读取excel中的测试用例,并使用列表进行保存 3 使用最原生的方式 4 ''' 5 6 import os 7 from openpyxl import load_workbook 8 9 file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),"login_case.xlsx") 10 11 datas_case = [] #用于保存测试用例 12 13 wb = load_workbook(file_path) # 获取工作簿workBook 14 sh = wb["login"] # 获取工作表 15 rows = list(sh.rows) # 获取工作表中所有行,行中的元素以元组的形式进行存放 16 17 titles = [] # 用户存放表头信息 18 for key in rows[0]: # 遍历表头 19 titles.append(key.value) 20 pass 21 22 # 遍历非表头行 23 for row in rows[1:]: 24 row_dict = {} # 将行中的信息用字典保存 25 for item in range(len(row)): 26 row_dict[titles[item]] = row[item].value 27 pass 28 row_dict["expected"] = eval(row_dict["expected"]) # 将字符串转换成字典 29 datas_case.append(row_dict) # 将测试用例存放在列表中 30 pass 31 32 print(datas_case)