Pytest - Fixture(10) - 测试用例传参给Fixture

发布时间 2023-05-30 18:24:02作者: 粥雨

Pytest - 测试用例传参给Fixture

  • 大多数时候我们在fixture封装的是登陆、获取cookie等操作,但是一个系统可能不止一个用户,有多个用户;

  • 在写测试用例的时候,如何告诉fixture我们需要登录哪个用户?

  • 可以通过测试用例给 fixture 传递参数,指定登陆用户账户信息。


传单个参数

  • fixture:

    • request 是 pytest 的内置 fixture ,主要用于传递参数;(命名不可变)

    • params 参数:一个可选的参数列表,它将导致多次调用fixture函数和使用它的所有测试;获取当前参数可以使用 request.param


  • 测试用例:

    • parametrize 装饰器:

      • "login" :函数名为 login 的 fixture ;

      • test_data:自定义的测试数据变量;变量为列表形式传递;

      • indirect=True:是将 login 当成一个函数去执行,而不是一个参数;并且将data当做参数传入 login 函数

    • def test_s1(login)

      • 这里的 login 是获取 fixture 返回的值,也是调用为 fixture 的login函数

test_py.py

import pytest

# 封装的登陆fixture
@pytest.fixture()
def login(request):
    # `request`: pytest 的内置 fixture
    # `params` : 一个可选的参数列表
    ##name = request.param 这一步是接收传入的参数
    name = request.param
    print(f"\n== 用户名:{name} ==")
    
    # 返回参数给测试用例使用
    return name

# 测试用例的数据
test_data = ["admin"]

# 测试用例
@pytest.mark.parametrize("login", test_data, indirect=True)
def test_s1(login):
    print("\n用例test_s1:fixture传单个参数")
    
    # 下面login参数,是引用方法login返回的name参数
    print(f"测试用例的登录账号:{login} ")

if __name__ == '__main__':
    pytest.main(['-q', 'test_py.py'])

image-20230530180559388



传多个参数

  • 如果需要传多个参数,可以传递 字典 类型 。

    test_py.py

    import pytest
    
    # 封装的登陆fixture
    @pytest.fixture()
    def login(request):
        user = request.param
        print(f"\n== 用户名:{user['name']},密码:{user['pwd']} ==")
        # 返回参数给测试用例使用
        return user
    
    # 传递多个测试数据,使用数据字典
    test_data = [
        {"name": "admin",
         "pwd": "12345"}
    ]
    
    
    # 测试用例
    @pytest.mark.parametrize("login", test_data, indirect=True)
    def test_s1(login):
        print("\n用例test_s1:fixture传多个参数")
        # 下面login参数,是引用方法login返回的name参数
        print(f"测试用例的登录账号:{login['name']} ")
        print(f"测试用例的登录密码:{login['pwd']} ")
    
    
    if __name__ == '__main__':
        pytest.main(['-q', 'test_py.py'])
    

    image-20230530180655214



多个fixture(一个装饰器)

  • 在只使用一个装饰器情况下,要给多个fixture的传递参数,我们需要修改以下几点:

    • 使用列表 + 元祖传递的参数;

    • 在测试用例的装饰器和测试用例引用的fixture函数,填写需要引用fixture名称;

import pytest


# 登陆用户名fixture
@pytest.fixture()
def login_name(request):
    name = request.param
    print(f"\n== fixture输出的用户名:{name} ==")
    return name


# 登陆密码fixture
@pytest.fixture()
def login_pwd(request):
    pwd = request.param
    print(f"== fixture输出的密码:{pwd} ==")
    return pwd


# 传递测试数据给多个fixture,使用列表+元祖的形式
test_data = [
    ("admin", "123"),
    ("root", "456")
]


# 测试用例
@pytest.mark.parametrize("login_name, login_pwd", test_data, indirect=True)
def test_s1(login_name, login_pwd):
    print("\n用例test_s1: 多个fixture(一个装饰器)")

    # 使用fixture返回的参数
    print(f"测试用例的登录账号:{login_name} ")
    print(f"测试用例的登录密码:{login_pwd} ")

if __name__ == '__main__':
    pytest.main(['-q', 'test_py.py'])

image-20230530180821511



多个fixture(叠加装饰器)

  • 多个fixfure的装饰器的使用;

    • 测试用例执行数 = 装饰器数量 * 一组测试数据量最多的数据
    import pytest
    
    
    # 封装的登陆fixture
    @pytest.fixture()
    def login_name(request):
        name = request.param
        print(f"\n== fixture输出的用户名:{name} ==")
        return name
    
    @pytest.fixture()
    def login_pwd(request):
        pwd = request.param
        print(f"== fixture输出的密码:{pwd} ==")
        return pwd
    
    
    # 测试数据
    name = ["admin", "root"]
    pwd = ["12345", "98765"]
    
    
    # 测试用例,调用多个fixture
    @pytest.mark.parametrize("login_pwd", pwd, indirect=True)
    @pytest.mark.parametrize("login_name", name, indirect=True)
    def test_s1(login_name, login_pwd):
        print("\n用例test_s1:测试用例,调用多个fixture")
    
        # 使用fixture返回的参数
        print(f"测试用例的登录账号:{login_name} ")
        print(f"测试用例的登录密码:{login_pwd} ")
    
    if __name__ == '__main__':
        pytest.main(['-q', 'test_py.py'])
        
    

    image-20230530180943071