#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.