python 操作 Excel 处理测试数据 (九)
(十)python 操作 Excel 读 / 写测试数据
1, 夹心饼干
setUp: 在每一条测试用例执行之前执行
tearDown: 在每一条测试用例执行之后执行
上面的这两个东东就叫做夹心饼干, 在必要的时候写, 比如说在执行测试用例之前你有数据需要提前准备好, 在测试用例执行结束之后有东西需要清除掉, 就可以用夹心饼干. 在之后的代码中可以看到这个夹心饼干的作用和用法.
2, 解决用例相互关联性或依赖性太强
方法 1: 写到 setUp 里面, 每次都重新对第一条用例进行请求;
方法 2: 全局变量
方法 3: 反射
3,Excel 处理测试数据
在这一部分会用到两个东西: pip install openpyxl,pip install ddt (需要安装好)
注意: openpyxl 只支持后缀为. xlsx 的格式, 其余的均不支持; 新建 Excel 的方式一: 可以在桌面先创建一个后缀为. xlsx 格式的 Excel, 再复制到写代码所在的文件夹中即可; 方法二: 找到写代码的当前目录路径, 在目录路径下创建一个后缀为. xlsx 的 Excel 即可.
(1) 新建 Excel 并读取 Excel 单元格中的数据
首先我在桌面创建了一个名为 xz.xlsx 的 Excel, 在 Excel 中第一行第一列写了一个小猪, 表单名是 python
- from openpyxl import load_workbook
- # 打开 Excel
- wb=load_workbook("xz.xlsx") # 返回打开的工作薄
- # 定位表单
- sheet=wb["python"] # 传表单名
- # 定位单元格: 根据行列值去定位
- res=sheet.cell(1,1).value
- print(res)
打印出来的结果是: 小猪
(2) 打印行和列的最大值 (我举的例子是存放了 5 行 6 列的数据)
- from openpyxl import load_workbook
- # 打开 Excel
- wb=load_workbook("xz.xlsx") # 返回打开的工作薄
- # 定位表单
- sheet=wb["python"] # 传表单名 返回一个表单对象
- # 定位单元格: 根据行列值去定位
- res=sheet.cell(1,1).value
- # 表单的最大行
- print(sheet.max_row)
- # 表单的最大列
- print(sheet.max_column)
打印出来的结果是:
5
6
(3) 数据从 Excel 中读取出来之后的类型: 数字还是数字, 其余都是字符串
例如:(我举的例子是在 Excel 第一行中写入了 4 个数据)
- from openpyxl import load_workbook
- # 打开 Excel
- wb=load_workbook("xz.xlsx") # 返回打开的工作薄
- # 定位表单
- sheet=wb["python"] # 传表单名 返回一个表单对象
- # 定位单元格: 根据行列值去定位
- # res=sheet.cell(1,1).value
- # 表单的最大行
- print(sheet.max_row)
- # 表单的最大列
- print(sheet.max_column)
- # print(res)
- # 从 Excel 中读取数据
- print("url:{0}".format(sheet.cell(1,1).value))
- print("data:{0}".format(sheet.cell(1,2).value))
- print("code:{0}".format(sheet.cell(1,3).value))
- print("method:{0}".format(sheet.cell(1,4).value))
打印出来的结果是:
- url:case_id
- data:module
- code:title
- method:http_method
这里可以用 type() 函数打印出这些数据的类型
(4)eval(): 把数据类型转换成原本的数据类型
例如:
- s='{"age":18}'
- print(eval(s),type(eval(s)))
打印出来的结果是:{'age':18} <class 'dict'>
(5) 读取数据的三种方式
方式一: 一次性读取所有的数据, 对内存的要求要高一些 (推荐使用)
- from openpyxl import load_workbook
- class DoExcel:
- def __init__(self, file_name, sheet_name):
- self.file_name = file_name
- self.sheet_name = sheet_name
- def get_data(self):
- wb = load_workbook (self.file_name)
- sheet = wb[self.sheet_name]
- #
- # res = sheet.cell (1, 1).value
- # 取到第一行的所有数据
- test_data = []
- for i in range (1, sheet.max_row + 1):
- sub_data = {}
- sub_data['method'] = sheet.cell (i, 1).value
- sub_data['url'] = sheet.cell (i, 2).value
- sub_data['data'] = sheet.cell (i, 3).value
- sub_data['expected'] = sheet.cell (i, 4).value
- test_data.append (sub_data)
- return test_data
- if __name__ == '__main__':
- print (DoExcel ("xz.xlsx", 'python').get_data ())
打印出来的结果是:
[{'method': 'case_id', 'url': 'module', 'data': 'title', 'expected': 'http_method'}, {'method': 1, 'url': 'login', 'data': '正常登录', 'expected': 'post'}, {'method': 2, 'url': 'login', 'data': '输入错误密码', 'expected': 'get'}, {'method': 3, 'url': 'recharge', 'data': '正常充值', 'expected': 'post'}, {'method': 4, 'url': 'recharge', 'data': '充值输入负数', 'expected': 'get'}]
方式二: 在需要用的时候读取所有的数据 (会对磁盘的读写要求高一些)
- from openpyxl import load_workbook
- class DoExcel:
- def __init__(self, file_name, sheet_name):
- self.file_name = file_name
- self.sheet_name = sheet_name
- # 获取一个表单对象
- self.sheet_obj=load_workbook(self.file_name)[self.sheet_name]
- self.max_row=self.sheet_obj.max_row
- def get_data(self,i,j):
- '''根据传入的坐标来获取值'''
- return self.sheet_obj.cell(i,j).value
- if __name__ == '__main__':
- res=DoExcel ("xz.xlsx", 'python').get_data (1,1)
- print(res)
打印出来的结果是: case_id
方式三: 利用嵌套循环读取数据 (以我自己创建的 Excel 为例, 仅供参考)
- from openpyxl import load_workbook
- class DoExcel:
- def __init__(self, file_name, sheet_name):
- self.file_name = file_name
- self.sheet_name = sheet_name
- def get_header(self):
- '''获取第一行的标题'''
- wb=load_workbook(self.file_name)
- sheet=wb[self.sheet_name]
- # 存储标题行
- header=[]
- for j in range(1,sheet.max_column+1):
- header.append(sheet.cell(1,j).value)
- return header
- def get_data(self):
- '''根据嵌套循环读取数据'''
- wb = load_workbook (self.file_name)
- sheet = wb[self.sheet_name]
- header=self.get_header()# 拿到 header
- test_data = []
- for i in range (2, sheet.max_row + 1):
- sub_data = {}
- for j in range(1,sheet.max_column+1):
- sub_data[header[j-1]]=sheet.cell(i,j).value
- test_data.append (sub_data)
- return test_data # 返回获取到的数据
- if __name__ == '__main__':
- print (DoExcel ("xz.xlsx", 'python').get_data ())
打印出来的结果是:
[{'case_id': 'case_id', 'module': 'module', 'title': 'title', 'http_method': 'http_method', 'url': 'url', 'data': 'data', 'expected': 'expected', None: None}, {'case_id': 1, 'module': 'login', 'title': '正常登录', 'http_method': 'post', 'url': 'http://test.xxx.com/xxx/mvc/api/member/login', 'data': '{"mobilephone":"test","pwd":"test"}', 'expected': 10001, None: None}, {'case_id': 2, 'module': 'login', 'title': '输入错误密码', 'http_method': 'get', 'url': 'http://test.xxx.com/xxx/mvc/api/member/login', 'data': '{"mobilephone":"test","pwd":"test111"}', 'expected': 20111, None: None}, {'case_id': 3, 'module': 'recharge', 'title': '正常充值', 'http_method': 'post', 'url': 'http://test.xxx.com/xxx/mvc/api/member/recharge', 'data': '{"mobilephone":"test","amount":"100"}', 'expected': 10001, None: None}, {'case_id': 4, 'module': 'recharge', 'title': '充值输入负数', 'http_method': 'get', 'url': 'http://test.xxx.com/xxx/mvc/api/member/recharge', 'data': '{"mobilephone":"test","amount":"-100"}', 'expected': 20117, None: None}]
以上, 第九部分到此结束~
来源: https://www.cnblogs.com/xuxiaozhu/p/10724678.html