gpt4 book ai didi

python - pytest 添加选项以跳过 fixture 设置

转载 作者:太空宇宙 更新时间:2023-11-04 04:29:56 24 4
gpt4 key购买 nike

假设我有一个使用 pyserial 连接的测试子集。跳过相关的测试功能与 --runslow 基本相同。来自文档的示例。

我的问题是:我怎样才能跳过 fixture ,这样我就不会收到测试设置失败的错误?也就是说,如果设备未连接,则在 fixture 设置期间会引发错误。

编辑(奖励)如果连接完全失败,是否自动初始化跳过标记?

EDIT 2 我想我真的是在问这两个 TODO 中哪一个是“正确”的方法?

编辑 3 也许只是设置 autouse=False 并确保标记每个使用 fixture 的测试函数?

这是我正在尝试做的一个例子:

# conftest.py

import pytest

from typing import List
from serial import Serial

from _pytest.nodes import Item
from _pytest.config import Config
from _pytest.config.argparsing import Parser


def pytest_addoption(parser: Parser):
parser.addoption(
"--live",
action="store_true",
default=False,
help="utilize serial connection"
)


def pytest_collection_modifyitems(config: Config, items: List[Item]):
if config.getoption("--live"):
return
skip = pytest.mark.skip(
reason="needs '--live' option to run"
)
for item in items:
if "live" in item.keywords:
item.add_marker(skip)


# fixtures (port, etc.) for connection...


# TODO need to apply skip mark
@pytest.fixture(scope='session', autouse=True)
def serial_connect(port: str, ) -> Serial:

# TODO or catch and pass if config value is False
with Serial(port=port, ) as new:
yield new

最佳答案

此实现取得成功;希望得到反馈:

# conftest.py

import sys
import pytest

from typing import Optional
from serial import Serial, SerialException, \
EIGHTBITS, PARITY_NONE, STOPBITS_ONE

from _pytest.config import UsageError
from _pytest.config.argparsing import Parser


def pytest_addoption(parser: Parser):

parser.addoption(
"--live", action="store_true", default=False,
help="utilize serial connection for associated tests"
)

parser.addoption(
"--port", action="store", type="string", default=None,
help="serial port for establishing connection"
)

parser.addoption(
"--timeout", action="store", type="float", default=None,
help="port timeout for serial connection"
)


@pytest.fixture
def live(request) -> bool:
return request.config.getoption('live')


@pytest.fixture
def port(request) -> str:

value = request.config.getoption('port')

if value is not None:
return value

elif sys.platform.startswith('darwin'):
return "/dev/tty.SLAB_USBtoUART"

elif sys.platform.startswith('linux'):
return "/dev/ttyACM0"

elif sys.platform.startswith('win32'):
return "COM14"

else:
pytest.skip("unspecified '--port' option")


@pytest.fixture
def timeout(request) -> Optional[float]:
return request.config.getoption('timeout')


@pytest.fixture
def connection(live: bool, port: str, timeout: Optional[float]) -> Serial:

if not live:
pytest.skip("needs '--live' option to run")

try:
with Serial(
port=port, baudrate=460800, bytesize=EIGHTBITS,
parity=PARITY_NONE, stopbits=STOPBITS_ONE, timeout=timeout
) as s:
yield s

except SerialException as e:
raise UsageError(
"invoked '--live' option, but connection failed"
) from e

关于python - pytest 添加选项以跳过 fixture 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52860527/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com