参数化
前言:
我们知道,在日常的测试场景中,会有同个功能,多条不同数据的测试场景,如登录:账号正确&密码正确,账号正确&密码错误等等。我们需要写多条
测试用例吗,当然不用。使用参数化可以在一条测试用例上执行多个不同场景的数据,从而达到代码复用的目的。
一、@pytest.mark.parametrize()
参数列表:
argnames:参数名,可以是字符串形式,也可以是list与tuple的嵌套。
argvalues:参数值,list。
indirect:默认False,如果为True,则会将传入的参数当作函数执行。
ids:用例名称列表,配合参数化为每条用例定义用例名。
import pytest datas = [{"username": "admin", "password": 123456}, {"username": "admin", "password": 111111}, {"username": "fhf", "password": 123456}] ids = ["accout&password is correct", "password is incorrect", "account is incorrect"] class TestParam: @pytest.mark.parametrize("info", datas, ids=ids) def test_param_1(self, info): print("this is test_param_1") print("the accout is {}, the pwd is {}".format(info["username"], info["password"])) assert info["username"] == "admin" and info["password"] == 123456
执行结果:

可以看到,用例执行了3次。
对于上面的用例,可以进行变形,根据参数个数来编写:
import pytest datas = [("admin", 123456), ("admin", 111111), ("fhf", 123456)] ids = ["accout&password is correct", "password is incorrect", "account is incorrect"] class TestParam1: @pytest.mark.parametrize("username, password", datas, ids=ids) def test_param_2(self, username, password): print("this is test_param_2") print("the accout is {}, the pwd is {}".format(username, password)) assert username == "admin" and password == 123456
难点:当indirect为True时,通常时配合fixture的参数化进行。
import pytest test_data = ["tom", "jerry"] ids = [1, 2] @pytest.fixture() def login_pt(request): user = request.param return user + "123" @pytest.mark.parametrize("login_pt", test_data, ids=ids, indirect=True) def test_pt3(login_pt): name = login_pt print("the name is {}".format(name)) print("this is test_pt3")
当indirect=Ture时,login_pt会被当作函数执行,执行login_pt拿到其返回值。
浙公网安备 33010602011771号