首页 > 编程语言 >【Python自动化框架pytest(三)--数据驱动(参数化)】

【Python自动化框架pytest(三)--数据驱动(参数化)】

时间:2022-12-17 21:34:25浏览次数:51  
标签:__ parametrize Python -- add pytest 参数 test


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


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

方法:
parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)
常用参数:
argnames:参数名
argvalues:参数对应值,类型必须为list或元组
当参数为一个时格式:[value]
当参数个数大于一个时,格式为:[(param_value1,param_value2.....),(param_value1,param_value2.....)]
ids:使用的数据组别名,类型必须为list或元组,与argvalues一一对应,用于使用的数据组的展示
使用方法:
@pytest.mark.parametrize(argnames,argvalues)
️ 参数值为N个,测试方法就会运行N次

单个参数

在使用pytest.mark.parametrize()传递参数化数据时,测试用例本身必须有参数。
测试用例的参数名必须要跟parametrize传递的参数名保持一致

import pytest

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

# 单个参数的情况
@pytest.mark.parametrize('a', (1,2,3,4))
def test_add(a): # => 作为用例参数,接收装饰器传入的数据
print('\na的值:', a)
assert add(a, 1) == a+1

if __name__ == '__main__':
pytest.main(["-s", "demo.py"])

输出结果:


collected 4 items

demo.py
a的值: 1
.
a的值: 2
.
a的值: 3
.
a的值: 4
.

============================== 4 passed in 0.06s ==============================

注意用法,@pytest.mark.parametrize() 装饰器接收两个参数,一个参数是以字符串的形式标识用例函数的参数,第二个参数以列表或元组的形式传递测试数据。


【Python自动化框架pytest(三)--数据驱动(参数化)】_用例

多个参数

多个参数,@pytest.mark.parametrize()第一个参数依然是字符串, 对应用例的多个参数用逗号分隔。第二个参数为一个二维的列表或者元组

import pytest

# 待测函数
def add(a, b):
return a + b

# 多个参数的情况
@pytest.mark.parametrize('a,b,c', ([1,2,3],[4,5,9],[7,8,15]))
def test_add(a,b,c): # => 作为用例参数,接收装饰器传入的数据
print('\na,b,c的值分别为:', f"{a},{b},{c}")
assert add(a, b) == c

if __name__ == '__main__':
pytest.main(["-s", "demo.py","-v"])


执行后输出:

collecting ... collected 3 items

demo.py::test_add[1-2-3]
a,b,c的值分别为: 1,2,3
PASSED
demo.py::test_add[4-5-9]
a,b,c的值分别为: 4,5,9
PASSED
demo.py::test_add[7-8-15]
a,b,c的值分别为: 7,8,15
PASSED

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

对测试类参数化

以上例子我们是对单个的测试用例进行了数据驱动,如果要对整个测试类操作,其实际上也是对类中的测试方法进行参数化。类中的测试方法的参数必须与@pytest.mark.parametrize()中的标识的参数个数一致且参数名相同。
每个测试用例都会循环执行传入参数的组数的次数


import pytest

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

@pytest.mark.parametrize('a, b, c', ([1,2,3],[4,13,9],[7,8,15]))
class TestAbc():
def test_add1(self,a,b,c): # => 作为用例参数,接收装饰器传入的数据
assert add(a, b) == c
def test_add2(self,a,b,c): # => 作为用例参数,接收装饰器传入的数据
assert add(a, c) == b
def test_other(self,a,b,c):
print("\na,b的值分别为:",f"{a},{b}")

if __name__ == '__main__':
pytest.main(["-s", "demo.py","-v"])

修改结果显示名称

通过上面的运行结果,我们可以看到,为了区分参数化的运行结果,在结果中都会显示数据组合而成的名称。

数据短小还好说,如果数据比较长而复杂的话,那么就会很难看。

@pytest.mark.parametrize() 还提供了第三个 ids 参数来自定义显示结果,数据格式为元组或者列表,与传入的第二个参数一一对应,仅作展示所用。

test_add[1-2-3]这是结果中显示的名称,ids 的修改会作用于[]中的显示。

我们下面的示例简单的为数据编了一个号:

import pytest

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

# ids 的作用
data = ([1,2,3],[4,13,9],[7,8,15])
ids = [f'data{d}' for d in range(len(data))] # => 生成与数据数量相同的名称列表
# ids = ('data0','data1','data2')
@pytest.mark.parametrize('a, b, c', data, ids=ids)
def test_add1(a,b,c):
assert add(a, b) == c


if __name__ == '__main__':
pytest.main(["-s", "demo.py","-v"])

输出结果:

demo.py::test_add1[data0] PASSED
demo.py::test_add1[data1] FAILED
demo.py::test_add1[data2] PASSED

================================== FAILURES ===================================

常用的测试用例管理方式

在进行自动化测试的时候,一般需要对数据进行一个统筹规划实现以用例数据驱动框架进行测试。
常见的有

excel存放
优点: 便于维护,框架成型之后维护用例的人员没有学习成本。
缺点: 执行效率低,且用例量级大的时候易卡顿。

yaml存放
优点: 便于维护,轻便
缺点: 学习成本,用例编写设置不够直观

json存放
优点: 便于维护,轻便
缺点: 学习成本,用例编写设置不够直观

类属性存放
优点: 调用便利
缺点: 学习成本


标签:__,parametrize,Python,--,add,pytest,参数,test
From: https://blog.51cto.com/u_15874356/5950144

相关文章

  • K8S的Kafka监控(Prometheus+Grafana)
    欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos对于部署在K8S上的Kafka来说,Prometheus+Grafana是常用的监控......
  • 【Python自动化框架pytest(四)--其他】
    一、pytest中的skip和xfailskip跳过测试函数skip意味着您希望只有在满足某些条件时测试才能通过,否则pytest应该跳过运行测试。常见的例子是跳过非Windows平台上的仅限Wind......
  • springboot + rabbitmq发送邮件(保证消息100%投递成功并被消费)
    一、先扔一张图image.png说明:本文涵盖了关于RabbitMQ很多方面的知识点,如:消息发送确认机制消费确认机制消息的重新投递消费幂等性,等等这些都是围绕上面那张整体流程图......
  • 简单认识指针数组与数组指针
    指针数组:指针数组就是一个存放指针的数组。//指针数组#include<stdio.h>intmain(){inta[5]={1,2,3,4,5};intb[]={2,3,4,5,6};intc[]=......
  • 【C语言】回调函数、嵌套函数的使用、qsort函数、qsort函数声明、qsort代码示例。
     ......
  • 数据接口
    接口名称速率功能雷电3type-c 40Gbps,即5GB/s数据、视频、PD充电(最高100W)、扩展坞全功能type-ctype-c(usb3.1)10Gbps,900MB/s数据、扩展坞usb3.1Gen2比3.1Gen1和3.0快2倍......
  • Oracle-查询表大小
    --查找特定表大小setlinesize200;colownerfora18;colsegment_namefora28;selectowner,segment_name,sum(bytes/1024/1024)segment_sizefromdba_segments......
  • 【LeeCode】4. 寻找两个正序数组的中位数
    【题目描述】给定两个大小分别为 ​​m​​​ 和 ​​n​​​ 的正序(从小到大)数组 ​​nums1​​​ 和 ​​nums2​​。请你找出并返回这两个正序数组的 中位数 。......
  • VUE组件
    9.Vue组件组件(Component)是Vue.js最强大的功能之一。组件可以扩展HTML元素,封装可重用的代码。组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用......
  • 数据库中的一些简单小问题
    1.常见SQL语句的执行顺序是怎样?(from,on,join,where,groupby,having,select,orderby,limit)2.MySQL服务端的常见组件有哪些?连接器,解析器,优化器,执行器3.MySQL中的InnoDB和MyISAM......