Pytest测试用例参数化

@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 yamldef read_yaml():with open("D:\\Buyer_test_code\\testteach\\testdatas.yml",encoding="utf-8") as f:f = yaml.safe_load(f)return fif __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: 223456Jack: 111111Jame: 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 111111Jame: 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_yamldatas = 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.mzph.cn/news/665354.shtml

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

相关文章

JAVA方法引用:

方法引用的出现原因在使用Lambda表达式的时候,我们实际上传递进去的代码就是一种解决方案:拿参数做操作那么考虑一种情况:如果我们在Lambda中所指定的操作方案,已经有地方存在相同方案,那是否还有必要再写重复逻辑呢&a…

Java SWT Composite 绘画

Java SWT Composite 绘画 1 Java SWT2 Java 图形框架 AWT、Swing、SWT、JavaFX2.1 Java AWT (Abstract Window Toolkit)2.2 Java Swing2.3 Java SWT (Standard Widget Toolkit)2.4 Java JavaFX 3 比较和总结 1 Java SWT Java SWT(Standard Widget Toolkit&#xff…

02 使用jdk运行第一个java程序:HelloWorld

使用jdk运行第一个java程序 1 HelloWorld小案例1.1 编写流程1.2 错误示例 首先在CMD命令行里面,使用javac xxxx.java, 进行编译,其中会有报错; 然后生成xxxx.class 文件,然后使用java xxxx.class 进行运行。 1 HelloWo…

瑞_23种设计模式_抽象工厂模式

文章目录 1 抽象工厂模式(Abstract Factory Pattern)1.1 概念1.2 介绍1.3 小结1.4 结构 2 案例一2.1 案例需求2.2 代码实现 3 案例二3.1 需求3.2 实现 4 总结4.1 抽象工厂模式优缺点4.2 抽象工厂模式使用场景4.3 抽象工厂模式VS工厂方法模式4.4 抽象工厂…

node.js基础--01

Author nodes:(题记) node.js is an open-source,cross-platform JAVAScript runtime environment。 node.js是一个开源,跨平台的js运行环境 common commands(常用指令) 1、C: enter hard …

javaScript的序列化与反序列化

render函数的基本实现 javaScript的序列化与反序列化 一,js中的序列化二,序列化三,反序列化四,总结 一,js中的序列化 js中序列化就是对象转换成json格式的字符串,使用JSON对象的stringify方法,…

新书速览|Python数据科学应用从入门到精通

系统教授数据科学与Python实战,涵盖线性回归、逻辑回归、决策树、随机森林、神经网 本书内容 随着数据存储、数据处理等大数据技术的快速发展,数据科学在各行各业得到广泛的应用。数据清洗、特征工程、数据可视化、数据挖掘与建模等已成为高校师生和职场…

STL——空间配置器

空间配置器是STL六大组件之一,它和其他五个组件相互配合,起着很关键的作用。 容器:各种数据结构、如vector、list、stack、deque、queue、set、map、unordered_map等等算法:各种算法,如sort、serach、copy、erase 提供…

C#用正则表达式验证格式:电话号码、密码、邮编、手机号码、身份证、指定的小数点后位数、有效月、有效日

正则表达式在程序设计中有着重要的位置,经常被用于处理字符串信息。 用Regex类的IsMatch方法,使用正则表达式可以验证电话号码是否合法。 一、涉及到的知识点 Regex类的IsMatch方法用于指示正则表达式使用pattern参数中指定的正则表达式是否在输入字符串…

计算机网络_1.6.2 计算机网络体系结构分层的必要性

1.6.2 计算机网络体系结构分层的必要性 一、五层原理体系结构每层各自主要解决什么问题1、物理层2、数据链路层3、网络层4、运输层5、应用层 二、总结三、练习 笔记来源: B站 《深入浅出计算机网络》课程 本节主要介绍实现计算机网络需要解决哪些问题?以…

这种学习单片机的顺序是否合理?

这种学习单片机的顺序是否合理? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!&#xff01…

随着网络的快速发展,网络安全问题也日益凸显,遇到攻击该如何处理,如何抉择合适的防护方案

DexunCloud 经过研究发现当今世界,随着网络的快速发展,网络安全问题也日益凸显。其中,DDoS(分布式拒绝服务)攻击被认为是网络安全领域里最为严重的威胁之一。毫无疑问,DDoS攻击不仅可以导致网络服务中断&am…

支付宝直连商户处理支付交易投诉管理,支持多商户

大家好,我是小悟 1、问题背景 玩过支付宝生态的,或许就有这种感受,如果收到投诉单,不会通知到手机端,只会在支付宝商家后台-账号中心-安全中心-消费者投诉-支付交易投诉那里显示。那你能一直盯着电脑看吗?…

Flink CEP(基本概念)

Flink CEP 在Flink的学习过程中,我们已经掌握了从基本原理和核心层的DataStream API到底层的处理函数,再到应用层的Table API和SQL的各种手段,可以应对实际应用开发的各种需求。然而,在实际应用中,还有一类更为复…

AI Partition(银灿U盘分区工具)V2.0.0.3

AI Partition(银灿U盘分区工具)V2.0.0.3.zip 复制链接下载吧 https://url20.ctfile.com/f/36743220-1017367709-67f1b9?p2024 (访问密码: 2024) 支持IS903B IS902E IS916 AI Partition(银灿U盘分区量产工具) 这个是银灿官方发布的最新版U盘分区工具,版本号V2.0.0…

翻转二叉树

226. 翻转二叉树 已解答 简单 相关标签 相关企业 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]示例 2: 输入&#xff1a…

从零学习Linux操作系统 第二十五部分 文本处理工具

一、grep命令的基本使用方法及常用参数介绍 grep [全称&#xff1a;Globally search a Regular Expression and Print 全局搜索正则表达式并打印 ] grep 命令格式 grep 匹配条件 处理文件 grep root passwd过滤root关键字grep -i root passwd后略大小写grep -E “<root”…

嵌入式中物联网核心技术有哪些

IoT军事技术 物联网军事技术是一项利用IoT感知技术在军事活动中获取人、装备、作战环境状态的信息特征&#xff0c;从而实现在军事活动中做出智能化决策和控制局势的军事方针。 据悉&#xff0c;早于2012年10月军方联合了社会研究机构合力创建了“军事物联网联合实验室”。 …

C++核心deque容器,stack容器,queue容器,list容器,set容器,pair ,map容器

3.deque容器 1.deque容器的基本概念 Vector容器是单向开口的连续内存空间&#xff0c;deque则是一种双向开口的连续线性空间。所谓的双向开口&#xff0c;意思是可以在头尾两端插入元素&#xff0c;但是在其头部操作效率奇差&#xff0c;无法被接受。 deque容器和vector容器最…

C++类和对象入门(二)

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、类的作用域 类定义了一个新的作用域&#xff0c;类的所有成员都在类的作用域中。在类体外定义成员时&#xff0c;需要…