Pytest 参数化间接输入参数类型:列表与元组问题

Pytest parametrized indirect input arguments types: list vs tuple issue

我正在编写一个带有参数化夹具的 pytest 单元测试,使用间接通过名为 'get_design2' 的类方法实例化设计对象。我需要为每个测试传递三个字符串参数,所以我使用了一个字符串列表,效果非常好。 get_design 的 return 是一个元组,第一项是字符串(输入项 1),第二项是 Design 的实例(从输入项 2 和 3 创建)。

如果我将参数化列表更改为如下所示的元组(这更有意义,因为每组输入参数都是静态的),然后 Pycharm 抱怨第二项 return 来自 get_design 是一个字符串而不是 Design 的实例。测试仍然运行没有问题。

知道为什么它抱怨类型不匹配吗?我认为将参数作为列表与元组传递没有任何区别,因为它们的使用方式完全相同。

@pytest.fixture
def get_design2(request) -> tuple[str, Design]:
    """Return a single instantiated class that can be used for one or many tests."""
    print(f"Instantiating Design object for {request.param[0]}")
    this_design = Design.init_with_paths(request.param[1], request.param[2], request.param[0])
    return request.param[0], this_design


@pytest.mark.parametrize('get_design2',
                         [('foo', '', ''),
                          ('bar', '', ''),
                          ('baz', '', '')],
                         indirect=True)
def test_all_designs(get_design2):
    design_name = get_design2[0]
    this_design = get_design2[1]
    assert this_design.product_name == design_name. # Unresolved attribute reference 'product_name' for class 'str'

查看下面链接的 before/after 代码(显示 IDE 警告)的屏幕截图...

parametrize args as list

parametrize args as tuple with warning

您的代码没问题。这是一个 PyCharm 错误。 IDE 无法处理间接夹具参数化类型推断,请参阅 PyCharm 错误跟踪器 https://youtrack.jetbrains.com/issue/PY-36334 中的相关票证(并为其投票)。