前言

我们在实际自动化测试中,某些测试用例是无法通过一组测试数据来达到验证效果的,所以需要通过参数化来传递多组数据

在unittest中,我们可以使用第三方库parameterized来对数据进行参数化,从而实现数据驱动测试

而在pytest中,也提供了功能强大的@pytest.mark.parametrize装饰器来实现数据参数化

Pytest参数化的方式

pytest有三种传参方式

  • @pytest.mark.parametrize() 通过装饰器方式进行参数化(最常使用)
  • pytest.fixture()方式进行参数化,fixture装饰的函数可以作为参数传入其他函数
  • conftest.py文件中存放参数化函数,可作用于模块内的所有测试用例

@pytest.mark.parametrize实现参数化

装饰测试类

当装饰器 @pytest.mark.parametrize 装饰测试类时,会将数据集合传递给类的所有测试用例方法

举个

import pytest

# 定义测试数据
data1 = [
(1, 2, 3),
(4, 5, 9)
] # 定义add方法
def add(a, b):
return a + b # 添加parametrize装饰器
@pytest.mark.parametrize('a, b, expect', data1)
class TestParametrize(object): def test_parametrize_1(self, a, b, expect):
print(f'\n测试用例1数据为{a}-{b},结果为{expect}')
assert add(a, b) == expect def test_parametrize_2(self, a, b, expect):
print(f'\n测试用例2数据为{a}-{b},结果为{expect}')
assert add(a, b) == expect

执行结果如下

装饰测试函数

单个数据

当测试用例只需要一个参数时,我们使用列表存放测试数据,例如定义一个列表

data = [1,2]

使用@pytest.mark.parametrize装饰器时,第一个参数使用变量a接收列表中的每个元素,第二个参数传递存储数据的列表

在测试用例中使用同名的变量a接收测试数据,列表有多少个元素就会生成并执行多少个测试用例

上代码

import pytest

data = [1, 2 , 3]

@pytest.mark.parametrize('a', data)
def test_parametrize(a):
print(f'\n被加载测试数据为{a}')

执行结果如下

一组数据

当测试用例需要多个数据时,我们可以使用嵌套序列(嵌套元组&嵌套列表)的列表来存放测试数据

装饰器@pytest.mark.parametrize()可以使用单个变量接收数据,也可以使用多个变量接收,同样,测试用例函数也需要与其保持一致

当使用单个变量接收时,测试数据传递到测试函数内部时为列表中的每一个元素或者小列表,需要使用索引的方式取得每个数据

当使用多个变量接收数据时,那么每个变量分别接收小列表或元组中的每个元素

列表嵌套多少个列表或元组,测生成多少条测试用例

上代码

import pytest

data = [
[1, 2, 3],
[4, 5, 9]
] @pytest.mark.parametrize('a, b, expect', data)
def test_parametrize_1(a, b, expect):
# 当使用多个变量接收数据时,那么每个变量分别接收小列表或元组中的每个元素
print(f'\n测试数据为{a},{b},{expect}')
actual = a + b
assert actual == expect @pytest.mark.parametrize('value', data)
def test_parametrize_2(value):
当使用单个变量接收时,测试数据传递到测试函数内部时为列表中的每一个元素或者小列表,需要使用索引的方式取得每个数据
print(f'\n测试数据为{value}')
actual = value[0] + value[1]
assert actual == value[2]

执行结果如下

组合数据

一个测试函数还可以同时被多个参数化装饰器装饰,多个装饰器中的数据会进行交叉组合的方式传递给测试函数,进而生成n*n个测试用例,这也为我们的测试设计时提供了方便

上代码

import pytest

data_1 = [1, 2]
data_2 = [3, 4, 5] @pytest.mark.parametrize('a', data_1)
@pytest.mark.parametrize('b', data_2)
def test_parametrize_1(a, b):
print(f'\n测试数据为{a},{b}')

执行结果如下

标记用例

当我们不想执行某组测试数据时,我们可以标记skip或skipif

当我们预期某组数据会执行失败时,我们可以标记为xfail

上代码

import pytest

data1 = [
[1, 2, 3],
pytest.param(3, 4, 8, marks=pytest.mark.xfail),
pytest.param(3, 4, 7, marks=pytest.mark.skip)
] def add(a, b):
return a + b @pytest.mark.parametrize("a,b,expected", data1)
def test_mark(a, b, expected):
print(f'测试数据为{a},{b},结果为{expected}')
assert add(a, b) == expected

执行结果如下

嵌套字典

数据列表中也可以使用字典类型的数据

上代码

import pytest

data_1 = (
{
'user': 1,
'pwd': 2
},
{
'user': 3,
'pwd': 4
}
) @pytest.mark.parametrize('dic', data_1)
def test_parametrize_1(dic):
print(f'测试数据为{dic}')

执行结果如下

增加可读性

使用ids参数

参数化装饰器有一个额外的参数ids,可以标识每一个测试用例,自定义测试数据结果的显示,用来增加测试用例的可读性

上代码

import pytest

data = [1, 2, 3]

ids = [f'TestData-{a}' for a in data]

@pytest.mark.parametrize('a', data ,ids= ids)
def test_parametrize(a):
print(f'\n被加载测试数据为 {a}')

执行结果为

自定义id做标识

除了使用ids参数增加输出可读性外,我们还可以在参数列表的参数旁边定义一个id值来做标识

上代码

import pytest

data = [
pytest.param(1, id="this is test1"),
pytest.param(2, id="this is test2")
] @pytest.mark.parametrize('a', data)
def test_parametrize(a):
print(f'\n被加载测试数据为 {a}')

执行结果如下

pytest.fixture()方式进行参数化

待更新

整理参考

linxu超

Pytest学习笔记8-参数化的更多相关文章

  1. [转载]pytest学习笔记

    pytest学习笔记(三)   接着上一篇的内容,这里主要讲下参数化,pytest很好的支持了测试函数中变量的参数化 一.pytest的参数化 1.通过命令行来实现参数化 文档中给了一个简单的例子, ...

  2. pytest 学习笔记一:参数化与组织分层

    组织分层: 1.普通方式,和unittest分层类似: setup_module()  # 通常放在类外 setup_class(cls) setup(self) teardown(self) tea ...

  3. pytest学习笔记

    From: https://blog.csdn.net/gaowg11/article/details/54910974 由于对测试框架了解比较少,所以最近看了下pytest测试框架,对学习心得做个记 ...

  4. pytest学习笔记(一)

    这两天在学习pytest,之前有小用到pytest,觉得这个测试框架很灵巧,用在实现接口自动化(pytest+requests)非常的轻便,然后很有兴致的决定学习下,然后又发现了pytest-sele ...

  5. pytest学习笔记(三)

    接着上一篇的内容,这里主要讲下参数化,pytest很好的支持了测试函数中变量的参数化 一.pytest的参数化 1.通过命令行来实现参数化 文档中给了一个简单的例子, test_compute.py ...

  6. pytest学习笔记(二)

    继续文档的第二章 (一)pytest中可以在命令行中静态/动态添加option,这里没什么好讲的,略过... 这里面主要讲下如何试用skip/xfail,还有incremental(包含一些列的测试步 ...

  7. pytest 学习笔记一 入门篇

    前言 之前做自动化测试的时候,用的测试框架为Python自带的unittest框架,随着工作的深入,发现了另外一个框架就是pytest (官方地址文档http://www.pytest.org/en/ ...

  8. Pytest学习笔记3-fixture

    前言 个人认为,fixture是pytest最精髓的地方,也是学习pytest必会的知识点. fixture用途 用于执行测试前后的初始化操作,比如打开浏览器.准备测试数据.清除之前的测试数据等等 用 ...

  9. Pytest学习笔记5-conftest.py的用法

    前言 在之前介绍fixture的文章中,我们使用到了conftest.py文件,那么conftest.py文件到底该如何使用呢,下面我们就来详细了解一下conftest.py文件的特点和使用方法吧 什 ...

随机推荐

  1. 项目展示$\alpha$

    项目 内容 课程:北航-2020-春-软件工程 博客园班级博客 要求 强制转会与项目展示 我们在这个课程的目标是 提升团队管理及合作能力,开发一项满意的工程项目 这个作业在哪个具体方面帮助我们实现目标 ...

  2. 获取Eureka服务列表的各种场景

    一.第一类服务注册到eureka中,获取服务列表 1.基于SpringClientFactory获取服务列表 /** * <一句话功能简述> * <功能详细描述> * * @a ...

  3. 下载最新版本Fiddler

    下载最新版本Fiddler https://www.telerik.com/download/fiddler/fiddler-everywhere-windows

  4. 二进制部署K8S-2集群部署

    二进制部署K8S-2集群部署 感谢老男孩教育王导的公开视频,文档整理自https://www.yuque.com/duduniao/k8s. 因为在后期运行容器需要有大量的物理硬件资源使用的环境是用的 ...

  5. python基础之字典、集合

    一.字典(dictionary) 作用:存多个值,key-value存取,取值速度快 定义:key必须是不可变类型,value可以是任意类型 字典是一个无序的,可以修改的,元素呈键值对的形式,以逗号分 ...

  6. 思考一个问题STM32的

    如果一个定时中断刚刚进入中断服务函数 但是服务函数执行时间太长   又一次触发了中断 会怎样

  7. 论鸿蒙OS在某些人眼中的样子

    对于鸿蒙OS,博客园有一篇文章<为鸿蒙OS说两句公道话(我对鸿蒙OS的一些看法)>.有兴趣的可以看看. 在这篇文章中,个人觉得最精彩的不是文章本身,而是评论内容. 下面我挑一些出来,和大家 ...

  8. 一文读懂一条 SQL 查询语句是如何执行的

    2001 年 MySQL 发布 3.23 版本,自此便开始获得广泛应用,随着不断地升级迭代,至今 MySQL 已经走过了 20 个年头. 为了充分发挥 MySQL 的性能并顺利地使用,就必须正确理解其 ...

  9. nginx 重定向到系统维护页面

    上周末兄弟项目准备扩展服务器以便提供更好的服务,兄弟项目有一些功能是实时提供到我这边的,需要我这边暂时把对应系统功能屏蔽,因为使用nginx,所以可以直接配置nginx重定向到固定系统维护页面. ng ...

  10. 台积电5nm光刻技术

    台积电5nm光刻技术 在IEEE IEDM会议上,台积电发表了一篇论文,概述了其5nm工艺的初步成果.对于目前使用N7或N7P工艺的客户来说,下一步将会采用此工艺,因为这两种工艺共享了一些设计规则.新 ...