IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> Pytest之参数化 -> 正文阅读

[开发测试]Pytest之参数化

在上一篇Pytest系列文章:Pytest之自定义mark,主要介绍pytest自定义配置及用例运行实战。以下主要介绍pytest参数化讲解及实战。

熟悉unittest单元测试框架的小伙伴知道,使用ddt进行数据驱动测试,那么身为功能更加强大且更加灵活的Pytest框架怎么可能没有数据驱动的概念呢?Pytest使用@pytest.mark.parametrize装饰器来实现数据驱动测试的,也就是常说的参数化。

一、parametrize语法

parametrize(self,argnames,?argvalues,?indirect=False,?ids=None,?scope=None)

argnames:参数名。

argvalues:参数对应值,类型必须为list。如果只有一个参数,里面则是值的列表:

如:@pytest.mark.parametrize("username", ["yy", "yy2", "yy3"])。如果有多个参数,则需要用元组来存放值,一个元组对应一组参数的值,如:@pytest.mark.parametrize("name,pwd", [("yy1", "123"), ("yy2", "123"), ("yy3", "123")])。

indirect:如果设置成True,则把传进来的参数当函数执行,而不是一个参数。

ids:用例的ID,传一个字符串列表,用来标识每一个测试用例,自定义测试数据结果,增加可读性。

二、参数讲解

1、单个数据

import?pytest
data?=?["小红",?"小明"]
@pytest.mark.parametrize("name",data)
def?test_demo(name):
????print("测试数据为{}".format(name))

运行结果为:

?2、一组数据

01?列表嵌套字典

import?pytest
data_1?=?[
????{"username":?"admin1",?"password":?"123456"},
????{"username":?"admin2",?"password":?"12345678"},
]
@pytest.mark.parametrize("data",?data_1)
def?test_login(data):
????print("账号:{},密码:{}".format(data["username"],data["password"]))

运行结果为:

?02?列表嵌套列表

import?pytest
data_1?=?[
????["admin1",?"123456"],
????["admin2",?"12345678"],
]
@pytest.mark.parametrize("username,password",?data_1)
def?test_login(username,password):
????print("账号:{},密码:{}".format(username,?password))

运行结果为:

?03?列表嵌套元组

import?pytest
data_1?=?[
????("admin1",?"123456"),
????("admin2",?"12345678"),
]
@pytest.mark.parametrize("username,password",?data_1)
def?test_login(username,password):
????print("账号:{},密码:{}".format(username,?password))

运行结果为:

?三、场景运用

1、装饰函数

import?pytest
@pytest.mark.parametrize("username,password",[("admin01","123456"),("admin02","12345678")])
def?test_demo(username,password):
????print("用户名:{},密码:{}".format(username,password))

运行结果为:

?2、装饰类

import?pytest
@pytest.mark.parametrize("username,password",[("admin01","123456"),("admin02","12345678")])
class?TestDemo:
????def?test_demo(self,username,password):
????????print("用户名:{},密码:{}".format(username,password))

运行结果为:

?注意:装饰测试类时,类内所有的方法必须接收测试数据,否则会报错;装饰测试函数时比较灵活,如果函数不使用数据就可以不装饰。

3、多个参数化装饰器

使用多个参数化装饰器,数据会进行交叉组合的方式传递给测试函数,进而生成n*n个测试用例(笛卡尔积)。

test_demo.py

import?pytest
username?=?["admin1",?"admin2",?"admin3"]
password?=?["123456",?"1234567",?"12345678"]
@pytest.mark.parametrize("uname",username)
@pytest.mark.parametrize("pwd",password)
def?test_demo(uname,pwd):
????print("用户名:{},密码:{}".format(uname,?pwd))

运行结果如下:

4、增加可读性?

parametrize参数中的ids,可以标识每一个测试用例,自定义测试数据结果的显示,增加可读性。

test_demo.py

import?pytest
data_1?=?[
????(1,?2,?3),
????(4,?5,?9)
]
ids?=?["a:{}?+?b:{}?=?expect:{}".format(a,?b,?expect)?for?a,?b,?expect?in?data_1]
def?add(a,?b):
????return?a?+?b
@pytest.mark.parametrize('a,?b,?expect',?data_1,?ids=ids)
def?test_parametrize_1(a,?b,?expect):
????print('\n测试函数1测试数据为\n{}-{}'.format(a,?b))
????assert?add(a,?b)?==?expect

命令行输入:pytest -v

?

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-09-09 12:04:57  更:2021-09-09 12:06:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 0:44:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码