繁体   English   中英

“间接夹具”错误使用 pytest。 怎么了?

[英]“ indirect fixture” error using pytest. What is wrong?

 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 位。

TL;DR-
问题出在线路上

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

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

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

你得到了indirect fixture ,因为 pytest 无法解压缩给定的argvalues ,因为它有一个错误的argnames参数。 您需要确保所有参数都写为一个字符串。

请参阅文档

内置的 pytest.mark.parametrize 装饰器可以对 arguments 进行参数化,以进行测试 function。

参数:
1. argnames – 一个逗号分隔的字符串,表示一个或多个参数名称,或参数字符串的列表/元组。
2. argvalues - argvalues 列表决定了使用不同参数值调用测试的频率。

意思是,您应该将要参数化的 arguments 编写为单个字符串,并使用逗号分隔它们。 因此,您的测试应如下所示:

@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

对于因与我相同的原因而来到这里的其他任何人,如果您使用 id 列表标记测试,则 ids 列表必须是一个命名参数,如下所示:

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

代替

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

由于省略了参数值周围的方括号,我得到了类似的错误,例如

@pytest.mark.parametrize('task_status', State.PENDING,
                                         State.PROCESSED,
                                         State.FAILED)

给出错误'间接夹具'P'不存在'。 修复:

@pytest.mark.parametrize('task_status', [State.PENDING,
                                         State.PROCESSED,
                                         State.FAILED])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM