一、问题
pytest参数化数据来源于excel文件时,如果读取参数化数据?
二、回答
有两种获取方式:
1.列表嵌套列表的方式
2.列表嵌套字典的方式
更加推荐第2种列表推荐字典的方式,这样就算excel增加一列也没关系,不用大动代码,而列表嵌套列表的方式,一旦excel增加或减少一列,pytest.mark.parametrize("case,username,password")的传参就要变,如果涉及多个方法,那么多个方法都要变动,很麻烦。
data\case.xlsx文件如下:
代码如下所示:
1 def getExcelData(*file,sheet_index=0,header=True): 2 ''' 3 获取excel文件内容,excel可以没有头部,返回[[],[],[]]格式 4 :param file: 参数化文件路径 5 :param header: csv第一行是否是头部,是就不读取 6 :return: list嵌套list, [[],[],[]] 7 ''' 8 dataList = [] 9 workBook = openpyxl.load_workbook(getFileDir(*file)) 10 workSheet = workBook.worksheets[sheet_index] 11 if header: 12 #如果第一行是头部,则不读取第一行,从第2行开始读 13 rows = workSheet.iter_rows(min_row=2) 14 else: 15 rows = workSheet.iter_rows() 16 for row in rows: 17 rowList = [] 18 for cell in row: 19 rowList.append(cell.value) 20 dataList.append(rowList) 21 return dataList 22 23 def getExcelDictData(*file,sheet_index=0): 24 ''' 25 获取excel文件内容,excel第一行必须是头部,返回[{},{},{}]格式 26 我这里用的for i in range的方式使得key与value对应 27 :param file: 参数化文件路径 28 :return: list嵌套dict, [{},{},{}] 29 ''' 30 dataDictList = [] 31 workBook = openpyxl.load_workbook(getFileDir(*file)) 32 workSheet = workBook.worksheets[sheet_index] 33 #第一行为头部,作为key 34 headerData = workSheet[1] 35 rows = workSheet.iter_rows(min_row=2) 36 for row in rows: 37 rowDict = {} 38 for i in range(len(row)): 39 rowDict[headerData[i].value] = row[i].value 40 dataDictList.append(rowDict) 41 return dataDictList 42 43 def getExcelDictData2(*file,sheet_index=0): 44 ''' 45 获取excel文件内容,excel第一行必须是头部,返回[{},{},{}]格式 46 我这里用的workSheet.cell(row=1,column=cell.column)方式获取与数据对应的头部key值 47 :param file: 参数化文件路径 48 :return: list嵌套dict, [{},{},{}] 49 ''' 50 dataDictList = [] 51 workBook = openpyxl.load_workbook(getFileDir(*file)) 52 workSheet = workBook.worksheets[sheet_index] 53 rows = workSheet.iter_rows(min_row=2) 54 for row in rows: 55 rowDict = {} 56 for cell in row: 57 #第一行,列的索引与下面数据列的索引相同 58 rowKey = workSheet.cell(row=1,column=cell.column) 59 rowDict[rowKey.value] = cell.value 60 dataDictList.append(rowDict) 61 return dataDictList
上面两个方法一个是列表嵌套列表,一个是列表嵌套字典的封装,需要注意:
getExcelData即列表嵌套列表的方式,需要判断excel表格第一行是否是头部,如果是需要跳过,这样读出来的内容才都是数据,如果不是则不需要跳过;
而getExcelDictData2即列表嵌套字典的方式,则要求excel表格第一行必须是头部,且不需要跳过,它会把第一行的头部当作字典的key来处理。
封装getExcelData,getExcelDictData2即可调用,代码如下:
1 import pytest 2 import requests 3 4 from utils import getExcelDictData2, getExcelData 5 6 host = "http://66.66.66.66:9000" 7 8 @pytest.mark.parametrize("case,username,password",getExcelData("data","case.xlsx"),ids="case") 9 def testPostLogin(case,username,password): 10 ''' 11 参数为k=v的POST接口 12 :return: 13 ''' 14 postUrl = host + "/pinter/com/login" 15 #userName=admin&password=1234 16 dataContent = {"userName":username,"password":password} 17 result = requests.post(url=postUrl,data=dataContent) 18 print(result.json()) 19 assert result.json().get("code") == '0' or '1' 20 21 @pytest.mark.parametrize("param",getExcelDictData2("data","case.xlsx"),ids=[item.get("case") for item in getExcelDictData2("data","case.xlsx")]) 22 def testPostLogin(param): 23 ''' 24 参数为k=v的POST接口 25 :return: 26 ''' 27 postUrl = host + "/pinter/com/login" 28 #userName=admin&password=1234 29 dataContent = {"userName":param.get("username"),"password":param.get("password")} 30 result = requests.post(url=postUrl,data=dataContent) 31 print(result.json()) 32 assert result.json().get("code") == '0' or '1'
标签:case,rows,workSheet,excel,嵌套,pytest,参数,row From: https://www.cnblogs.com/miaomiaokaixin/p/17861763.html