Как выполнить шаг явно в реализации шага
Я хочу явно пропустить шаг в behave
когда я сталкиваюсь с исключением
например. Я пишу код в соответствии с поведением документации -
from behave import *
@when('verify test fails.*?(?P<param_dict>.*)')
def test_logger(context, param_dict):
try:
logger.info("testing the logger. this is info message")
logger.info(1/0)
except Exception as e:
logger.error("arrived at exception: "+str(e))
fail("failed with exception: "+str(e))
но он выдает эту ошибку:
NameError: имя 'fail' не определено
Я пробовал и другие способы, но ничего не работает, например. context.failed = True
(тоже не сработало)
Если я не пытаюсь явно потерпеть неудачу, конечный результат теста становится PASS, даже если он идет в блоке исключений... что странно.
2 ответа
context.failed
это только атрибут, установленный Behave, и ничего не делает как есть. Это информационный атрибут, и хотя вы можете использовать его для определения случая сбоя и выдать ошибку подтверждения, он ничего не будет делать сам по себе. Смотрите context.failed
Для fail
метод, который вы упомянули, вероятно, из unittest
модуль, как видно здесь. Этот модуль также используется в тестах разработки Behave (см. Их Github). Я согласен, хотя, что это должно быть разъяснено в их документации.
Чтобы исправить ошибку, вам нужно импортировать unittest
модуль. Чтобы явно пропустить шаг, вы просто вызовете исключение после того, как зарегистрируете свое сообщение, что-то вроде этого:
except Exception as e:
logger.error("arrived at exception: "+str(e))
fail("failed with exception: "+str(e))
raise
Как @Verv упомянул в своем ответе, шаг поведения будет помечен как невыполненный при возникновении исключения, поэтому вы можете просто повторно вызвать его.
Тем не менее, поведение покажет обратную трассировку для нормальных исключений, тогда как вы, вероятно, просто хотите показать конкретное сообщение об ошибке.
Для этого поднять AssertionError
, В вашем коде это будет выглядеть так:
except Exception as e:
logger.error("arrived at exception: " + str(e))
raise AssertionError("failed with exception: " + str(e))
Если вести себя встречает AssertionError
, он потерпит неудачу на шаге, отобразит сообщение, с которым вы создали ошибку, но не отобразит другие вещи исключения.