pytest参数化数据来源于excel文件时,如果读取参数化数据?

发布时间 2023-11-28 13:38:30作者: 秒秒开心

一、问题

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'