参数化

前言:

我们知道,在日常的测试场景中,会有同个功能,多条不同数据的测试场景,如登录:账号正确&密码正确,账号正确&密码错误等等。我们需要写多条

测试用例吗,当然不用。使用参数化可以在一条测试用例上执行多个不同场景的数据,从而达到代码复用的目的。

 

一、@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拿到其返回值。

 

posted @ 2022-03-08 09:40  Target_L  阅读(161)  评论(0)    收藏  举报