Pytest_参数化(10)
阅读原文时间:2023年07月10日阅读:1

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}")

执行结果如下: