【问题标题】:Pytest: How to parametrize inputPytest:如何参数化输入
【发布时间】:2021-04-29 13:55:53
【问题描述】:

有没有办法将输入传递给 pytest.mark.parametrize()?

如果我尝试……

import pytest
from typing import List


@pytest.mark.parametrize("rotation", range(len(input_sequence)))
def test_sequence_rotation(
    input_sequence: List[float],
    rotation: int,
) -> None:
    sequence = input_sequence[rotation:] + input_sequence[:rotation]
    print(f"Testing sequence {sequence}")

…我得到NameError: name 'input_sequence' is not defined

在某些情况下,我在 conftest.py 中将 input_sequence 定义为 pytest 命令选项:

import pytest
from typing import List
from _pytest.config.argparsing import Parser
from _pytest.fixtures import SubRequest


def pytest_addoption(parser: Parser) -> None:
    parser.addoption("--sequence-csv", type=str, required=True)


@pytest.fixture()
def input_sequence(request: SubRequest) -> List[float]:
    csv = request.config.getoption("--sequence-csv")
    return [float(i) for i in csv.split(",")]

【问题讨论】:

  • input_sequence 的外观如何?如果测试期望名称作为输入参数,它只能是一个夹具。

标签: pytest parametrize


【解决方案1】:

您在调用@pytest.mark.parametrize 时指的是变量input_sequence,但范围内没有这样的变量。您需要在模块级别定义它(直接或从某处导入)。

您还需要将其从test_sequence_rotation 的参数列表中删除。

例如,类似:

import pytest
from typing import List

input_sequence = ['a', 'b', 'c', 'd', 'e']

@pytest.mark.parametrize("rotation", range(len(input_sequence)))
def test_sequence_rotation(rotation: int) -> None:
    sequence = input_sequence[rotation:] + input_sequence[:rotation]
    print(f"Testing sequence {sequence}")

上面的代码在通过pytest -v运行时会产生这样的输出:

============================= test session starts ==============================
platform linux -- Python 3.9.4, pytest-6.0.2, py-1.10.0, pluggy-0.13.1 -- /usr/bin/python3
cachedir: .pytest_cache
rootdir: /home/lars/tmp/python
plugins: cov-2.11.1, flake8-1.0.7, asyncio-0.14.0, xonsh-0.9.26
collecting ... collected 5 items

test_sequence.py::test_sequence_rotation[0] PASSED                       [ 20%]
test_sequence.py::test_sequence_rotation[1] PASSED                       [ 40%]
test_sequence.py::test_sequence_rotation[2] PASSED                       [ 60%]
test_sequence.py::test_sequence_rotation[3] PASSED                       [ 80%]
test_sequence.py::test_sequence_rotation[4] PASSED                       [100%]

============================== 5 passed in 0.03s ===============================

【讨论】:

    猜你喜欢
    • 2014-09-02
    • 2023-02-21
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多