Pytest测试用例参数化

news2024/9/25 17:17:26

@pytest.mark.parametrize('参数名1,参数名2...参数n', [(参数名1_data1,参数名2_data1...参数名n_data1),(参数名1_data2,参数名2_data2...参数名n_data2)])

场景:

定义一个登录函数test_login,传入参数为name,password,需要用多个账号去测试登录功能

# test_mod6.py
import pytest

@pytest.mark.parametrize("name,password",[("Jie",223456),("Jack",111111),("Jame",222222)])
def test_login(name,password):
	db_data = {"name":['Jie','Jack','Jame'],"password":{'Jie':'123456','Jack':'111111','Jame':'222222'}}
	if name in db_data["name"] and str(password) == db_data["password"][name]:
		print(f"{name} 成功登录系统!")
	elif name in db_data["name"] and str(password) != db_data["password"][name]:
		print(f"{name}账号,密码输出错误,请重新输出!")
	else:
		print(f"{name} 该账号不存在,请输入正确的账号!")

 上述代码执行结果:

命令行:pytest -vs test_mod6.py
结果为:
test_mod6.py::test_login[Jie-223456] Jie账号,密码输出错误,请重新输出!
PASSED
test_mod6.py::test_login[Jack-111111] Jack 成功登录系统!
PASSED
test_mod6.py::test_login[Jame-222222] Jame 成功登录系统!
PASSED

========================================================================================== 3 passed in 0.03s ===========================================================================================

通过@pytest.mark.parametrize(参数名,测试数据 )装饰器,能够对装饰函数实现参数化测试,提高代码复用率;通过parametrize中传入参数名和测试数据来实现参数化调用测试用例;

parametrize中的参数名对应测试函数中的传入参数名 name ,password;

parametrize中的测试数据是一个list类型 list中存入多个(name,password)元祖形式的测试数据,[("Jie",223456),("Jack",111111),("Jame",222222)]

多个parametrize组合使用

@pytest.mark.parametrize("password",[223456,111111,34567])
@pytest.mark.parametrize("name",["Jie","Jame"])
def test_login(name,password):
	db_data = {"name":['Jie','Jack','Jame'],"password":{'Jie':'123456','Jack':'111111','Jame':'222222'}}
	if name in db_data["name"] and str(password) == db_data["password"][name]:
		print(f"{name} 成功登录系统!")
	elif name in db_data["name"] and str(password) != db_data["password"][name]:
		print(f"{name}账号,密码输出错误,请重新输出!")
	else:
		print(f"{name} 该账号不存在,请输入正确的账号!")
命令行:pytest -vs test_mod6.py
结果为:
test_mod6.py::test_login[Jie-223456] Jie账号,密码输出错误,请重新输出!
PASSED
test_mod6.py::test_login[Jie-111111] Jie账号,密码输出错误,请重新输出!
PASSED
test_mod6.py::test_login[Jie-34567] Jie账号,密码输出错误,请重新输出!
PASSED
test_mod6.py::test_login[Jame-223456] Jame账号,密码输出错误,请重新输出!
PASSED
test_mod6.py::test_login[Jame-111111] Jame账号,密码输出错误,请重新输出!
PASSED
test_mod6.py::test_login[Jame-34567] Jame账号,密码输出错误,请重新输出!
PASSED

================================================================================== 6 passed in 0.21s ===================================================================================

通过多个parametrize的组合,可实现参数化组合后调用测试函数,构造不同测试数据的多场景测试

YAML文件

YAML 是专门用来写配置文件的通用数据串行化格式语言,非常简洁和强大

基本语法:

1、yml文件以缩进代表层级关系

2、缩进空格的个数不重要,只要相同层级的元素左对齐即可

3、大小写敏感

4、数据格式为,名称:(空格)值

支持的数据结构:

  • 对象:键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary)
  • 数组:一组按次序排列的值,又称为序列(sequence) / 列表(list)
  • 纯量(scalars):单个的、不可再分的值(数字、字符串、布尔值)
  • # 表示注释,从这个字符一直到行尾,都会被解析器忽略。

 在Pycharm中新建一个YML文件

 

 

项目文件夹右键-【new】-【File】-输入 文件名.yml 回车即可生成一个空的yml文件

分别介绍YML文件中的三种数据结构

  1. 对象(键值对的集合,又称为映射(mapping)/ 哈希(hashes) / 字典(dictionary))
name: Jie  # 对象的键值对,使用冒号结构表示,注:冒号后需要加空格
age : 21
address: 上海浦东

读取YAML文件 

import yaml

def read_yaml():
	with open("D:\\Buyer_test_code\\testteach\\testdatas.yml",encoding="utf-8") as f:
		f = yaml.safe_load(f)
		return f


if __name__ == '__main__':
	y = read_yaml()
	print(y)

运行结果:
{'name': 'Jie', 'age': 21, 'address': '上海浦东'}

 2.数组

- Jack 	# 注:-后面需要空格
- Jame
- Flak

通过 safe_load() 读取结果

['Jack', 'Jame', 'Flak']
-
  - Jack
  - Jame
  - Flak
-
  - 1
  - 2
  - 3
-
  - python
  - java
  - C++
[['Jack', 'Jame', 'Flak'], [1, 2, 3], ['python', 'java', 'C++']]

复合结构

对象与数组的结合

name:
  - Jie
  - Jack
  - Jame
password:
  Jie: 223456
  Jack: 111111
  Jame: 222222
{'name': ['Jie', 'Jack', 'Jame'], 'password': {'Jie': 223456, 'Jack': 111111, 'Jame': 222222}}

None 用~表示

name: ~
{'name': None}

用!!强制转换类型

name:
  - Jie
  - Jack
  - Jame
password:
  Jie: !!str 223456  # !!str 强制把int转换为str类型
  Jack: !!str 111111
  Jame: 222222
{'name': ['Jie', 'Jack', 'Jame'], 'password': {'Jie': '223456', 'Jack': '111111', 'Jame': 222222}}

通过YAML文件实现参数化

-
  - Jie
  - 223456
-
  - Jack
  - 111111
-
  - Jame
  - 222222

  # 在python输出格式:[['Jie', 223456], ['Jack', 111111], ['Jame', 222222]]
import pytest
from test_demo7 import read_yaml

datas = read_yaml("D:\\Buyer_test_code\\testteach\\testdatas.yml")
@pytest.mark.parametrize("name,password",datas)
def test_login(name,password):
	db_data = {"name":['Jie','Jack','Jame'],"password":{'Jie':'123456','Jack':'111111','Jame':'222222'}}
	if name in db_data["name"] and str(password) == db_data["password"][name]:
		print(f"{name} 成功登录系统!")
	elif name in db_data["name"] and str(password) != db_data["password"][name]:
		print(f"{name}账号,密码输出错误,请重新输出!")
	else:
		print(f"{name} 该账号不存在,请输入正确的账号!")

执行结果:

test_mod6.py::test_login[Jie-223456] Jie账号,密码输出错误,请重新输出!
PASSED
test_mod6.py::test_login[Jack-111111] Jack 成功登录系统!
PASSED
test_mod6.py::test_login[Jame-222222] Jame 成功登录系统!
PASSED

=================================================================================== 3 passed in 0.18s ====================================================================================

通过YAML文件,可以做到测试数据与测试代码的分离,进一步提高代码的复用性灵活性 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

相关文章

八. 实战:CUDA-BEVFusion部署分析-学习spconv的优化方案(Implicit GEMM conv)

目录 前言0. 简述1. 什么是Implicit GEMM Conv2. Explicit GEMM Conv3. Implicit GEMM Conv4. Implicit GEMM Conv优化5. spconv和Implicit GEMM Conv总结下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》,链接。记录下个人学习笔记&#xff0…

量化交易学习4(投资组合基本认识)

1 如何衡量投资组合的收益率 1.1 投资组合收益率的计算方法 1.2 投资组合的绝对收益率和相对收益率 2 如何衡量投资组合的风险 2.1 风险的定义 风险是指在未来可能发生的不确定性事件所带来的潜在损失。 在投资领域中,风险通常指投资所面临的不确定性和潜在的损失…

SECS/GEM稳定可靠就用金南瓜

1、开发模式 secs协议的开发模式通常分两种: 1、完全自主开发。(开发周期长,需要secs/gem的详细协议文档,完全自主开发工作量,保守估计也要一年的工作量,还不包含工程师离职,现场测试时间&…

车企销售官网搭建流程

引言 近期在整理车企销售官网相关的一些材料时,由于之前也没接触过相关的业务,所以也是一边学习一遍整理,将自己理解官的网搭建流程给梳理出来,供与大家交流讨论。 官网搭建流程 官网搭建流程我分为两大步:网站Demo设计和网站搭建部署,具体流程如下图所示。 流程的具体…

原型中concat()-合并连接

concat() 方法主要用于连接两个或多个数组。它不会改变原有的数组,而是会返回一个包含这些数组元素的新的数组。 学习中。。。

发布3-数据库模式选择

JRT提供了Cache、IRIS、PostGreSql、人大金仓几种数据库支持。这四种数据库都可以使用,并且都有代码生成器。 对有IRIS经验的人建议的开发数据库模式是基于IRIS开发、然后用M生成导表SQL到PostGreSql和人大金仓测试,因为M调表方便,这样适应表…

Java数组的遍历

目录 数组的遍历使用for循环遍历数组使用for-each循环遍历数组使用while循环和迭代器遍历数组使用Java 8的流API遍历数组 数组遍历的应用求数组中的最大值查询数组中指定位置的元素将查指定元素对应的索引的功能提取为方法添加数组元素删除数组元素 数组的遍历 Java数组的遍历…

2024济南生物发酵展:会议日程安排和技术装备亮点预告

2024济南发酵展/2024生物发酵展/2024山东发酵展/2024济南生物制药展/2024生物技术展/2024食品设备展/2024食品加工展 由中国生物发酵产业协会主办,上海信世展览服务有限公司承办的2024第12届国际生物发酵产品与技术装备展览会(济南)将于3月5-…

【Go语言成长之路】引入外部包

文章目录 引入外部包一、查找需要引用的包二、引入需要导入的包三、运行程序 引入外部包 ​ 实现Demo: 引用rsc.io/quote包来实现打印输出 一、查找需要引用的包 ​ 比如说我现在想要找一个quote的包,那么可以通过如下步骤进行操作: 访问pkg.go.dev,并…

基于深度学习的多功能人脸识别系统

文章目录 前言一、用户登录设计二、图像采集设计1.本地视频2.摄像头3.RTSP 三、人脸识别原理1.人脸库的建立及训练2. 人脸检测算法的实现3. 人脸识别算法的实现 四、数据存储设计1.SQLite32.Excel 五、网络通信设计1.邮件通知2.阿里云 六、其他不重要功能展示1.年龄、性别和表情…

【已解决】Ubuntu64位无法运行32位ELF文件的问题

问题起因 因为在做一道逆向题,发现题目给的文件是32位elf文件,所以想在Linux下执行一下,然后发现会报错。 于是查了一下资料,发现报错的原因是64位的Ubuntu无法直接运行32位的程序,需要下载兼容32位的库。 解决方法…

单细胞scATAC-seq测序基础知识笔记

单细胞scATAC-seq测序基础知识笔记 单细胞ATAC测序前言scATAC-seq数据怎么得出的? 该笔记来源于 Costa Lab - Bioinformatics Course 另一篇关于scRNA-seq的请移步 单细胞ATAC测序前言 因为我的最终目的是scATAC-seq的数据,所以这部分只是分享下我刚学…

JavaScript鼠标事件入门

🧑‍🎓 个人主页:《爱蹦跶的大A阿》 🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 鼠标事件是Web开发中最为重要的交互方式之一。本文将带领大家入门常用…

分库分表 21 条法则,hold 住!

大家好~今天给大家分享分库分表的 21 条法则 我们结合具体业务场景,以t_order表为例进行架构优化。由于数据量已经达到亿级别,查询性能严重下降,因此我们采用了分库分表技术来处理这个问题。具体而言,我们将原本的单库…

[SWPUCTF 2021 新生赛]easyrce

经典的RCE题目看到这个eval可以想到使用系统命令执行 我们查看当前文件夹下的文件只有index.php 一般放在/目录下 我们查看 看到一个类似flag的文件 我们查看cat找到flag

顺序表和链表对应的经典算法

一,移除元素 思路:定义一个循环遍历数组,如果遇到的不是val就记录下来这个元素,如果不是就跳过 定义两个指针,一个用于保留非val元素,一个用于遍历nums int removeElement(int* nums, int numsSize, int …

基于WordPress开发微信小程序1:搭建Wordpress

2年前,在知乎上提问:多数公司为什么宁愿自研也不用wordpress二次开发建站? - 知乎 (zhihu.com),收到了,很多回答 自己打算做一下提升,便有了自己基于wordpress开发微信小程序的想法 项目定位 基于wordpre…

ruoyi(若依)(el-menu也可参考)菜单栏过长显示省略号才显示气泡

一、背景 若依前后端分离的版本,新版本中优化了菜单名称过长悬停显示标题,但是是悬浮所有长度大于5的标题。可以查看提交记录:https://gitee.com/y_project/RuoYi-Cloud/commit/99932d91c0144da9f34f5bb05683cc0b86303217 但是我希望是只悬浮…

centos6和centos7无网络环境下安装fontconfig,配置中文字体

以centos6为例 1、查看系统版本 cat /etc/redhat-release 2、访问https://vault.centos.org下载相关rpm包 找到对应系统版本 3、下载相应的rpm包上传到服务器 dejavu-fonts-common-2.33-1.el6.noarch.rpm dejavu-sans-fonts-2.33-1.el6.noarch.rpm fontconfig-2.8.0-5.el6.…

【Python小游戏】五子棋小游戏(完整代码)

文章目录 写在前面Tkinter简介五子棋小游戏游戏介绍程序设计运行结果注意事项写在后面写在前面 本期内容:基于tkinter开发一个五子棋小游戏 实验环境 python3.11及以上pycharmtkinterTkinter简介 Tkinter是Python中最常用的图形用户界面(GUI)库之一,用于创建窗口、对话框…