<p><strong><em>TL;DR</em></strong>-<br/>
问题出在线路上</p>
<pre class="lang-py prettyprint-override"><code>@pytest.mark.parametrize("entrada","esperado",[ ... ])
</code></pre>
<p>应将其写入逗号分隔的字符串:</p>
<pre class="lang-py prettyprint-override"><code>@pytest.mark.parametrize("entrada, esperado",[ ... ])
</code></pre>
<hr/>
<p>您获得了<code>indirect fixture</code>,因为pytest无法解压缩给定的<code>argvalues</code>,因为它获得了错误的<code>argnames</code>参数。您需要确保所有参数都作为一个字符串写入</p>
<p>请参阅<a href="https://docs.pytest.org/en/latest/reference.html#pytest-mark-parametrize-ref" rel="noreferrer">documentation</a>:</p>
<blockquote>
<p>The builtin pytest.mark.parametrize decorator enables parametrization of arguments for a test function.</p>
<p>Parameters:<br/>
1. <strong><em>argnames</em></strong> – a comma-separated string denoting one or more argument names, or a list/tuple of argument strings.<br/>
2. <strong><em>argvalues</em></strong> – The list of argvalues determines how often a test is invoked
with different argument values.</p>
</blockquote>
<p>也就是说,您应该将要参数化的参数编写为单个字符串,并使用逗号分隔它们。因此,您的测试应该如下所示:</p>
<pre class="lang-py prettyprint-override"><code>@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
</code></pre>