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(" 执行用例001") print(f"调用参数-{data1}-{data2}") # 调用被@pytest.fixture装饰的函数 def test_login_002(self, login_data): print(" 执行用例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(" 执行用例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(" 执行用例001") print(f"调用参数-{data['username']}-{data['password']}") # 调用被@pytest.fixture装饰的函数 def test_login_002(self, login_data): print(" 执行用例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(" 执行用例001") print(f"调用参数-{data1['username']}-{data1['password']}") print(f"调用参数-{data2}") # 调用被@pytest.fixture装饰的函数 def test_login_002(self, login_data, env_data): print(" 执行用例002") print(f"调用参数-{login_data['username']}-{login_data['password']}") print(f"调用参数{env_data}")
执行结果如下: