pytest中出现“indirect fixture”错误。出了什么问题?

53
 def fatorial(n):
    if n <= 1:
        return 1
    else:
        return n*fatorial(n - 1)


import pytest

@pytest.mark.parametrize("entrada","esperado",[
    (0,1),
    (1,1),
    (2,2),
    (3,6),
    (4,24),
    (5,120)
])

def testa_fatorial(entrada,esperado):
    assert fatorial(entrada)  == esperado

错误:

 ERROR collecting Fatorial_pytest.py ____________________________________________________________________
In testa_fatorial: indirect fixture '(0, 1)' doesn't exist

我不知道为什么会出现“间接装置”的问题。你有什么想法吗? 我正在使用Python 3.7和Windows 10 64位。

3个回答

147
TL;DR - 问题出在这一行:{{The problem is with the line

}}。
@pytest.mark.parametrize("entrada","esperado",[ ... ])

应该写成逗号分隔的字符串:

@pytest.mark.parametrize("entrada, esperado",[ ... ])

您获得了“间接装置”,因为pytest无法解包给定的“argvalues”,因为它得到了错误的“argnames”参数。您需要确保所有参数都写成一个字符串。
请参阅文档: pytest.mark.parametrize内置装饰器使测试函数的参数化成为可能。
参数: 1. argnames-逗号分隔的字符串,表示一个或多个参数名称,或参数字符串的列表/元组。 2. argvalues-argvalues列表确定测试如何使用不同的参数值调用。
这意味着,您应该将要参数化的参数编写为单个字符串,并使用逗号分隔它们。因此,您的测试应该像这样:
@pytest.mark.parametrize("n, expected", [
    (0, 1),
    (1, 1),
    (2, 2),
    (3, 6),
    (4, 24),
    (5, 120)
])
def test_factorial(n, expected):
    assert factorial(n) == expected

1
有人猜测这个极具误导性的错误的来源是什么吗? - Neowizard
1
TL;DR 是一个非常节省时间的工具,非常好用。 - Gulzar
很酷,这就是答案。 - emboole

2
我因为省略参数值周围的方括号而收到了类似的错误,例如:
@pytest.mark.parametrize('task_status', State.PENDING,
                                         State.PROCESSED,
                                         State.FAILED)

给出错误信息:“间接装置'P'不存在”。解决方法:
@pytest.mark.parametrize('task_status', [State.PENDING,
                                         State.PROCESSED,
                                         State.FAILED])

0

对于其他因同样原因来到这里的人,如果你正在使用一个id列表标记你的测试用例,那么这个id列表必须是一个命名参数,像这样:

@pytest.mark.parametrize("arg1, arg2", paramlist, ids=param_ids)

替代

@pytest.mark.parametrize("arg1, arg2", paramlist, param_ids)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接