pytest参数化详解

news2025/6/30 7:57:22

在这里插入图片描述


文章目录

  • 一.概念
  • 二.单个参数
  • 三.多个参数
    • 案例1
    • 案例2:使用py文件存放测试数据
    • 案例3:使用yaml文件存放测试数据
    • 案例4:使用json文件存放测试数据
  • 四.对测试类参数化
    • 案例1

一.概念

参数化,就是把测试过程中的数据提取出来,通过参数传递不同的数据来驱动用例运行。其实也就是数据驱动的概念。

可以使用 @pytest.mark.parametrize(argnames, argvalues) 装饰器达到批量传送参数的目的

在 unittest 中,使用ddt库配合unittest实现数据驱动。在pytest中并不需要额外的库,通过pytest.mark.parametrize()即可实现参数化。

parametrize()的第一个参数是用逗号分割的字符串列表,第二个参数是一个值列表

二.单个参数

test_params

import pytest

def add(a,b):
    return a+b

class TestParams:

    @pytest.mark.parametrize('a',[1,2,3,4,5])
    def test_par1(self,a):
        assert add(a,1)==a+1

命令行执行:

pytest

在这里插入图片描述
特别注意:
@pytest.mark.parametrize() 装饰器接收两个参数,
第一个参数是以字符串的形式标识用例函数的参数,
第二个参数以列表或元组的形式传递测试数据。
在这里插入图片描述

三.多个参数

案例1

test_params

import pytest

def add(a,b):
    return a+b

class TestParams:

    @pytest.mark.parametrize('a,b,c',[[1,2,3],[3,4,5],[1,3,4],[2,5,7]])
    def test_par1(self,a,b,c):
        assert add(a,b)==c

执行命令
在这里插入图片描述
特别注意:
多个参数之间要用逗号分隔
参数名称和个数要一一对应

在这里插入图片描述

案例2:使用py文件存放测试数据

测试数据

login_data_list = [
    	{'username': 'kobe', 'password': 666666, 'expect': '登录成功'},
    	{'username': 'kobe', 'password': 111111, 'expect': '用户名或者密码错误'},
    	{'username': '', 'password': 666666, 'expect': ''},
	]

test_work

import pytest
from data.data1 import login_data_list

class TestParams:

    @pytest.mark.parametrize('test_data',login_data_list)
    def test_par1(self,test_data):
        username=test_data['username']
        password=test_data['password']
        assert username=='kobe' and password==666666

测试结果
在这里插入图片描述

案例3:使用yaml文件存放测试数据

在这里插入图片描述

yaml文件

-
  name: '账号密码正确'
  username: 'kobe'
  password: 666666

-
  name: '用户名为空'
  username:
  password: 666666

-
  name: '用户名或者密码错误'
  username: 'james'
  password: 666666

read_yaml.py

import os
import yaml

def read_yaml(yaml_file_path):
    try:
        with open( yaml_file_path, "r",encoding="utf-8") as f:
            value = yaml.load(stream=f, Loader=yaml.FullLoader)
    except:
        with open(yaml_file_path, "r",encoding="gbk") as f:
            value = yaml.load(stream=f, Loader=yaml.FullLoader)
    print(value)
    return value



if __name__ == '__main__':
    read_yaml(r'D:\project_development\api_pytest\data\test_yaml.yaml')

读取结果:

[{'name': '账号密码正确', 'username': 'kobe', 'password': 666666}, {'name': '用户名为空', 'username': None, 'password': 666666}, {'name': '用户名或者密码错误', 'username': 'james', 'password': 666666}]

test_yaml_work.py

import pytest
from utils.read_yaml import read_yaml

class TestParams:

    @pytest.mark.parametrize('case',read_yaml(r'D:\project_development\api_pytest\data\test_yaml.yaml'))
    def test_login(self,case):
        username=case['username']
        password=case['password']
        assert username=='kobe' and password==666666

执行测试:

D:\project_development\api_pytest>pytest testcases/params/test_yaml_work.py

在这里插入图片描述

案例4:使用json文件存放测试数据

在这里插入图片描述

test_json.json


[
  {
    "name": "账号密码正确",
    "username": "kobe",
    "password": 666666
  },
  {
    "name": "用户名为空",
    "username": "",
    "password": 666666
  },
  {
    "name": "用户名或者密码错误",
    "username": "james",
    "password": 666666
  }
]

read_json.py

import os
import json

def read_json(json_file_path):
    try:
        with open(json_file_path, "r", encoding="utf-8") as f:
            datas = json.load(f)
    except:
        with open(json_file_path, "r", encoding="gbk") as f:
            datas = json.load(f)
    if not isinstance(datas, list):
        raise ValueError('json文件内的用例数据格式不符护规范')

    print(datas)
    return datas


if __name__ == '__main__':
    read_json(r'D:\project_development\api_pytest\data\test_json.json')

读取结果:

[{'name': '账号密码正确', 'username': 'kobe', 'password': 666666}, {'name': '用户名为空', 'username': '', 'password': 666666}, {'name': '用户名或者密码错误', 'username': 'james', 'password': 666666}]

test_json_work.py

import pytest
from utils.read_yaml import read_yaml

class TestParams:

    @pytest.mark.parametrize('case',read_yaml(r'D:\project_development\api_pytest\data\test_yaml.yaml'))
    def test_login(self,case):
        username=case['username']
        password=case['password']
        assert username=='kobe' and password==666666


四.对测试类参数化

测试类的参数化,其实际上也是对类中的测试方法进行参数化。类中的测试方法的参数必须与@pytest.mark.parametrize()中的标识的参数个数一致。

在这里插入图片描述

案例1

import pytest

def add(a,b):
    return a+b


@pytest.mark.parametrize('a,b,c',[[1,2,3],[1,3,4],[2,5,7]])
class TestParams:

    def test_par1(self,a,b,c):
        assert add(a,b)==c

    def test_par2(self,a,b,c):
        assert add(a,b)==c

执行结果

在这里插入图片描述


在这里插入图片描述

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

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

相关文章

健身房信息管理系统(PHP+Html+MySQL)

3.需求分析 3.1 健身房管理系统功能需求 健身房管理信息系统,提供动作教学,健身基本动作可视化,健身知识层次化,一个完整的健身房管理系统,为健身爱好者对健身知识的了解和健身动作的了解提供了便利,系统应…

网络协议:透彻解析HTTPS协议

本篇内容包括:HTTPS 协议概述,SSL 与 TLS(SSL 与 TLS 概述、SSL证书 和 SSL 与 TLS 二者之间关系),以及 HTTPS 下浏览器访问一个网站的全过程的内容! 文章目录一、HTTPS 协议概述二、SSL 与 TLS1、SSL 与 T…

两种让python输出更加美观的方式,三分钟看完就会

嗨害大家好鸭!我是小熊猫❤ 最近要给大家持续带来干货输出啦! 赶紧收藏起来,以后查漏补缺要用到的喔~ 源码、资料电子书点击这里 1.输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数。 (第三种方式是使用文件对象的 write…

Web前端开发技术课程大作业——南京旅游景点介绍网页代码html+css+javascript

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法,如盒子的嵌套、浮动、margin、border、background等属性的使用,外部大盒子设定居中,内部左中右布局,下方横向浮动排列,大学学习的前端知识点和布局方式都有…

二选一工作器引入的Verilog语法

二选一工作器引入的Verilog语法 ——XILINX 基于BASYS 3板 状态机、线性序列机、学习仿真 DDS:矩阵键盘、DAC,LCD/数码管,这些模块间的接口逻辑 常见的接口设计:SPI、IIC、UART 学习:三八译码器、计数器电灯、学习开发工具的使用…

年轻人不用太过于努力

周末和一个毕业一年多的朋友聊天,我随口问了一句「你有什么想跟我分享的」,然后他就说了上面的那句话。「年轻人不用太过于努力」和读者聊天会做成我的一个公众号专栏,内容有也会越来越丰富,全部的内容都会收录到我的程序人生专栏…

RK3568平台开发系列讲解(音频篇)Audio 音量控制流程

🚀返回专栏总目录 文章目录 一、安卓音量控制流程简介二、什么是AudioService沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要介绍安卓音量控制流程。 一、安卓音量控制流程简介 Android音频系统,分为数据流和策略两部分。 数据流描述了音频数据从数据源…

【C++哈希表】哈希碰撞,线性探测,二次探测 ,荷载因子,闭散列的实现及string需要特化

目录 1.哈希概念 2.哈希碰撞 3.解决哈希冲突 4.哈希表闭散列实现 框架: 4.3插入 1.哈希概念 线性表以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。线性表查找…

首届数据安全大赛初赛web

文章目录easy_nodeeasy_webeasy_phar刮刮乐my_cloudeasy_node 访问src得到源码 第一步需要伪造admin用户 可以看到都是通过jwt进行加密解密 很容易想到jwt的几种攻击方式,可以参考下文章https://blog.csdn.net/miuzzx/article/details/111936737 首先试下改为n…

Linux篇【4】:Git,Gitee,GitHub

在 Linux 系统中,如何将普通源文件和普通头文件上传到 Gitee ? Git 是一个分布式的版本控制器,目前可以理解成百度云盘,其次,在 Linux 系统中,Git 也是一个软件/工具/指令,在 Windows 系统中&a…

212 - 218. MySQL索引的基本用法

1.索引的简介 1.1 索引的概念 是数据库对象,实现数据库快速查询 1.2 为什么使用索引 实现数据库快速查询,提高查询速度 1.3 索引的分类 a.普通索引 最基本的索引,对字段数据的类型和值没有任何限制,数据类型可以任意,…

电脑技巧:Win10自带的6个实用功能,你都会用吗

目录 1、系统自带计算器 2、Win10自带截图功能 3、 Win10自带的手写输入 4、历史剪贴板 5、定时提醒 6、自带录屏功能 1、系统自带计算器 系统里自带了一个计算器大家都知道,打开是这个样子。 但当你点击计算器左上角的三个横杠图标后会发现这个计算器功能非常强大。…

Python画爱心——谁能拒绝用代码敲出来会跳动的爱心呢~

还不快把这份浪漫拿走!!节日就快到来了,给Ta一个惊喜吧~ 今天给大家分享一个浪漫小技巧,利用Python制作一个立体会动的心动小爱心 成千上百个爱心汇成一个大爱心,从里到外形成一个立体状,给人视觉上的冲击…

phy层深入了解编码

1,我们知道mac层通过MDI来访问phy层的,那么phy层到光模块数据是怎么处理的呢。从下面这个图中可以看出基本的关系: serdies接口说明: Medium Independent Interface (MII): 介质无关接口。提供公共接口,屏蔽多个物理…

基于haproxy负载均衡实现lamp与apache的高可用

环境准备 IP主机名服务系统192.168.47.10node1ansiblecentos8192.168.47.20node2lampcentos8192.168.47.30node3apachecentos8192.168.47.40node4haproxycentos8 基于上一篇的文章在node3主机上部署apache 一、部署haproxy 准备主机清单组织 //创建角色 [studentserver rol…

服务器没网 利用本地机器反向隧道 设置conda代理配置环境

适用情况 S是局域网内服务器,无法联网。 C为本地机器,可以通过ssh链接服务器。 本篇文章主要为了可以让S可以借用C的网络进行conda环境配置,所采取的设置。 1.利用Xshell建立反向隧道 在连接设置的ssh中点击隧道,点击设置&#…

SpringBoot--网上商城项目(前端搭建、首页、用户登录、盐加密、登录令牌管理)

文章目录 一、项目技术点 数据表 二、构建SpringBoot项目 1、创建SpringBoot项目并配置pom 配置pom 2、application.yml的配置 3、首页访问 三、首页功能 工具类!!! 首页数据绑定语法 四、用户明文登录 五、前端及数据库密码加密 …

C. String Transformation 1(图的思想)

Problem - 1384C - Codeforces 题意: 考拉有两个长度相同的字符串A和B(|A||B|n),由前20个小写英文字母组成(即从a到t)。 在一步棋中,Koa。 (选择A的某个位置子集p1,p2,...,pk(k≥1;1≤pi≤n;…

Codeforces Round #831 (Div. 1 + Div. 2)

A. Factorise NM 题目链接:Dashboard - Codeforces Round #831 (Div. 1 Div. 2) - Codeforces 样例输入: 3 7 2 75619样例输出: 2 7 47837题意:给定一个质数,让我们输出一个质数使得这两个数相加为一个合数。 分…

基于Java的飞机雷电射击游戏的设计实现(Eclipse开发)

目 录 摘 要 I Abstract II 1 引言 3 1.1 项目背景 3 1.2 电脑游戏的发展历史 3 1.3国内游戏项目研究现状 5 1.4项目主要工作 6 1.5本文组织结构 7 1.6 电脑游戏的策划 7 2 开发平台与开发技术 8 2.1 Eclipse 8 2.2 Eclipse平台 8 2.3 Java 9 2.4游戏图形界面的开发基础 11 2.5…