import pprint
import xlrd
'''
v1.0
# 1- 加载表格到内存open_workbook()传入文件路径与保持原样式
# 2- excel实例调用sheet_by_name()传入一个工作表的名字,返回这个工作表实例
# 3- 读取工作表中单元格数据,列数据,行数据
col_values()列数据,row_values(0) 行数据,cell_value(0,0)单元格数据
# 4- 取值的列为:请求参数与相应预期结果这两列,列不变行要变
v2.0
功能描述:
1- 可以用户选择任何列数据
1- 列编号
2- 列名---更适合
2- 分类筛选执行
1- 全部执行 -all
2- 分段执行 tc003-tc007
3- 随机执行 tc001,tc009
4- 复合场景 [tc001,tc003-tc007,tc009]
'''
'''
1- 得到需要操作的工作表
1- open_workbook方法加载excel文件,返回文件对象
2- sheet_by_name()根据名字获取excel工作表中的,返回工作表对象
2- 处理用户传入的列名,把列名转为列的下标,样式:元祖('用例编号','请求参数','响应预期结果')
1- 循环元祖,取出列名
2- row_values(0)取出第0行数据返回一个列表,使用index()把元祖取到的列名放入返回下标
3- 把每次得到的下标放入列表,到此用户要的列全部得到
3- 处理用户传入的行的取值范围,是一个列表['003-006','all','007']分段取,全部取,单个取,默认全取
1- (全取)判断用户取值的列表里是否包含 'all'如果有直接全取(此时数据里有一些脏数据,是我们不需要的,后面会筛选掉)
[用例编号,Login003,Login004,Login005,Login006]
2- (不全取)包括单个取,分段取
1- 循环取出用户的传入的,行的取值范围列表(得到结果为'001' '003-006')
1- 判断值是否包含'-',包含就是分段取值,
1- 使用split()传入'-'切割字符串得到一个列表['003','006']得到了分段取得起始值与终止值
2- 把003,006转为int,放入循环range,003作为起始值,006作为终止值,不包含终止值,006需要加1
一次得到的值为:3,4,5,6
2- 格式化每次得到的值:列:Login003,Login部分是变化的,就用CaseName参数替代
格式为:f'{CaseName}{i:>03}',把拼接好的值放入列表最后为:[Login003,Login004,Login005,Login006]
2- 不包含为单个取值'001'
1- 直接拼接:CaseName+oneCase
4- 把得到的列表中,用例编号转为行下标,并筛除脏数据
1- 循环用例编号列表,得到用例编号
2- 判断用例编号中是否包含CaseName,
3- 取第0列全部数据, 返回一个列表,用index()把用例编号传入得到下标 ,把下标加入列表,
到此行下标,列下标都有了
5- 用得到的行下标列表,列下标列表,获取用户需要的值
1- 行作为外循环,列作为内循环,(把每行n列的值取完,跳出一次内循环,开始取下一行的n列,依次这样,直到行列表
的值取完,n多少取决于列的列表有多少元素)
2- cell_value(index,i),index为行,i为列,把每次内循环的值加入列表,列表每次内层循环完要清空,需要定义在内外循环之间
3- 接口fixture需要的数据为:[[参数1,参数2],[参数1,参数2]],需要把每次内循环中列表放入另一个列表.套起来
4- 最后返回外层列表即可
'''
def get_excel_data(fileDir,sheet_name,CaseName,*ColName,screen=['all']):
'''
:param fileDir: excel文件地址
:param sheet_name: sheet工作表的名字
:param CaseName: 用例的名字
:param ColName: 列的名字,支持读取多列
:param screen: 筛选要执行的用例支持默认全部,支持分段与单个
:return: 返回[[数据1,数据2],[数据1,数据2]]这种格式
'''
SheetCell_lists = []#返回列表,数据格式:[[参数1,参数2],[参数1,参数2]]
#加载
workbook = xlrd.open_workbook(filename=fileDir,formatting_info=True)
worksheet = workbook.sheet_by_name(sheet_name=sheet_name)#根据名字拿到工作表
SheetCol_list = [] # 列号列表
# ColName是可变长度参数,为用户要取得列的名称:('列名1','列名2')
for one in ColName:
# row_values,取第0行每列的名字,返回列表,index 传入列名,返回下标存入列表,作为单元格取值的列值
CaseIndex = worksheet.row_values(0).index(one)
SheetCol_list.append(CaseIndex)#获取放入列表列号
screen_list = []#存放用户要取得用例编号的名字
# 判断用户取全部用例
if 'all' in screen:
#取全部用例,拿出第0列全部数据,放入列表,
screen_list = worksheet.col_values(0)
else:
#循环用户需要取得用例参数screen格式为:[001-003,006]
for oneCase in screen:
# 判断是否是001-003这种分段的
if '-' in oneCase:
#用-切割字符串,得到起始用例值与终止用例值
case = oneCase.split('-')
# 循环得到用户分段用例中间的值,格式为 3,4,5
for i in range(int(case[0]),int(case[1])+1):
#与用户CaseName拼接放入列表,格式为:[Login003,Login004,Login005]
screen_list.append(f'{CaseName}{i:>03}')
# 否则就是单个的
else:
# 把CaseName+oneCase拼接
screen_list.append(CaseName+oneCase)
screen_lists = []#行号列表
for one in screen_list:#循环的到的用户要取得case,
if CaseName in one:
# 用户要取得用例编号的名字,转为下标
screen_lists.append(worksheet.col_values(0).index(one))# 拿到case的下标
#循环用户筛选的case下标列表,就是case的行号,传入cell_value(index,i)
for index in screen_lists:#行号
SheetCell_list = [] # 定义在这里因为每次进入内循环要清空列表
for i in SheetCol_list:#列号
SheetCell = worksheet.cell_value(index,i)# 请求参数
# SheetCell2 = worksheet.cell_value(index, i)#相应参数
SheetCell_list.append(SheetCell)
SheetCell_lists.append(SheetCell_list)#返回数据格式:[[参数1,参数2],[参数1,参数2]]
return SheetCell_lists
if __name__ == '__main__':
work = get_excel_data('../data/testCaseFile_V1.5.xls','登录模块','Login',
'用例编号','请求参数','响应预期结果',screen=['001-003'])
pprint.pp(work)
print(work)