[英]pytest: passing keyword arg to fixture using pytest.mark.parametrize with indirect parameterization
[英]“ 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.