Создание пользовательского результата теста

#pytest

#pytest

Вопрос:

Возможно ли добавить пользовательский результат теста на том же уровне, что и: пройденный, неудачный, xfail, пропущенный, отмененный? Я хотел бы иметь возможность назначать пользовательский результат теста во время настройки прибора, аналогично вызову pytest.skip().

В качестве альтернативы, возможно ли «отменить выбор» тестового примера из устройства (т. Е. Во время настройки устройства, а не на этапе сбора)?

Моя проблема

Я использую pytest не для тестирования кода Python, а для тестирования черного ящика различных устройств, подключенных к хост-компьютеру, на котором выполняется код pytest. Во время одного сеанса pytest я тестирую только одно устройство, но, возможно, несколько интерфейсов (IP, RS-232, GPIO и т.д.).

При запуске pytest я предоставляю в качестве аргумента файл конфигурации. В этом файле указывается IP-адрес устройства, а также интерфейсы, которые хост-компьютер подключил к устройству. Я использую приспособления для пропуска тестов, которые невозможно запустить, потому что либо:

  • Конкретное устройство не реализует функциональность тестового примера
  • Хост не поддерживает функциональность (физический интерфейс) тестового примера

Мне нужно уметь различать эти две причины пропуска тестового примера: при выпуске программного обеспечения мне нужно убедиться, что нет тестов, которые были пропущены из-за конфигурации хоста. Следовательно, я хотел бы установить результат теста «неприменимым» в первом случае и «пропущенным» во втором.

Я мог бы, конечно, указать возможности устройства в командной строке и на этапе сбора pytest отменить выбор тестовых примеров, но мне действительно нужно / требовать / хотеть, чтобы это было сделано во время выполнения. В противном случае количество аргументов для запуска тестов быстро увеличится.

Мои текущие результаты теста выглядят следующим образом:

  • Устройство A: 235 пропущено из 468
  • Устройство B: 445 пропущено из 468

Вы можете видеть, что я использую один и тот же набор тестов для обоих устройств, потому что они имеют большую часть одинаковой функциональности (я просто не написал много тестовых примеров, подтверждающих общую функциональность).

Как бы это выглядело?

Я хотел бы иметь возможность пометить тест «неприменимо» следующим образом:

 @pytest.fixture
def device(myconfig):
    cfg = myconfig.get_ip()
    return Device(cfg.ip, cfg.port)


@pytest.fixture
def serial(device, myconfig):
    if not device.has_serial:
        mark_not_applicable("Device does not support: serial")

    try:
        cfg = myconfig.get_serial()
        return serial.Serial(cfg.device, baudrate=cfg.baudrate)
    except:
        pytest.skip("Host interface not defined for: serial")


@pytest.fixture
def has_alpha(device):
    if not device.has_alpha:
        mark_not_applicable("Device does not support: alpha")


@pytest.fixture
def has_beta(device):
    if not device.has_beta:
        mark_not_applicable("Device does not support: beta")


def test_serial_protocol_alpha(serial, has_alpha):
    check_serial_protocol_alpha()


def test_serial_protocol_beta(serial, has_beta):
    check_serial_protocol_beta()
  

Комментарии:

1. Вы всегда можете skip выполнить тест в приспособлении на основе некоторого условия (используя pytest.skip ). Разве этого не было бы достаточно для вашего варианта использования?

2. Нет, моя проблема в том, что я хотел бы определить, почему он не был запущен: 1) Тестовый пример никогда не следует запускать, 2) тестовый пример не может быть запущен, поскольку настройка хост-компьютера ограничена

3. Да, я понимаю. Я имел в виду, что вы не будете пропускать тесты второго случая для релизов (в случае, если вы можете обнаружить их во время выполнения), поэтому они просто завершатся неудачей. Это, конечно, не различает тесты в других случаях (без выпуска), за исключением того, что вы устанавливаете другое сообщение о пропуске и подсчитываете сообщения в выходных данных.

4. А, я понял. Вы правы, это может быть выходом. Но я бы все же предпочел иметь новый тип результата теста (например, «Не применимо»).

5. Насколько я знаю, это невозможно — текущие типы результатов более или менее жестко запрограммированы в pytest.