假设我有一部分利用pyserial连接的测试。跳过相关的测试功能与文档中的--runslow
示例大致相同。
我的问题是:如何跳过固定装置,以免出现测试设置失败的错误?也就是说,如果未连接设备,则在夹具安装过程中会引发错误。
EDIT (奖励)是否可以在连接完全失败的情况下自动设置跳过标记?
编辑2 我想我是在问两个TODO
中的哪一个是“正确”的方法?
编辑3 也许只是设置autouse=False
并确保已标记使用夹具的每个测试功能?
以下是我要执行的操作的示例:
# 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
答案 0 :(得分:1)
此实施取得成功;希望得到反馈:
# 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