【pytest】parametrize获取参数的几种常用形式--数据结构/文件/数据库/conftest.py配置

前言:pytest提供了一种标签型的传参方法@pytest.mark.parametrize('参数名1, 参数名2', ([参数值1, 参数值2])),只需要在方法上面声明就行了,非常方便。下面就介绍一下几种常用获取参数的方法。

目录

一、直接在标签上传参

1.1 一个参数多个值

1.2 多个参数多个值的情况

二、数据结构

2.1 列表形式

2.2 字典形式

2.3 元组形式

三、json串

四、文件

4.1 txt文件

4.2 csv文件

4.3 Excel 文件读取

五、数据库

六、配置conftest.py文件

七、分析总结


一、直接在标签上传参

1.1 一个参数多个值

@ pytest.mark.parametrize("参数", (参数值1, 参数值2, 参数值3))

示例:

import pytest

# 单个参数的情况
@pytest.mark.parametrize("a", (1, 2, 3, 4))
def test_add(a):  # 作为用例参数,接收装饰器传入的数据
    print('\na的值:', a)

输出:

a的值: 1
a的值: 2
a的值: 3
a的值: 4

1.2 多个参数多个值的情况

@ pytest.mark.parametrize("参数a, 参数b", ([a1, b1], [a2, b2], [a3, b3]))

示例:

import pytest

# 2.2 多个参数多个值得情况
@pytest.mark.parametrize('a, b, c', ([1, 2, 3], [4, 5, 9], [7, 8, 15]))
def test_add(a, b, c):
    print('\na,b,c的值分别为:', f"{a},{b},{c}")

输出:

a,b,c的值分别为: 1,2,3
a,b,c的值分别为: 4,5,9
a,b,c的值分别为: 7,8,15

二、数据结构

2.1 列表形式

import pytest

# 单个参数的情况
data1 = [1, 2, 3, 4]
@pytest.mark.parametrize("a", data1)
def test_add(a):
    print('\na的值:', a)

# 多个参数多个值得情况
data2 = [(1, 2, 3), (4, 5, 9), (7, 8, 15)]
@pytest.mark.parametrize('a, b, c', data2)
def test_add(a, b, c):
    print('\na,b,c的值分别为:', f"{a},{b},{c}")

列表的基本操作:列表读取,列表添加

# 试验1:列表操作
# 列表定义
list1 = ['physics', 'chemistry', 'english', 'artist']
list2 = [1, 2, 3, 4, 5]
# 列表读取
# 方法1
for data in list1:
    print(data)
    
# # 方法2
for i in range(0, len(list2)):
    print(list2[i])

# 列表元素追加
list1.append('history')

2.2 字典形式

import pytest

userinfo = [{"username": "张三", "password": "12345"}, {"username": "李四", "password": "54321"}]

@pytest.mark.parametrize('info', userinfo)
def test_add(info):
    print(info)

 输出:

{'username': '张三', 'password': '12345'}
{'username': '李四', 'password': '54321'}

关于字典的一些基本操作如下:字典键值的获取,字典元素的追加

# 试验2:数据字典操作
# 数据字典定义
userinfo = {"username": "张三", "password": "李四"}
# 字典读取
# 方法1:读取key
for key in userinfo.keys():
    print(key)
# 方法2:读取value
for val in userinfo.values():
    print(val)
# 方法3:读取所有内容
for key in userinfo:
    print(key, userinfo[key])
# 方法4:读取键值对
for data in userinfo.items():
    print(data)
# 字典元素追加
userinfo["phone"] = "13811122222"
print(userinfo)

输出:

username
password
张三
李四
username 张三
password 李四
('username', '张三')
('password', '李四')
{'username': '张三', 'password': '李四', 'phone': '13811122222'}

2.3 元组形式

import pytest

data2 = [(1, 2, 3), (4, 5, 6)]

@pytest.mark.parametrize('a, b, c', data2)
def test02(a, b, c):
    print(a, b, c)

输出:

1 2 3
4 5 6

三、json串

有些数据是通过json文件来保存的,我们可以读取json文件的内容,然后将其转换为字典格式传参,下面讲一下如何从json文件读取参数。

给定如下json文件,想要获取formdata中的值

 代码如下:

# 试验3:json文件操作
import json
# 读取json文件
jsonfile = open("interface.json", "r", encoding="utf-8")
# 转换数据类型
jsondict = json.load(jsonfile)  # 将字符串类型转换为字典类型
# print(type(jsondict))
# 提取json文件中的内容
# 找到item里面的内容
# print(jsondict['item'])
for data in jsondict['item']:
    # print(data['request'])
    for d in data['request']['body']['formdata']:
        # print(d)
        for key in d:
            print(key, d[key])

输出:

key username
value tester1
type text

四、文件

4.1 txt文件

file = open("文件名.txt", "r", encoding="utf-8")
content = file.read()
print(content)

示例,从下面txt文件中获取所有权限然后传参:

代码如下:

import pytest

# 获取权限列表方法
def get_autho():
    # 从文件中读取权限
    authoList = []
    # 打开txt文件
    f1 = open("../com_DDT/author.txt", "r", encoding="utf-8")
    # 读取txt文件
    con = f1.read()
    # print(con)
    result = con[1: -1].split(', ')
    for autho in result:
        authoList.append(autho[1:-1])
    # print(authoList)
    return authoList

@pytest.mark.parametrize('autho', get_autho())
def test_add_group(autho):
    print(autho)

4.2 csv文件

读取csv文件要导入csv库,基本格式如下:

import csv

# 读取csv文件
file1 = open("文件名.csv", "r")
content = csv.reader(file)
file1.close()

# 写入csv文件内容
file2 = open("文件名.csv", "w")
write = csv.writer(file2)
file2.close()

示例,从以下csv表格中获取参数那列的值:

 代码如下:

import pytest
import csv

# 试验2:csv文件操作
# 打开文件
def get_userdata():
    # 登录数据列表
    dataList = []
    file1 = open("../DDT_test/testcase.csv", "r")
    # 读文件
    readers = csv.reader(file1)
    # 跳过首行
    readers.__next__()
    for row in readers:
        # print(type(row[2]))
        # 将字符串类型转为字典类型
        userdata = eval(row[2])
        # print(type(userdata),userdata)
        dataList.append(userdata)
    # print(dataList)
    return dataList


@pytest.mark.parametrize('userinfo', get_userdata())
def test_add_group(userinfo):
    print(userinfo['username'])
    print(userinfo['password'])
    print(userinfo['state'])

4.3 Excel 文件读取

读取Excel文件要导入pandas库,基本格式如下:

# 导入类库
import pandas as pd

# 读取Excel
df = pd.read_excel("文件名.xlsx")

# 提取对应行的内容
row = df.loc[[1, 3]].values  # 从0开始,0是首行,所以这里读取的是第1行和第4行的内容

# 提取对应列的内容
colum = df['列的标题'].values

示例,从以下Excel文件中获取参数那一列的内容:

 代码如下:

import pandas as pd
import pytest

# 试验3:excel文件操作
def get_userdata():
    # 打开文件
    df = pd.read_excel('../DDT_test/testcase.xlsx')
    # row = df.loc[[0, 2]].values
    # print(row)
    # 读文件
    cloum = df['输入参数'].values
    # print(type(cloum))
    listdata = cloum.tolist()
    # print(type(listdata), listdata)
    return listdata

@pytest.mark.parametrize('userinfo', get_userdata())
def test_add_group(userinfo):
    # print(type(userinfo))  # 输入的是字符串类型
    # 将其转换为字典类型
    userinfo_dic = eval(userinfo)
    print(userinfo_dic['username'])
    print(userinfo_dic['password'])

五、数据库

读取数据库文件要导入pymysql库,基本格式如下:

# 导入类库
import pymysql

# 数据库连接
db = pymysql.connect("IP", "用户名", "密码", "数据库名", charset='utf8')  # 注意是utf8

# 数据库访问
cursor = db.cursor

# 读取数据库对应内容
cursor.execute("SQL命令")
data = cursor.fetchone()

# 关闭数据库
db.close()

示例如下:

import pytest
import pymysql

def get_db_data():
    # 连接数据库
    db = pymysql.connect(host="127.0.0.1", db="jwmall", user="root", passwd="123456", charset="utf8")
    # 访问数据库
    cursor = db.cursor()
    cursor.execute("select username,password from mmall_user")
    data = cursor.fetchall()
    print(data)  # 取出的数据类型是元组
    # 关闭数据库
    db.close()
    return data


@pytest.mark.parametrize('userinfo', get_db_data())
def test_add_group(userinfo):
    # print(type(userinfo))  # 输入的是元组类型
    print(userinfo[0])
    print(userinfo[1])

六、配置conftest.py文件

如果有多处文件都要使用同一个数据,可以将数据放在conftest.py文件下,与fixture固件结合,其他文件就可以直接使用,而不需要导入文件了。

注意点:

  • conftest.py文件名字是固定的,不可以做任何修改
  • conftest.py文件所在目录必须存在__init__.py文件
  • conftest.py文件不能被其他文件导入
  • 所有同目录测试文件运行都会执行conftest.py文件
  • 用了fixture固件,方法上就不能再使用parametrize标签了

示例:在conftest.py文件中

# conftest.py文件

import pytest


# 获取权限列表方法
@pytest.fixture(scope='session')
def get_autho():
    # 从文件中读取权限
    authoList = []
    # 打开txt文件
    f1 = open("../com_DDT/author.txt", "r", encoding="utf-8")
    # 读取txt文件
    con = f1.read()
    # print(con)
    result = con[1: -1].split(', ')
    for autho in result:
        authoList.append(autho[1:-1])
    return authoList

同目录下其他文件可直接引用:

import pytest

class Test_demo():
    def test_add_group(self, get_autho):
        for autho in get_autho:
            print(autho)

if __name__ == '__main__':
    pytest.main(['self_demo.py', '-s'])

七、分析总结

1、私有数据放在对于的脚本中进行统一维护。

2、共有的数据:

  • 方案1:
    1. 如果数据种类比较少,不超过5类以上
    2. 可以放在一个独立的脚本中,编写DDT的方法即可。
  • 方案2:
    1. 需要的数据种类非常多,可以分类存放
    2. 建议一个com数据层,创建多个.py文件
  • 方案3:
    1. 数据种类不多,复用性特别高
    2. 直接放在conftest.py中

3、一般来说,数据读取的方法和数据文件在相同路径下

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BetterFate!

爱你哦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值