python-3.x pytest -默认的夹具参数值

afdcj2ne  于 2023-05-30  发布在  Python
关注(0)|答案(2)|浏览(180)

我用pytest写了一个fixture,它没有参数化,但被很多测试使用。后来我需要参数化这个夹具。
为了不需要mark.parametrize所有旧的测试,我做了以下几点:

def ldap_con(request):
    try:
        server_name = request.param
    except AttributeError:
        server_name = "ldaps://my_default_server"
    c = Connection(server_name, use_ssl=True)
    yield c
    c.unbind()

现在我可以两者兼得了:

def test_old(ldap_con):
    run_test_to_default_connection(ldap_con)

@pytest.mark.parametrize('ldap_con', ['mynewserver'], indirect=True)
def test_new(ldap_con):
    run_test_to_new_connection(ldap_con)

该解决方案具有几个缺点:

  • 我捕获到任意属性错误(可能还有其他错误)
  • 它不考虑命名参数
  • 读者不清楚是否存在默认值
    是否有一个标准的方法来定义夹具参数的默认值?
mspsb9vt

mspsb9vt1#

不如

import pytest

@pytest.fixture
def server_name() -> str:
    """default value for server_name"""
    return "ldaps://my_default_server"

@pytest.fixture
def ldap_con(server_name: str):
    c = Connection(server_name, use_ssl=True)
    yield c
    c.unbind()

我们可以两者兼得

def test_old(ldap_con):
    run_test_to_default_connection(ldap_con)

@pytest.mark.parametrize('server_name', ['mynewserver'])
def test_new(ldap_con):
    run_test_to_new_connection(ldap_con)
at0kjp5o

at0kjp5o2#

间接参数化是混乱的。为了避免这种情况,我通常编写fixture,使其返回一个函数。最后我会这样写:

def ldap_con():
    def _ldap_con(server_name="ldaps://my_default_server"):
        c = Connection(server_name, use_ssl=True)
        yield c
        c.unbind()
    return _ldap_con

def test_old(ldap_con):
    run_test_to_default_connection(ldap_con())

@pytest.mark.parametrize('server', ['mynewserver'])
def test_new(server):
    run_test_to_new_connection(ldap_con(server))

相关问题