pytest测试框架使用基础07 fixture—parametrize获取参数的几种常用形式

【pytest】parametrize获取参数的几种常用形式:

a.数据结构
b.文件
c.数据库
d.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的值")

输出:

============================= test session starts =============================
collecting ... collected 4 itemsparametrize01.py::test_add[1] PASSED                                     [ 25%]
a的值parametrize01.py::test_add[2] PASSED                                     [ 50%]
a的值parametrize01.py::test_add[3] PASSED                                     [ 75%]
a的值parametrize01.py::test_add[4] PASSED                                     [100%]
a的值============================== 4 passed in 0.04s ==============================Process finished with exit code 0

1.2 多个参数多个值的情况

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

示例:

@pytest.mark.parametrize("b,c,d", ([1, 2, 3], [4, 5, 6], [7, 8, 0]))
def test_add2(b, c, d):print("\nb,c,d的值分别为:", f'{b},{c},{d}')

输出:

============================= test session starts =============================
collecting ... collected 3 itemsparametrize01.py::test_add2[1-2-3] PASSED                                [ 33%]
b,c,d的值分别为: 1,2,3parametrize01.py::test_add2[4-5-6] PASSED                                [ 66%]
b,c,d的值分别为: 4,5,6parametrize01.py::test_add2[7-8-0] PASSED                                [100%]
b,c,d的值分别为: 7,8,0============================== 3 passed in 0.03s ==============================Process finished with exit code 0

二、数据结构

2.1 列表(list)形式

示例:

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, 6),(0, 8, 9)
]@pytest.mark.parametrize("a,b,c", data2)
def test_add2(a, b, c):print('\na,b,c的值分别为:', f'{a},{b},{c}')

输出:

============================= test session starts =============================
collecting ... collected 7 items
parametrize02_list.py::test_add[1] PASSED                                [ 14%]
a的值: 1
parametrize02_list.py::test_add[2] PASSED                                [ 28%]
a的值: 2
parametrize02_list.py::test_add[3] PASSED                                [ 42%]
a的值: 3
parametrize02_list.py::test_add[4] PASSED                                [ 57%]
a的值: 4
parametrize02_list.py::test_add2[1-2-3] PASSED                           [ 71%]
a,b,c的值分别为: 1,2,3
parametrize02_list.py::test_add2[4-5-6] PASSED                           [ 85%]
a,b,c的值分别为: 4,5,6
parametrize02_list.py::test_add2[0-8-9] PASSED                           [100%]
a,b,c的值分别为: 0,8,9
============================== 7 passed in 0.05s ==============================
Process finished with exit code 0

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

# 试验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')
print(list1)

输出:

D:\ApiTest3\.venv\Scripts\python.exe D:\ApiTest3\Pytest_session\test_parametrize\list_test.py 
physics
chemistry
english
artist
1
2
3
4
5
['physics', 'chemistry', 'english', 'artist', 'history']Process finished with exit code 0

2.2 字典(dictionary)形式

import pytestuserinfo = [{"username": "小李", "password": "123456"},{"username": "大白", "password": "894561"}
]@pytest.mark.parametrize('info', userinfo)
def test_add(info):print(info)

输出:

============================= test session starts =============================
collecting ... collected 2 itemsparametrize03_dic.py::test_add[info0] PASSED                             [ 50%]{'username': '小李', 'password': '123456'}parametrize03_dic.py::test_add[info1] PASSED                             [100%]{'username': '大白', 'password': '894561'}============================== 2 passed in 0.03s ==============================Process finished with exit code 0

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

# 试验2:数据字典操作
# 数据字典定义userinfo = {"username": "钟无艳","password": "54674567"
}# 字典读取
# 方法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"] = '13855455444'
print(userinfo)

输出:

D:\ApiTest3\.venv\Scripts\python.exe D:\ApiTest3\Pytest_session\test_parametrize\dic_test.py 
username
password
钟无艳
54674567
username 钟无艳
password 54674567
('username', '钟无艳')
('password', '54674567')
{'username': '钟无艳', 'password': '54674567', 'phone': '13855455444'}Process finished with exit code 0

2.3 元组(tuple)形式

# 元组形式:
import pytestdata1 = [(1, 2, 3), (4, 5, 6)]@pytest.mark.parametrize("a,b,c", data1)
def test_case1(a, b, c):print(a, b, c)

输出:

============================= test session starts =============================
collecting ... collected 2 itemsparametrize04_tuple.py::test_case1[1-2-3] PASSED                         [ 50%]1 2 3parametrize04_tuple.py::test_case1[4-5-6] PASSED                         [100%]4 5 6============================== 2 passed in 0.03s ==============================Process finished with exit code 0

三、json形式

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

  1. 通过读取.json文件来达到数据分离
  2. 使用pytest中的parametrize参数化来读取json文件的内容
  3. 通过requests来指定请求方法,请求参数等
  4. 通过返回结果来判断json文件中的response是否包含(或者相等)/断言
  5. json数据
    整体代码:
    interface.json:
{"item": [{"request": {"url": "http://192.xxx.xxx18/Account/Login","body": {"username": "lipan","password": "E10ADC*********BE56E057F20F883E","isRememberme": false,"validateCode": ""}},"response": {"status": 1,"msg": "","data": null,"datas": null,"errCode": 0}}]
}

parametrize05_json.py

# json形式:
import json
import pytest
import requests# 1 读取json文件
# 由于需要的数据在item下面一层级,所以在读取时,需要指定位置
def rade_json():return json.load(open('interface.json', 'r'))['item']# 通过pytest的parametrize参数化来使用read_json()里面的内容
@pytest.mark.parametrize('data', rade_json())
def test_json_login(data):# 通过requests来指定请求方法r = requests.post(# 通过指定read_json()里面对应的urlurl=data['request']['url'],# 通过指定read_json()里面对应的bodyjson=data['request']['body'])# 通过判断返回的json数据判断read_json()里面response内容# 通过使用assert来断言判断是否满足预期结果assert r.json()['status'] == data['response']["status"]print(r.json())if __name__ == '__main__':pytest.main('-s', '-v', 'parametrize05_json.py')

输出:

============================= test session starts =============================
collecting ... collected 1 itemparametrize05_json.py::test_json_login[data0] ============================== 1 passed in 0.42s ==============================
PASSED                     [100%]{'status': 1, 'msg': '', 'data': None, 'datas': None, 'errCode': 0}Process finished with exit code 0

四、文件

4.1 txt文件

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

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

代码如下:

# txt文件传参:
import json
import pytest
import requests# 获取权限列表方法
def get_txt():# 从文件中读取权限authoList = []# 打开txt文件txt_file = open('my_test.txt', 'r', encoding='utf-8')# 读取txt文件con = txt_file.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_txt())
def test_add_group(autho):print(autho)

4.2 csv文件

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

# 读取csv文件
file1 = open("文件名.csv", "r")
content = csv.reader(file)
file1.close()# 写入csv文件内容
file2 = open("文件名.csv""w")
write = csv.writer(file2)
file2.close()

示例,从以下csv表格中获取参数那列的值:
在这里插入图片描述

代码如下:

# csv文件传参:
import pytest
import csv# 打开文件
def get_userdata():# 登入数据列表dataList = []file1 = open('login_params.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'])

输出:

============================= test session starts =============================
collecting ... collected 3 itemsparametrize07_csv.py::test_add_group[userinfo0] PASSED                   [ 33%]test1
123456
1parametrize07_csv.py::test_add_group[userinfo1] PASSED                   [ 66%]
123456
0parametrize07_csv.py::test_add_group[userinfo2] PASSED                   [100%]test20============================== 3 passed in 0.04s ==============================Process finished with exit code 0

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文件中获取参数那一列的内容:

# Excel文件传参:
import pandas
import pandas as pd
import pytestdef get_userdata():# 打开文件df = pd.read_excel("test_login.xlsx")# row = df.loc[[0, 2]].values# print(row)# 读文件cloum = df['输入参数'].valueslist_data = cloum.tolist()print(type(list_data), list_data)return list_data@pytest.mark.parametrize("userinfo", get_userdata())
def test_add_group(userinfo):# 将其转换为字典类型userinfo_dic = eval(userinfo)print(userinfo_dic["username"])print(userinfo_dic["password"])

输出:

============================= test session starts =============================
collecting ... collected 4 itemsparametrize08_Excel.py::test_add_group[{"username":"test1", "password":"123456"}] PASSED [ 25%]test1
123456parametrize08_Excel.py::test_add_group[{"username":"", "password":"123456"}] PASSED [ 50%]
123456parametrize08_Excel.py::test_add_group[{"username":"test3", "password":""}] PASSED [ 75%]test3parametrize08_Excel.py::test_add_group[{"username":"test4", "password":""}] PASSED [100%]test4============================== 4 passed in 2.08s ==============================Process finished with exit code 0

五、数据库

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

# mysql数据库传参:import pymysql
import pytest"""
# 连接数据库
db = pymysql.connect(host="127.0.0.1", db="my_test", user="root", passwd="123456", charset="utf8")
# 访问数据库
cursor = db.cursor()
# 读取数据库对应内容
cursor.execute('select * from test_user')
data = cursor.fetchone()
print(data)
# 关闭数据库
db.close()
"""def get_db_data():# 连接数据库db = pymysql.connect(host='127.0.0.1', db='my_test', user='root', password='123456', charset='utf8')# 访问数据库cursor = db.cursor()# 查询数据cursor.execute('select username, password from test_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])

输出:

============================= test session starts =============================
collecting ... collected 3 itemsparametrize09_mysql.py::test_add_group[userinfo0] PASSED                 [ 33%]<class 'tuple'>
xiaoliu
123456parametrize09_mysql.py::test_add_group[userinfo1] PASSED                 [ 66%]<class 'tuple'>
zhangshan
456187parametrize09_mysql.py::test_add_group[userinfo2] PASSED                 [100%]<class 'tuple'>
chengyi
4536187============================== 3 passed in 0.08s ==============================Process finished with exit code 0

六、配置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('my_test.txt', 'r', encoding='utf-8')# 读取txt文件con = f1.read()resule = con[1: -1].split(',')for autho in resule:authoList.append(autho[1: -1])return authoList

同目录下其他文件可直接引用(parametrize10_conftest.py)

import pytestclass TestDemo:def test_add_group(self, get_autho):for autho in get_autho:print(autho)if __name__ == '__main__':pytest.main('parametrize10_conftest.py', '-s')

七、分析总结

  1. 私有数据放在对于的脚本中进行统一维护。
  2. 共有的数据:
    方案1:
    – 如果数据种类比较少,不超过5类以上
    –可以放在一个独立的脚本中,编写DDT的方法即可。
    方案2:
    – 需要的数据种类非常多,可以分类存放
    – 建议一个com数据层,创建多个.py文件
    方案3:
    –数据种类不多,复用性特别高
    –直接放在conftest.py中
  3. 一般来说,数据读取的方法和数据文件在相同路径下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/739884.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日OJ题_牛客另类加法_力扣不用加号的加法

目录 另类加法 不用加号的加法 另类加法 另类加法__牛客网 class UnusualAdd {public:int addAB(int A, int B) {while (B ! 0) {int C ((B & A) << 1); // 进位A ^ B; // 无进位相加B C; // 直到进位不为0就跳出循环}return A;} };不用加号的加法 面试题 17.0…

WebSocket:实现客户端与服务器实时通信的技术

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

3、Design Script之对象类型

布尔值 布尔值Boolean——true/false是Design Script的常量对象&#xff0c;用于表示真/假值 boolTrue true; boolFalse false&#xff1b; 在数字环境中&#xff0c;布尔值的行为类似于整数0和1 布尔值也可以作为Yes和No来引用 数字 int(integer)——整数 Double&#…

JS的对象

目录 对象&#xff1a;object 对象的创建&#xff1a; 利用对象字面量创建对象&#xff1a; 使用new来进行创建对象&#xff1a; 利用构造函数来创建对象&#xff1a; new的执行&#xff1a; 对象属性的遍历&#xff1a;for in ------ 相当于JAVA的工具类&#xff0c;直…

docker学习入门篇

1、docker简介 docker官网&#xff1a; www.docker.com dockerhub官网&#xff1a; hub.docker.com docker文档官网&#xff1a;docs.docker.com Docker是基于Go语言实现的云开源项目。 Docker的主要目标是&#xff1a;Build, Ship and Run Any App, Anywhere(构建&…

每日一题——LeetCode2129.将标题首字母大写

方法一 个人方法 将字符串转为数组&#xff0c;遍历数组&#xff0c;对数组的每一个元素&#xff0c;先全部转为小写&#xff0c;如果当前元素长度大于2&#xff0c;将第一个字符转为大写形式 var capitalizeTitle function(title) {titletitle.split( )for(let i0;i<tit…

概要了解postman、jmeter 、loadRunner

postman还蛮好理解的&#xff0c;后续复习的话着重学习关联接口测试即可&#xff0c;感觉只要用几次就会记住&#xff1a; 1 从接口的响应结果当中提取需要的数据 2 设置成环境变量/全局变量&#xff08;json value check 、set environment para 3写入到下一个接口的请求数据中…

工具-百度云盘服务-身份认证

目标 通过百度网盘API的方式去获取网盘中的文件&#xff0c;要实现这的第一步就是需要获取网盘的权限。资料(参考) 如果期望应用访问用户的网盘文件&#xff0c;则需要经过用户同意&#xff0c;这个流程被称为“授权”。百度网盘开放平台基于 OAuth2.0 接入授权。OAuth2.0 是…

关于分布式分片,你该知道的事儿

关于分布式分片&#xff0c;你该知道的事儿 前言一、关于分片方式的那些事儿1.1 按照Hash划分1.2 按照区间范围划分1.3 按照数据量划分1.4 来些例子1.4.1 Redis的分片划分1.4.2 Mongo的分片划分 二、关于分区再平衡的那些事儿2.1 基于固定分片数量2.2 基于动态分片数量2.3 基于…

计算机毕业设计 | SSM 在线毕业论文管理 线上考试成绩教务管理系统(附源码)

1&#xff0c; 绪论 研究背景 系统管理也都将通过计算机进行整体智能化操作&#xff0c;对于论文管理系统所牵扯的管理及数据保存都是非常多的&#xff0c;例如管理员&#xff1b;首页、系统用户&#xff08;管理员、学生、老师&#xff09;模块管理&#xff08;指导教师、课…

为什么不要使用elasticsearch

互联网上有很多文章&#xff0c;都在讲为什么要使用elasticsearch&#xff0c;却很少有人讲为什么不要使用elasticsearch。作为深入研究elasticsearch四年&#xff0c;负责公司万亿级别检索的操盘手&#xff0c;借着这篇文章&#xff0c;给大家分享一下&#xff0c;为什么不要使…

Vue3全家桶 - VueRouter - 【2】重定向路由

重定向路由 在路由规则数组中&#xff0c;可采用 redirect 来重定向到另一个地址&#xff1a; 通常是将 / 重定向到 某个页面&#xff1b; 示例展示&#xff1a; router/index.js&#xff1a;import { createRouter, createWebHashHistory, createWebHistory } from vue-route…

混合测试写一写

题目 服务器IP地址规划&#xff1a;client&#xff1a;12.0.0.12/24&#xff0c;网关服务器&#xff1a;ens36:12.0.0.1/24、ens33&#xff1a;192.168.44.1/24&#xff0c;Web1&#xff1a;192.168.44.30/24&#xff0c;Web2&#xff1a;192.168.44.50/24&#xff0c;Nginx&am…

iOS应用内的沙盒目录

iOS系统的沙盒机制规定每个应用都只能访问当前沙盒目录下面的文件&#xff0c;在开发中常常需要数据存储的功能&#xff0c;比如存取文件&#xff0c;归档解档等&#xff0c;因此有必要熟悉沙盒目录及其作用。 Documents目录 开发者可以将应用程序的数据文件保存在这个目录下.…

bzm - Concurrency Thread Group 阶梯式压测

bzm - Concurrency Thread Group 不是JMeter的官方插件&#xff0c;而是一种由Blazemeter提供的高级线程组插件&#xff0c;它提供了更灵活的并发性能测试设置。它可以在不同的时间内并发执行不同数量的线程&#xff0c;模拟不同的负载场景 插件下载地址&#xff1a;Download …

加速 Webpack 构建:提升效率的秘诀

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

网络通信另个角度的认识(进程间通信),端口号(为什么要有,和pid的关系,分类,如何封装,和进程的定位原理+对应关系),客户端如何拿到服务端的port

目录 另一个角度认识网络通信 端口号 引入 -- 为什么要有端口号 问题 解决 端口号和pid 举例 介绍 分类 知名端口 注册端口 动态端口 客户端如何知道服务端的端口号 封装端口号 定位原理 进程和端口号的对应关系 数据如何被上层进程读到 另一个角度认识网络…

【Java EE初阶十一】多线程进阶二(CAS等)

1. 关于CAS CAS: 全称Compare and swap&#xff0c;字面意思:”比较并交换“&#xff0c;且比较交换的是寄存器和内存&#xff1b; 一个 CAS 涉及到以下操作&#xff1a; 下面通过语法来进一步进项说明&#xff1a; 下面有一个内存M&#xff0c;和两个寄存器A,B; CAS(M,A,B)&am…

吴恩达机器学习-可选实验:梯度下降逻辑回归(Gradient Descent for Logistic Regression)

文章目录 目标数据集Logistic梯度下降梯度下降实现计算梯度&#xff0c;代码描述 另一个数据集 目标 在本实验中&#xff0c;你将: 更新逻辑回归的梯度下降在一个熟悉的数据集上探索梯度下降使用梯度下降给逻辑回归更新参数 import copy, math import numpy as np %matplotl…

怎么判断你的模型是好是坏?模型性能评估指标大全!

模型性能评估指标&#xff0c;大家一定不陌生&#xff01;很多小伙伴们都说难&#xff0c;但是它真的很重要很重要很重要&#xff01;它会对我们的模型有很多的指导&#xff0c;也会给我们真正做模型的时候提供一些指导性的思想&#xff0c;不然我们看到别人的东西只能跟着人家…