2014-10-22 5 views
8

Есть ли способ сказать, что нужно выполнить операцию шага, чтобы пропустить текущий шаг?Пропустить шаг на шаг в реализации этапа

Что-то вроде:

@given("bla bla bla") 
def step(): 
    skip_current_step() 

Прецедент является то, что я хочу, чтобы проверить, установлен ли некоторое дополнительное программное обеспечение. Если нет, я хочу, чтобы полный сценарий был пропущен.

ответ

3

Я не знаю, если вы можете пропустить внутри шага, но вы можете пропустить весь сценарий на уровне признака:

def before_feature(context, feature): 
    is_software_installed = some_foo_magic() 

    if not is_software_installed: 
     for scenario in feature.scenarios: 
      if depends_on_software(scenario): 
       scenario.mark_skipped() 

Feature, Scenario и ScenarioOutline все есть метод mark_skipped().

8

Позвольте мне улучшить @ ответ Барри:

В принципе, то, что он предложил (т.е. scenario.mark_skipped()) равна:

scenario.skip(require_not_executed=True) 

Чтобы быть точным, источник mark_skipped() «s выглядит следующим образом:

def mark_skipped(self): 
    """Marks this scenario (and all its steps) as skipped. 
    Note that this method can be called before the scenario is executed. 
    """ 
    self.skip(require_not_executed=True) 
    assert self.status == "skipped", "OOPS: scenario.status=%s" % self.status 

skip() определяется следующим образом:

def skip(self, reason=None, require_not_executed=False) 

Несколько вещей:

  • require_not_executed=True означает, что сценарий не может быть пропущен, если какой-либо шаг уже пройден, т.е. mark_skipped() во втором или более позднем этапе будет сгенерировано исключение, а затем пропустить все шаги, потом, вместо того, чтобы просто пропуская дальнейшие шаги
  • skip() позволяет указать причину пропуска, которая затем регистрируется как WARN.

Кроме того, scenario объект доступен в контексте, как context.scenario (наряду с context.feature).

В конечном счете, простой пример:

@given("test photos in upload directory") 
def step_impl(context): 
    if not connection_available(): 
     context.scenario.skip(reason='internet connection is unavailable') 

Результат:

Skipped: skipped 
WARNING:behave:SKIP Scenario Retrieving uploaded photo details: internet connection is unavailable 
+1

В интересах тех, кто по-прежнему находится на 1.2.4 (например, я был до нескольких минут назад): код из кодовой базы behave, который указан в этом ответе, равен 1.2.5. – Louis

+0

Есть ли способ распечатать захваченные записи для пропущенных сценариев? Кажется, что предупреждения печатаются только в случае сбоя сценария (т. Е. Размещение 'assert False' после' script.skip() 'показывает захваченное ведение журнала). – mschrimpf

+0

Чтобы ответить на мой собственный вопрос: я закончил тем, что добавил обработчик журнала, который регистрирует только записи, где msg начинается с «SKIP» – mschrimpf

2

Это зависит от эффекта, который вы собираетесь после. Если вы хотите, чтобы вы пропустили один шаг и только этот единственный шаг, то с версии 1.2.5 behave не предоставляет API для этого. Если вы посмотрите на behave/model.py, вы увидите, что нет skip и mark_skipped методов для класса Step. Для этого не существует альтернативного механизма.

Если вы хотите, чтобы вы пометили шаг и весь его сценарий, как пропущенный, тогда это возможно. Если вы в порядке с этим, то answer by Barry действительно то, что вам нужно было сделать, чтобы вести себя до 1.2.5: используйте before_feature для сканирования сценариев и отметьте их как пропущенные перед их запуском. Это будет эффективно отмечать ваш шаг как пропущенный.

В качестве m4tx's answer shows, по состоянию на поведение 1.2.5 вы можете позвонить context.scenario.skip с помощью функции выполнения шага, чтобы пропустить сценарий. Однако, опять же, это отметит весь сценарий как пропущенный. Верно, что предыдущие шаги будут выполнены и будут иметь шанс провалиться, но когда сценарий появится в числе пропущенных сценариев и все его шаги (в том числе те, которые могли пройти до этапа, который вызвал context.scenario.skip) появится в списке пропущенных шагов. Более того, шаги, которые следуют за шагом, который называется context.scenario.skip, не будут выполняться вообще.

Смежные вопросы