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.hqwc.cn/news/449696.html

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

相关文章

【笔记】Android 常用编译模块和输出产物路径

模块&产物路径 具体编译到软件的路径要看编译规则的分区,代码中模块编译输出的产物基本对应。 Android 代码模块 编译产物路径设备adb路径Comment 模块device/mediatek/system/common/ 资源overlay/telephony/frameworks/base/core 文件举例res/res/values-m…

【奶奶看了都会】《幻兽帕鲁》云服务器部署教程

在帕鲁的世界,你可以选择与神奇的生物「帕鲁」一同享受悠闲的生活,也可以投身于与偷猎者进行生死搏斗的冒险。帕鲁可以进行战斗、繁殖、协助你做农活,也可以为你在工厂工作。你也可以将它们进行售卖,或肢解后食用。 《幻兽帕鲁》官…

关于Ubuntu下docker-mysql:ERROR 2002报错

报错场景: mysql容器创建好后登录mysql时即使密码正确也是报出下方提示: 原因是在创建mysql容器在创建时本地目录缺失, 先去自建一个目录,例如: /opt/my_sql 正确完整目录如下: docker run --namemys…

oracle19C 密码包含特殊字符@ 导致ORA-12154

oracle 19C 密码包含特殊字符 出现登录失败,针对此问题一次说个明白 ORA-12154: TNS:could not resolve the connect identifier specified Oracle 19c之前密码是可以包含特殊字符,但是如果包含特殊字符需要双引号 比如oracle11g 正常 如果密码包含特殊…

Scrum敏捷开发企业培训-敏捷研发管理

课程简介 Scrum是目前运用最为广泛的敏捷开发方法,是一个轻量级的项目管理和产品研发管理框架。 这是一个两天的实训课程,面向研发管理者、项目经理、产品经理、研发团队等,旨在帮助学员全面系统地学习Scrum和敏捷开发, 帮助企业快速启动敏…

RK3568平台 安卓hal3适配usb camera

一.RK安卓hal3 camera框架 Camera hal3 在 android 框架中所处的位置如上图, 对上,主要实现 Framework 一整套 API 接口,响应其 控制命令,返回数据与控制参数结果。 对下, 主要是通 V4l2 框架实现与 kernel 的交互。3a…

(十二)springboot实战——SSE服务推送事件案例实现

前言 SSE(Server-Sent Events,服务器推送事件)是一种基于HTTP协议的服务器推送技术。它允许服务器向客户端发送异步的、无限长的数据流,而无需客户端不断地轮询或发起请求。这种技术可以用来实现实时通信、在线聊天、即时更新等功…

【Linux】理解系统中一个被打开的文件

文件系统 前言一、C语言文件接口二、系统文件接口三、文件描述符四、struct file 对象五、stdin、stdout、stderr六、文件描述符的分配规则七、重定向1. 重定向的原理2. dup23. 重谈 stderr 八、缓冲区1. 缓冲区基础2. 深入理解缓冲区3. 用户缓冲区和内核缓冲区4. FILE 前言 首…

景联文科技受邀出席全国信标委生物特征识别分委会二届五次全会

全国信息技术标准化技术委员会生物特征识别分技术委员会(SAC/TC28/SC37,以下简称“分委会”)二届五次全会于2024年1月30日在北京顺利召开,会议由分委员秘书长王文峰主持。 分委会由国家标准化管理委员会批准成立,主要负…

django+flask+python高校教材管理系统47nia

本.4论文结构 绪论:剖析项目可行性,表明研究方向。 开发技术:系统关键运用了Python技术性、Django框架、B/S架构和myspl数据库查询,并进行了详细介绍[6]。 系统分析:包含系统的总体构造,用例图和结构图。 系…

[ESP32 IDF]web server

目录 通过web server控制LED 核心原理解析 分区表 web server的使用 错误Header fields are too long的解决 通过web server控制LED 通过网页控制LED灯的亮灭,一般的ESP32开发板都可以实现,下面这篇文章是国外开发者提供的一个通过web server控制…

docker安装定制gocd-agent

一、定制gocd-agent FROM gocd/gocd-agent-alpine-3.12:v21.1.0 MAINTAINER xxx "xxx163.com" # 切换到 root 用户 USER root # 安装 expect、jdk、docker RUN apk update && apk add expect && apk add openjdk8 && apk add docker &&…