首页 > 其他分享 >pytest参数化数据来源于excel文件时,如果读取参数化数据?

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

时间:2023-11-28 13:46:29浏览次数:26  
标签:case rows workSheet excel 嵌套 pytest 参数 row

一、问题

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

相关文章

  • pytest之fixture使用方式
    一、问题pytest中fixture的调用方式有哪几种? 二、回答有4种方式:1.传参调用2.自动调用autouse=True3.手动调用usefixtures4.与parametrize结合调用indirect=True第一种方式:传参调用getToken方法装上了@pytest.fixture(),在testQuery(getToken)中传参,即可获取getToken方法的......
  • pytest参数化数据来源于csv文件时,如果读取参数化数据?
    一、问题pytest参数化如何读取csv文件数据? 二、回答有两种获取方式:1.列表嵌套列表的方式2.列表嵌套字典的方式更加推荐第2种列表推荐字典的方式,更好用。data\id.csv数据为:代码如下所示:1importcsv2importos34importopenpyxl567defg......
  • python Matplotlib库:根据excel生成各种柱状图
    我将向大家介绍如何使用Python和一些常见的库来根据Excel数据生成十种不同类型的图表。通过多维度的可视化,我们可以更全面地了解数据中的模式、趋势和关系。无论您是数据分析师、市场营销人员还是研究人员,这些图表将帮助您挖掘数据中更多的信息。1.准备工作 首先,我们需要安装一些......
  • 加固数据安全:Java助力保护Excel文件,让数据无懈可击
    前言Excel文件保护是常用的一种功能,文件保护主要有三种:添加密码,如果没有密码不允许打开文件。添加密码,如果没有密码,不能修改文件,但可以打开,只读以及另存文件。只读推荐,通常推荐打开Excel文件的用户使用只读模式打开,这种方式仅是一种提示,并非强行保护文件。给Excel添加保护情况1:下面......
  • KBP210-ASEMI整流桥KBP210参数、封装、尺寸
    编辑:llKBP210-ASEMI整流桥KBP210参数、封装、尺寸型号:KBP210品牌:ASEMI封装:KBP-4正向电流:2A反向电压:1000V引线数量:4芯片个数:4芯片尺寸:95MIL漏电流:<5ua恢复时间:>500ns浪涌电流:60A芯片材质:正向电压:1.10V封装尺寸:如图特性:插件、薄体扁桥工作结温:-55℃~150℃包装方式......
  • pytest + yaml 框架 -39.多账号操作解决方案
    前言最近有小伙伴提到,有写场景需要用到2个账号来回切换操作该如何解决。(备注:从v1.2.4以后新版本不再公开,新功能内部VIP学员可以使用,公开版本仅解决bug,不提供新功能了。)先获取账号token前面教程有讲到全局登录一次,后面所有的请求都会拿着全局登录的账号token去访问请求。现在......
  • 工作常用的EXCEL公式 | 考勤上下班时间统计
    需求:统计考勤上下班时间,比如:8:13上班打卡,取值为8:30;9:40上班打卡,取值10:00。解决方法:上班时间:思路:当minute少于等于30分钟时,取30分钟,即为time(hour,30,0)当minute大于30分钟时,往后+30分钟,即为time(hour+1,0,0)下班时间:思路:当minute少于30分钟时,取小时上的时间,即为time(hour,......
  • NX二次开发 截图、向excel表格中插入图片 UF_DISP_create_framed_image
    简介:    NX二次开发截图、向excel表格中插入图片UF_DISP_create_framed_image截图:UF_DISP_create_framed_image插入图片intid=book->addPicture(L"F:\\ActionButton\\post_temp.bmp");sheet->setPicture(10,11,id);me.hpp内容:文章作者:里海......
  • Excel合并单元格的缺点解决方式
    背景99%的人在创建表格的一个标题,都喜欢使用合并单元格的功能但是由于使用Excel的合并单元格,在数据分析统计的时候出现了一些问题复制粘贴数据时,由于有合并单元格,不能直接复制粘贴移动整列的位置,不能快速移动使用VLOOKUP函数时,无法直接选中列区域,只能手动选中单元格区域......
  • AMD锐龙8040系列挤牙膏了!参数已出炉
    按照以往的节奏,AMD将会在明年1月初的CES展会上发布全新的锐龙8000系列移动处理器.随着时间的临近,关于锐龙8000系列的曝光也逐渐增多。日前有媒体放出了8040系列新品的产品命名和部分参数,AMD属实是挤了波牙膏。根据曝光,最顶级为锐龙98940H,和锐龙97940H一样,依然是8核心16线程,最......