热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

pytest之参数化parametrize的使用

参考:https:www.cnblogs.combenben-wup11542411.htmlhttps:blog.csdn.netliudinglong1989articlede

参考:

https://www.cnblogs.com/benben-wu/p/11542411.html

https://blog.csdn.net/liudinglong1989/article/details/106206212

前言

unittest框架使用的第三方库ddt来参数化的,而pytest框架就直接使用装饰器@pytest.mark.parametrize来对测试用例进行传参。这个是针对测试方法来参数化,还有一种是针对前置处理函数来传参。但往往这两种是可以结合使用。


fixture之Params参数化(单个列表)

前面讲fixture函数时,它有个参数params用来传递参数,并且与request结合使用,先看单个:

import pytest

seq = [1, 2, 3]


@pytest.fixture(params=seq)
def test_data(request):
print("参数")
return request.param


class TestData:
def test_1(self, test_data):
print("用例", test_data)


if __name__ == '__main__':
pytest.main()
—————————————————————————————————
运行结果:
fixture_test03.py::TestData::test_1[1] 参数
PASSED [ 33%]用例 1

fixture_test03.py::TestData::test_1[2] 参数
PASSED [ 66%]用例 2

fixture_test03.py::TestData::test_1[3] 参数
PASSED [100%]用例 3


============================== 3 passed in 0.05s ==============================

 

 

  

  


fixture之Params参数化(单个列表嵌套其他格式)

列表里有多个dict数据,request会自动化循环读取每个索引下的值,从0开始,看下面例子:

注意:params需要与request一起使用。

import pytest
seq = [{'a':1,'b':2},{'c':3,'d':4}]
@pytest.fixture(params=seq)
def test_data(request):
  print("参数:%s"%request.param)
  return request.param
class TestData:
def test_1(self, test_data):
  print("用例", test_data)

if __name__ == '__main__':
    pytest.main()
  
—————————————————————————————————
 运行结果:
============================== 2 passed in 0.04s ==============================
Process finished with exit code 0
参数:{'a': 1, 'b': 2}
PASSED [ 50%]用例 {'a': 1, 'b': 2}
参数:{'c': 3, 'd': 4}
PASSED [100%]用例 {'c': 3, 'd': 4}
  

装饰器@pytest.mark.parametrize参数化(单个列表)

# 方式一:直接写
@pytest.mark.parametrize("a", ['北京','上海','重庆'])
def test_add01(a):
print(a)
data = ['北京','上海','重庆']
# 方式二:参数为列表
@pytest.mark.parametrize("a", data)
def test_add02(a):
print(a)

 


装饰器@pytest.mark.parametrize参数化(单个列表嵌套其他格式)

import pytest
test_datas = [
(11, 22, 33),
(22, 33, 55)
]
datas_dict = [
{"a": 1, "b": 2, "c": 3},
{"a": 11, "b": 22, "c": 33},
{"a": 111, "b": 222, "c": 333},
]
# 方式一:直接写
@pytest.mark.parametrize("a, b, c", [(1, 2, 3), (4, 5, 9)])
def test_add01(a, b, c):
res = a + b
assert res == c
# 方式二:参数为列表中嵌套元组
@pytest.mark.parametrize("data", test_datas)
def test_add02(data):
res = data[0] + data[1]
assert res == data[2]
# 方式三:参数为列表中嵌套字典
@pytest.mark.parametrize("data", datas_dict)
def test_add03(data):
res = data["a"] + data["b"]
assert res == data["c"]

装饰器@pytest.mark.parametrize参数化(多个组合)

#若要获得多个参数化参数的所有组合,可以堆叠参数化装饰器

import pytest
@pytest.mark.parametrize("a",[0,1])
@pytest.mark.parametrize("b",[3,4])
def test_01(a,b):
print("测试数据组合:a->%s,b->%s"%(a,b))

if __name__ == "__main__":
pytest.main(["-s", "test_3.py"])
_______________________________________________________运行结果:
test_123.py 测试数据组合:a->0,b->3
.测试数据组合:a->1,b->3
.测试数据组合:a->0,b->4
.测试数据组合:a->1,b->4

import pytest
@pytest.mark.parametrize("a", [0, 1])
@pytest.mark.parametrize("b", [3, 4])
@pytest.mark.parametrize("c", [2, 6])
def test_01(a, b, c):
print("测试数据组合:a->%s,b->%s,c->%s" % (a, b, c))
if __name__ == "__main__":
pytest.main(["-s", "test_123.py"])
———————————————————————————————————
运行结果:
test_123.py 测试数据组合:a->0,b->3,c->2
.测试数据组合:a->1,b->3,c->2
.测试数据组合:a->0,b->4,c->2
.测试数据组合:a->1,b->4,c->2
.测试数据组合:a->0,b->3,c->6
.测试数据组合:a->1,b->3,c->6
.测试数据组合:a->0,b->4,c->6
.测试数据组合:a->1,b->4,c->6
.

 


 


单个fixture与@pytest.mark.parametrize组合

如果装饰器@pytest.mark.parametrize与request结合使用,如果测试方法写在类中,则@pytest.mark.parametrize的参数名称要与@pytest.fixture函数名称保持一致。并且要添加indirect=True参数,目的是把ss_data当做函数去执行,而不是参数。

根据开关indirect自由控制,默认是False当做参数。indirect是True则当做函数

单个参数--例子1.1  参数是列表格式,indirect=True

import pytest
seq = [1,2,3]
@pytest.fixture()
def ss_data(request):
print("参数:%s"%request.param)
return request.param



class TestData:
@pytest.mark.parametrize("ss_data",seq,indirect=True)
def test_1(self,ss_data):
print("用例", ss_data)

if __name__ == '__main__':
pytest.main()
—————————————————————————————————运行结果:
test_123.py 参数:1
用例 1
.参数:2
用例 2
.参数:3
用例 3
.

 

单个参数--例子1.2  参数是列表格式,indirect=False

如果不使用fixture装饰器函数,也不使用外部函数,也是可以的,indirect默认是False例子如下:

import pytest
seq = [1,2,3]

class TestData:
@pytest.mark.parametrize("x",seq,indirect=False)
def test_1(self,x):
print("用例", x)

if __name__ == '__main__':
pytest.main()
———————————————————————————————————运行结果:
test_123.py 用例 1
.用例 2
.用例 3
.

 

单个参数--例子2  参数是列表嵌套元组格式,indirect=True

import pytest
seq = [(1,2),(3,4)]

@pytest.fixture()
def get_data(request):
x = request.param[0]
y = request.param[1]
print(x,111)
print(y,222)
# print(request.param)
pass

# indirect=True声明x是个函数
@pytest.mark.parametrize("get_data",seq,indirect=True)
def test_data(get_data):
  print(get_data)

if __name__ == '__main__':
  pytest.main()
—————————————————————————————————
运行结果:

test_123.py 1 111
2 222
None
.3 111
4 222
None
.


多个fixture与@pytest.mark.parametrize组合

参数化装饰器也可以叠加,使用parametrize装饰器叠加时,用例组合是2个参数个数相乘

import pytest

seq1 = [1,2,3]
seq2 = [4,5,6]

@pytest.fixture()
def get_seq1(request):
seq1 = request.param
print("seq1:",seq1)
return seq1

@pytest.fixture()
def get_seq2(request):
seq2 = request.param
print("seq2:", seq2)
return seq2

@pytest.mark.parametrize("get_seq1",seq1,indirect=True)
@pytest.mark.parametrize("get_seq2",seq2,indirect=True)
def test_1(get_seq1,get_seq2):
print(get_seq1,11)
print(get_seq2,22)

if __name__ == '__main__':
pytest.main()
—————————————————————————————————
运行结果:
test_123.py seq1: 1
seq2: 4
1 11
4 22
.seq1: 2
seq2: 4
2 11
4 22
.seq1: 3
seq2: 4
3 11
4 22
.seq1: 1
seq2: 5
1 11
5 22
.seq1: 2
seq2: 5
2 11
5 22
.seq1: 3
seq2: 5
3 11
5 22
.seq1: 1
seq2: 6
1 11
6 22
.seq1: 2
seq2: 6
2 11
6 22
.seq1: 3
seq2: 6
3 11
6 22
.

 



推荐阅读
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
author-avatar
coolbreeze
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有