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

发布时间 2023-11-28 13:33:20作者: 秒秒开心

一、问题

pytest参数化如何读取csv文件数据?

 

二、回答

有两种获取方式:
1.列表嵌套列表的方式
2.列表嵌套字典的方式

更加推荐第2种列表推荐字典的方式,更好用。

data\id.csv数据为:

代码如下所示:

 1 import csv  
 2 import os  
 3   
 4 import openpyxl  
 5   
 6   
 7 def getFileDir(*args):  
 8     '''  
 9     获取工程中文件路径,可以在根目录下面新建一个文件,在文件中填写该方法  
10     :return:返回文件所在路径  
11     '''    
12     #获取python工程的根目录,它获取rootPath的目录即为根目录  
13     rootPath = os.path.dirname(__file__)  
14     filePath = os.path.join(rootPath, *args)  
15     return filePath  
16   
17 def getCsvListData(*file,header=True):  
18     '''  
19     第1种:获取csv文件内容,返回嵌套list结果  
20     :param file: 参数化文件路径  
21     :param header: 参数化文件第一行是否有头部  
22     :return: list嵌套list [[],[],[]]  
23     '''    
24     idsCsvList = []  
25     with open(getFileDir(*file), encoding="utf-8") as f:  
26         readContent = csv.reader(f)  
27         if header:  
28             #如果有头部,跳过头部  
29             next(readContent)  
30         for item in readContent:  
31             idsCsvList.append(item)  
32         return idsCsvList  
33   
34 def getCsvDictData(*file):  
35     '''  
36     第2种:获取csv文件内容,返回list嵌套dict结果  
37     :param file: 参数化文件路径  
38     :return: list嵌套dict, [{},{},{}]    
39     '''    
40     idsCsvDictList = []  
41     with open(getFileDir(*file), encoding="utf-8") as f:  
42         readContent = csv.DictReader(f)  
43         for item in readContent:  
44             idsCsvDictList.append(item)  
45         return idsCsvDictList

上面两个方法一个是列表嵌套列表,一个是列表嵌套字典的封装,需要注意:
getCsvListData即列表嵌套列表的方式,需要判断csv表格第一行是否是头部,如果是需要跳过,这样读出来的内容才都是数据,如果不是则不需要跳过;
而getCsvDictData即列表嵌套字典的方式,则要求csv表达第一行必须是头部,且不需要跳过,它会把第一行的头部当作字典的key来处理。

封装getCsvListData,getCsvDictData即可调用,代码如下:

 1 import pytest  
 2 import requests  
 3   
 4 from utils import getCsvListData, getCsvDictData  
 5   
 6 host = "http://66.66.66.66:9000"  
 7   
 8 @pytest.mark.flaky(reruns=3,reruns_delay=2)  
 9 @pytest.mark.parametrize("id,message",getCsvListData("data","id.csv"))  
10 def testGetCsvMsg(id,message):  
11     '''  
12     普通的GET类型接口,csv获取list嵌套list参数化数据
13     :return:  
14     '''    
15     getUrl = host + "/pinter/com/getSku"  
16     paramContent = {"id":id}  
17     response = requests.get(getUrl,params=paramContent)  
18     print(response.json())  
19     print(response.text)  
20     # assert response.json().get("code") == '0'  
21     assert response.json().get("message") == message  
22   
23 #参数化,csv获取list嵌套dict参数化数据  
24 #失败重试,健壮性,最大3次,每次延迟2秒  
25 @pytest.mark.flaky(reruns=3,reruns_delay=2)  
26 @pytest.mark.parametrize("param",getCsvDictData("data","id.csv"))  
27 def testGetCsvMsg(param):  
28     '''  
29     普通的GET类型接口,csv获取list嵌套dict参数化数据  
30     :return:  
31     '''    
32     getUrl = host + "/pinter/com/getSku"  
33     paramContent = {"id":param.get("id")}  
34     response = requests.get(getUrl,params=paramContent)  
35     print(response.json())  
36     print(response.text)  
37     assert response.json().get("message") == param.get("message")