pytest参数化 parametrize

参数化的本质是对列表中的对象进行循环,然后把循环的对象进行一一的赋值,它的应用场景主要是基于相同的业务场景,但是需要不同的测试数据来测试从而达到最大化的覆盖更多的业务场景和测试的覆盖率。理解了这样的一个思想之后,我们就以两个数想加作为案例,来演示Pytest测试框架的参数化实际应用,另外一点需要特别说的是在Pytest测试框架中参数化使用的方式是通过装饰器的方式来进行。刚才也说到它的本质是对列表中的对象进行循环和赋值,那么这个对象可以是列表,也可以是元祖以及和字典数据类型,见如下的实战案例,把测试的数据分离到不同的对象中(列表,元组,字典),源码如下:

#!/usr/bin/env python
#!coding:utf-8

import pytest


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


# ------------------  参数化数据为 列表 ----------------------

@pytest.mark.parametrize("a, b, expect", [
    [1, 1, 2],
    [2, 4, 6],
    [4, 5, 9],
    [6, 2, 8]
])
def test_add_list_success(a, b, expect):
    assert add(a, b) == expect

@pytest.mark.parametrize("a, b, expect", [
    [1, 1, 3],
    [2, 4, 5]
])
def test_add_list_fail(a, b, expect):
    assert add(a, b) != expect


# ------------------  参数化数据为 元组 ----------------------

@pytest.mark.parametrize("a, b, expect", [
    (1, 1, 2),
    (2, 4, 6)
])
def test_add_tuple_success(a, b, expect):
    assert add(a, b) == expect

@pytest.mark.parametrize("a, b, expect", [
    (1, 1, 3),
    (2, 4, 5)
])
def test_add_tuple_fail(a, b, expect):
    assert add(a, b) != expect


# ------------------  参数化数据为 字典 ----------------------

@pytest.mark.parametrize("dict", [
    {"a": 1, "b": 2, "expect": 3},
    {"a": 2, "b": 4, "expect": 6},
])
def test_add_dict_success(dict):
    assert add(dict['a'], dict['b']) == dict['expect']

@pytest.mark.parametrize("dict", [
    {"a": 1, "b": 2, "expect": 4},
    {"a": 2, "b": 4, "expect": 5},
])
def test_add_dict_fail(dict):
    assert add(dict['a'], dict['b']) != dict['expect']

main.py 文件

#

import pytest
if __name__ == '__main__':
    # pytest.main(["-v","test_demo.py"])    # 调用pytest的main函数执行测试
    pytest.main(["-v", './testcase/paramscase/'])    # 调用pytest的main函数执行测试

执行 main.py 文件
image

python main.py
posted @ 2022-04-18 11:26  DeyouKong  阅读(146)  评论(0编辑  收藏  举报