pytest添加选项以跳过灯具设置

时间:2018-10-17 17:28:16

标签: python pytest

假设我有一部分利用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

1 个答案:

答案 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