【pytest-11】装饰器parametrize参数化的用法

前言

pytest.mark.parametrize装饰器可以实现测试用例参数化。

@pytest.mark.parametrize详解

Pytest中装饰器@pytest.mark.parametrize('参数名',list)可以实现测试用例参数化,类似DDT

如:@pytest.mark.parametrize('请求方式,接口地址,传参,预期结果',[('get','www.baidu.com','{"page":1}','{"code":0,"msg":"成功"})',('post','www.baidu.com','{"page":2}','{"code":0,"msg":"成功"}')])

  • 1.第一个参数是字符串,多个参数中间用逗号隔开
  • 2.第二个参数是list,多组数据用元祖类型,传三个或更多参数也是这样传,list中的每一个元素都是元祖,元祖里的每个元按和参数顺序一一对应
  • 3.传一个参数,@pytest.mark.parametrize('‘参数名’,list)进行参数化
  • 4.传两个参数,@pytest.mark,parametrize('参数名1,参数名2',[(参数1_data[0],参数2_data[0]),(参数2_data[1],参数2_data[1])])进行参数化

示例:

1.是一个引用parametrize装饰器参数化来断言实际值和预期值的示例

#encoding:utf-8
#@Time:2020/12/3 10:16
#@Author:sunny


import pytest

@pytest.mark.parametrize("actual,expected",
                         [('5+5',10),
                          ('3+7',10),
                          ('6*4',10)])
def test_compare(actual,expected):
    assert eval(actual)==expected

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

运行结果:

Testing started at 14:21 ...

============================= test session starts =============================
collected 3 items

cnasuhua.py ..F
cnasuhua.py:7 (test_compare[6*4-10])
10 != 24

Expected :24
Actual   :10
 <Click to see difference>

actual = '6*4', expected = 10

    @pytest.mark.parametrize("actual,expected",
                             [('5+5',10),
                              ('3+7',10),
                              ('6*4',10)])
    def test_compare(actual,expected):
>       assert eval(actual)==expected
E       AssertionError: assert 24 == 10
E        +  where 24 = eval('6*4')

cnasuhua.py:13: AssertionError
                                                          [100%]
=========================== short test summary info ===========================
FAILED cnasuhua.py::test_compare[6*4-10] - AssertionError: assert 24 == 10
========================= 1 failed, 2 passed in 0.07s =========================
Process finished with exit code 0

2.它也可以标记单个用例预期失败或者成功,例如使用内置的mark.xfail

import pytest

@pytest.mark.parametrize("actual,expected",
                         [('5+5',10),
                          (pytest.param("3+7",10,marks=pytest.mark.xfail)),
                          (pytest.param("6*4",72,marks=pytest.mark.xfail))])
def test_compare(actual,expected):
    print("开始测试用例------------")
    assert eval(actual)==expected

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

运行结果:

============================= test session starts =============================
collected 3 items

cnasuhua.py .开始测试用例------------
X开始测试用例------------
x开始测试用例------------

=================== 1 passed, 1 xfailed, 1 xpassed in 0.08s ===================

执行(使用xfail标记的用例仍然会执行):

  • xfailed  为失败的用例,小写 x
  • xpassed  为通过的用例,大写 X

参数组合

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

import pytest


@pytest.mark.parametrize("x",[0,1])
@pytest.mark.parametrize("y",[2,3])
def test_zuhe(x,y):
    print("测试数据组合:x=%s,y=%s"%(x,y))

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

运行结果:

cnasuhua.py 测试数据组合:x=0,y=2
.测试数据组合:x=1,y=2
.测试数据组合:x=0,y=3
.测试数据组合:x=1,y=3

 

posted @ 2020-12-03 17:59  做一只热爱生活的小透明  阅读(526)  评论(0)    收藏  举报