在Unittest里使用DDT装饰器进行数据驱动测试,相对应的,在Pytest里会使用parameterize装饰器进行数据驱动。本文将围绕parameterize装饰测试类和测试方法的区别,传递单个测试数据和多个测试数据的用法,传递不同数据类型(元组,列表,字典)的区别,以及它和DDT之间的区别做一个简要介绍。

一.装饰测试类和测试方法的区别

1.装饰测试类

import pytestlist1 = [(1,1,1),(3,3,9),(5,6,30)]def multi(a,b):return a*b@pytest.mark.parametrize("a,b,c",list1)
class TestParam:def test_1_multi(self,a,b,c):print("测试函数1的数据a是{},b是{},c是{}".format(a,b,c))assert multi(a,b) == cdef test_2_multi(self,a,b,c):print("测试函数2的数据a是{},b是{},c是{}".format(a,b,c))assert multi(a,b) == cif __name__ == '__main__':pytest.main()

输出结果是:

test_param.py .测试函数1的数据a是1,b是1,c是1
.测试函数1的数据a是3,b是3,c是9
.测试函数1的数据a是5,b是6,c是30
.测试函数2的数据a是1,b是1,c是1
.测试函数2的数据a是3,b是3,c是9
.测试函数2的数据a是5,b是6,c是30[100%]========================== 6 passed in 0.26 seconds ===========================
Process finished with exit code 0

2.装饰测试方法

import pytestlist1 = [(1,1,1),(3,3,9),(5,6,30)]
list2 = [(1,3,3),(2,3,6),(3,6,18)]def multi(a,b):return a*bclass TestParam:@pytest.mark.parametrize("a,b,c", list1)def test_1_multi(self,a,b,c):print("测试函数1的数据a是{},b是{},c是{}".format(a,b,c))assert multi(a,b) == c@pytest.mark.parametrize("a,b,c", list2)def test_2_multi(self,a,b,c):print("测试函数2的数据a是{},b是{},c是{}".format(a,b,c))assert multi(a,b) == cif __name__ == '__main__':pytest.main()

输出结果是:

test_param.py .测试函数1的数据a是1,b是1,c是1
.测试函数1的数据a是3,b是3,c是9
.测试函数1的数据a是5,b是6,c是30
.测试函数2的数据a是1,b是3,c是3
.测试函数2的数据a是2,b是3,c是6
.测试函数2的数据a是3,b是6,c是18[100%]========================== 6 passed in 0.08 seconds ===========================
Process finished with exit code 0

由此可见,装饰测试类时,会把所有的测试数据传给所有的测试函数,装饰测试函数时,只会将测试数据传给制定的测试函数。

二.传递单个测试数据和多个测试数据

1.传递单个数据

import pytest
list0 = [1,2,3,4,5,6,7]@pytest.mark.parametrize("a", list0)
def test_1_multi(self,a):print("测试函数1的数据a是{}".format(a))if __name__ == '__main__':pytest.main(["-v"])

输出:

test_param.py .测试函数1的数据a是1
.测试函数1的数据a是2
.测试函数1的数据a是3
.测试函数1的数据a是4
.测试函数1的数据a是5
.测试函数1的数据a是6
.测试函数1的数据a是7[100%]========================== 7 passed in 0.11 seconds ===========================
Process finished with exit code 0

2.传递多个数据
(1)用一个参数接受多个测试数据
(2)用多个参数接受多个测试数据

import pytestlist1 = [(1,1,1),(3,3,9),(5,6,30)]
list2 = [(1,3,3),(2,3,6),(3,6,18)]def multi(a,b):return a*bclass TestParam:@pytest.mark.parametrize("data", list1)def test_1_multi(self,data):print("测试函数2的数据a是{},b是{},c是{}".format(data[0],data[1],data[2]))assert multi(data[0], data[1]) == data[2]@pytest.mark.parametrize("a,b,c", list2)def test_2_multi(self,a,b,c):print("测试函数2的数据a是{},b是{},c是{}".format(a,b,c))assert multi(a,b) == cif __name__ == '__main__':pytest.main(["-v"])

输出结果:

test_param.py .测试函数2的数据a是1,b是1,c是1
.测试函数2的数据a是3,b是3,c是9
.测试函数2的数据a是5,b是6,c是30
.测试函数2的数据a是1,b是3,c是3
.测试函数2的数据a是2,b是3,c是6
.测试函数2的数据a是3,b是6,c是18[100%]========================== 6 passed in 0.07 seconds ===========================
Process finished with exit code 0

当测试用例需要多个测试数据时,我们可以使用嵌套元组的列表来传递测试数据,
第一种方法:用一个参数接受数据,就是传入一个元组,元组里的数据运用索引的方法就可以提取出来;
第二种方法:用多个参数接收数据,则位置参数与实际测试数据一一对应即可。

三.传递不同数据类型(元组,列表,字典)

import pytestlist1 = [(1,1,1),(3,3,9),(5,6,30)]
list2 = [[1,3,3],[2,3,6],[3,6,18]]
list3 = [{"a":1,"b":5,"c":5},{"a":2,"b":5,"c":10},{"a":3,"b":5,"c":15}]def multi(a,b):return a*bclass TestParam:# 测试数据为嵌套元组的列表@pytest.mark.parametrize("data", list1)def test_1_multi(self,data):print("测试函数1的数据a是{},b是{},c是{}".format(data[0],data[1],data[2]))assert multi(data[0], data[1]) == data[2]# 测试数据为嵌套列表的列表@pytest.mark.parametrize("a,b,c", list2)def test_2_multi(self,a,b,c):print("测试函数2的数据a是{},b是{},c是{}".format(a,b,c))assert multi(a,b) == c# 测试数据为嵌套字典的列表@pytest.mark.parametrize("dict1", list3)def test_3_multi(self, dict1):print("测试函数3的数据a是{},b是{},c是{}".format(dict1["a"], dict1["b"], dict1["c"]))assert multi(dict1["a"], dict1["b"]) == dict1["c"]if __name__ == '__main__':pytest.main(["-v"])

输出结果:

test_param.py .测试函数1的数据a是1,b是1,c是1
.测试函数1的数据a是3,b是3,c是9
.测试函数1的数据a是5,b是6,c是30
.测试函数2的数据a是1,b是3,c是3
.测试函数2的数据a是2,b是3,c是6
.测试函数2的数据a是3,b是6,c是18
.测试函数3的数据a是1,b是5,c是5
.测试函数3的数据a是2,b是5,c是10
.测试函数3的数据a是3,b是5,c是15[100%]========================== 9 passed in 0.10 seconds ===========================
Process finished with exit code 0

由此可见,parametrize支持元组,列表,字典嵌套的列表传递多个测试数据,字典嵌套的列表传递测试数据时可以使用一个参数来接收,用字典索引的方式传入对应数据,同上述以一个参数接受测试数据的方法

四.parameterize和DDT之间的区别

传入单个测试数据时,ddt和parameterize无差别;
但是传入多个测试数据,用到嵌套元组的列表(以嵌套元组的列表为例)时,
ddt传入数据,需要在装饰器@data(*列表)对列表做一个解包操作,然后再用一个参数去接收解包后的元组,最后使用索引方式一一接受数据,类似于parameterize用一个参数接受多个数据的处理方式;
使用parameterize则不需要解包,直接用一个参数接收即可,或使用位置参数接受,更为灵活。

pytest之parameterize参数化相关推荐

  1. 11、pytest -- 测试的参数化

    目录 1. @pytest.mark.parametrize标记 1.1. empty_parameter_set_mark选项 1.2. 多个标记组合 1.3. 标记测试模块 2. pytest_g ...

  2. 【pytest】(详解)@pytest.mark.parametrize: 参数化测试函数

    目录 1.快速入门 1.1介绍 1.2代码示例 1.3运行结果 1.4结果分析 2.装饰测试类 2.1介绍 2.2示例代码 2.3.运行结果 2.4结果分析 3.全局变量方式进行参数化 3.1介绍 3 ...

  3. pytest的url参数化调用和预期结果参数化

    1.url参数化 用format实现参数化 def test_get_path(): # 使用.format进行字符串格式化r = requests.request("GET",& ...

  4. pytest之fixture参数化

    背景 本文总结fixture参数化 说明 pytest除了支持基本的测试用例参数化,还支持fixture参数化.当然,fixture参数化的过程与测试用例参数化有点点区别. fixture的参数化涉及 ...

  5. Pytest中测试用例参数化时ids中文乱码处理

    两种处理办法 1.在pytest.ini中添加: disable_test_id_escaping_and_forfeit_all_rights_to_community_support = True ...

  6. 【单元测试】pytest:配置|断言|参数化|夹具|装饰器|插件

    [单元测试]pytest 入门案例 pytest配置文件 断言 参数化 夹具 模块级 类级 方法级 函数级 fixture装饰器 插件 unittest:python自带的单元测试框架,兼容性好 py ...

  7. python制作考试系统_Python系统学习 - Pytest单元测试框架

    哈咯,大家,我们今天来学习pytest单元测试框架,这个框架要比unittest更加易于使用,结构性也更加好,希望大家能够从中学习到有用的东西,然后在下一章,我们来使用pytest单元测试框架来搭建一 ...

  8. 浅谈pytest+HttpRunner如何展开接口测试

    数栈是-站式大数据开发平台,我们在github和gitee上有一个有趣的开源项目:FlinkX,FlinkX是一个基于Flink的批流统一的数据同步工具,既可以采集静态的数据,也可以采集实时变化的数据 ...

  9. Web自动化之Pytest测试框架

    pytest是一个python的单元测试框架,可以用于自动化测试中. 用例规则 pytest命令执行测试时,如果我们不指定具体的文件,PyTest默认从当前路径及其所有子目录中搜索py源文件,所有名字 ...

  10. Python测试框架pytest(23)插件 - pytest-picked、pytest-lazy-fixture

    目录 1.pytest-picked(运行未提交的git用例) 1.1.安装 1.2.参数 1.3.用法 1.4.示例 2.pytest-lazy-fixture(在pytest.mark.param ...

最新文章

  1. 【转】Linux入门命令篇(简训)
  2. 二次探测再散列举例_二次探测散列法
  3. 快速沃尔什变换:从入门到背板(含推导过程)
  4. Kali Linux 2019.1 发布,Metasploit 更新到 5.0 版本
  5. ASP.NET中Server.MapPath() 和Request.MapPath()使用
  6. ibatis resultclass java.util.list_mybatis 动态sql返回一个List封装类报错求解决方法
  7. “密码人”越来越多将会出现“密码危机”
  8. vb.net使用DirectX入门知识
  9. Qt在Mac环境下制作dmg安装包
  10. 5G火车站来了!上海虹桥火车站5G网络建设正式启动...
  11. 【人月神话】浅谈人月神话0.2什么是“人月”,为什么是“神话”?
  12. 数据库——概念模型(CDM)、逻辑模型(LDM)、物理模型(PDM)
  13. OD CE找数据总结(上)
  14. phpstorm连接mysql
  15. (油猴脚本网盘下载加速)
  16. 【Windows10安装CUDA和cuDNN】
  17. 图论练习题(存起来练)
  18. 微信群管理机器人开发sdk
  19. 4~20mA电流输出芯片XTR111完整电路
  20. 【shell】if常用判断|if目录是否为空|判断字符串包含关系|与或

热门文章

  1. 论文阅读:(NIPS 2021)NeRV: Neural Representations for Videos
  2. 3GPP协议文档查询网站
  3. 计算机组成原理练习题(第6章 计算机的运算方法(中))
  4. 在uni-app中使用腾讯视频插件播放视频
  5. 陆奇加入拼多多,担任技术委员会主席!
  6. 人物摄影中的基本取景法 特写和大特写
  7. SAP 获取不同币种间的汇率 RFC BAPI_EXCHANGERATE_GETDETAIL
  8. alert uuid does not exits. Dropping to a shell!
  9. 魅族手机刷鸿蒙,魅族很机灵:宣布加入鸿蒙,大家以为魅族手机用鸿蒙,其实并不是...
  10. win7计算机u盘不显示盘符,win7系统识别U盘但不显示盘符该如何解决?