【问题标题】:pytest add option to skip fixture setuppytest 添加选项以跳过夹具设置
【发布时间】:2019-03-22 11:11:36
【问题描述】:

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

我的问题是:我怎样才能跳过夹具,以免出现测试设置失败错误?也就是说,如果设备未连接,则会在夹具设置过程中引发错误。

EDIT(奖励)如果连接完全失败,可能会自动初始化跳过标记?

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

EDIT 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

【问题讨论】:

    标签: python pytest


    【解决方案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
    

    【讨论】:

    • 我已经将此模式用于 Great Good ,例如在找不到弹性搜索可执行文件时跳过依赖弹性搜索的测试。不过,我可能会建议使用is_live 而不是裸露的live 作为夹具名称——因为虽然它被注释为布尔值,但在使用var 时该注释不可见; is_live 丢弃任何歧义,“live”可能是动词(因此是一种方法)。
    • 我不认为这个答案可以进一步改进,干得好!
    猜你喜欢
    • 2019-10-20
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    相关资源
    最近更新 更多