Pytest_参数化(10)

pytest参数化有两种方式:

  • mark的parametrize标记:@pytest.mark.parametrize(变量名,变量值),其中变量值类型为列表、元组或其它可迭代对象。
  • fixture的params参数:@pytest.fixture(params=变量值),其中变量值类型为列表、元组或其它可迭代对象。

接下来以上面两种方式演示参数化的多种情况。

一、单变量参数化

演示代码如下:

import pytest


# params的值为参数化的值,被装饰的函数为变量名,函数的request形参是固定写法不可修改,return的返回值也是固定写法
@pytest.fixture(params=(1, 2))
def login_data(request):
    return request.param


class TestLogin:

    # parametrize参数化时,需传入两个参数,第一个参数为变量名,第二个参数为参数化的值
    @pytest.mark.parametrize("data", ["a", "b"])
    def test_login_001(self, data):
        print("执行用例001")
        print(f"调用参数-{data}")

    # 调用被@pytest.fixture装饰的函数
    def test_login_002(self, login_data):
        print("执行用例002")
        print(f"调用参数-{login_data}")

执行结果如下:

二、多变量参数化

演示代码如下:

import pytest


# params的值为参数化的值,被装饰的函数为变量名,函数的request形参是固定写法不可修改,return的返回值也是固定写法
@pytest.fixture(params=((1, 2), (3, 4)))
def login_data(request):
    return request.param


class TestLogin:

    # parametrize参数化时,需传入两个参数,第一个参数为变量名,第二个参数为参数化的值
    @pytest.mark.parametrize("data1, data2", [("a1", "a2"), ("b1", "b2")])
    def test_login_001(self, data1, data2):
        print("\n执行用例001")
        print(f"调用参数-{data1}-{data2}")

    # 调用被@pytest.fixture装饰的函数
    def test_login_002(self, login_data):
        print("\n执行用例002")
        print(f"调用参数-{login_data[0]}-{login_data[1]}")

    # parametrize,也可以像fixture用一个变量名使用索引的方式取值。
    @pytest.mark.parametrize("data", [("a1", "a2"), ("b1", "b2")])
    def test_login_003(self, data):
        print("\n执行用例001")
        print(f"调用参数-{data[0]}-{data[1]}")

执行结果如下:

三、字典变量参数化

演示代码如下:

import pytest


# params的值为参数化的值,被装饰的函数为变量名,函数的request形参是固定写法不可修改,return的返回值也是固定写法
@pytest.fixture(params=({"username": "aaa", "password": 111}, {"username": "bbb", "password": 222}))
def login_data(request):
    return request.param


class TestLogin:

    # parametrize参数化时,需传入两个参数,第一个参数为变量名,第二个参数为参数化的值
    @pytest.mark.parametrize("data", [{"username": "ccc", "password": 333}, {"username": "ddd", "password": 444}])
    def test_login_001(self, data):
        print("\n执行用例001")
        print(f"调用参数-{data['username']}-{data['password']}")

    # 调用被@pytest.fixture装饰的函数
    def test_login_002(self, login_data):
        print("\n执行用例002")
        print(f"调用参数-{login_data['username']}-{login_data['password']}")

执行结果如下:

四、多次参数化

多次参数化会产生像笛卡尔积一样的结果。

演示代码如下:

import pytest


# params的值为参数化的值,被装饰的函数为变量名,函数的request形参是固定写法不可修改,return的返回值也是固定写法
@pytest.fixture(params=({"username": "aaa", "password": 111}, {"username": "bbb", "password": 222}))
def login_data(request):
    return request.param


@pytest.fixture(params=["xxs://xxx.com", "dds://ddd.com"])
def env_data(request):
    return request.param


class TestLogin:

    # parametrize参数化时,需传入两个参数,第一个参数为变量名,第二个参数为参数化的值
    @pytest.mark.parametrize("data1", [{"username": "ccc", "password": 333}, {"username": "ddd", "password": 444}])
    @pytest.mark.parametrize("data2", ["var1", "var2"])
    def test_login_001(self, data1, data2):
        print("\n执行用例001")
        print(f"调用参数-{data1['username']}-{data1['password']}")
        print(f"调用参数-{data2}")

    # 调用被@pytest.fixture装饰的函数
    def test_login_002(self, login_data, env_data):
        print("\n执行用例002")
        print(f"调用参数-{login_data['username']}-{login_data['password']}")
        print(f"调用参数{env_data}")

执行结果如下:

 

posted @ 2021-04-30 16:38  码上测  阅读(150)  评论(0编辑  收藏  举报