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

Lau*_*uza 20 python pytest python-3.x python-3.7

 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
Run Code Online (Sandbox Code Playgroud)

错误:

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

我不知道为什么我得到了“间接夹具”。知道吗?我使用的是 python 3.7 和 windows 10 64 位。

Mat*_*hak 49

TL;DR -
问题出在线路上

@pytest.mark.parametrize("entrada","esperado",[ ... ])
Run Code Online (Sandbox Code Playgroud)

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

@pytest.mark.parametrize("entrada, esperado",[ ... ])
Run Code Online (Sandbox Code Playgroud)

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

请参阅文档

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

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

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

@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
Run Code Online (Sandbox Code Playgroud)