Исключение неоднозначного шага показано для разных имен шагов в python behavior - PullRequest
1 голос
/ 04 августа 2020

У меня есть два разных файла python в каталоге шагов: driverlogon.py и triplogon.py

driverlogon.py определяет шаг

@when(u'enter the {driver_id}')
def step_enter_the_driver_id(context,driver_id):
    SelectDriver.input_driver(driver_id)

triplogon.py определяет шаг

@when(u'enter the configured block number')
def step_enter_the_configured_block_number(context):
    ByBlock.enter_block(context.block)

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

Exception AmbiguousStep: @when('enter the configured block number') has already been defined in
  existing step @when('enter the {driver_id}') at steps/driverlogon.py:26
Traceback (most recent call last):
  File "C:\Program Files (x86)\Python\Lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "C:\Program Files (x86)\Python\Lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Program Files (x86)\Python\Scripts\behave.exe\__main__.py", line 7, in <module>
  File "c:\program files (x86)\python\lib\site-packages\behave\__main__.py", line 183, in main
    return run_behave(config)
  File "c:\program files (x86)\python\lib\site-packages\behave\__main__.py", line 127, in run_behave
    failed = runner.run()
  File "c:\program files (x86)\python\lib\site-packages\behave\runner.py", line 804, in run
    return self.run_with_paths()
  File "c:\program files (x86)\python\lib\site-packages\behave\runner.py", line 809, in run_with_paths
    self.load_step_definitions()
  File "c:\program files (x86)\python\lib\site-packages\behave\runner.py", line 796, in load_step_definitions
    load_step_modules(step_paths)
  File "c:\program files (x86)\python\lib\site-packages\behave\runner_util.py", line 412, in load_step_modules
    exec_file(os.path.join(path, name), step_module_globals)
  File "c:\program files (x86)\python\lib\site-packages\behave\runner_util.py", line 386, in exec_file
    exec(code, globals_, locals_)
  File "steps\triplogon.py", line 23, in <module>
    @when(u'enter the configured block number')
  File "c:\program files (x86)\python\lib\site-packages\behave\step_registry.py", line 92, in wrapper
    self.add_step_definition(step_type, step_text, func)
  File "c:\program files (x86)\python\lib\site-packages\behave\step_registry.py", line 58, in add_step_definition
    raise AmbiguousStep(message % (new_step, existing_step))
behave.step_registry.AmbiguousStep: @when('enter the configured block number') has already been defined in
  existing step @when('enter the {driver_id}') at steps/driverlogon.py:26

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

В качестве решения, если вы хотите сохранить эти имена, вы можете написать:

driverlogon.py

@when(u'enter the "{driver_id}"')
def step_enter_the_driver_id(context,driver_id):
     SelectDriver.input_driver(driver_id)

triplogon.py

@when(u'enter the configured block number') 
def step_enter_the_configured_block_number(context):
   ByBlock.block_data(context.block)

Исключение не будет в этом случае будет поднят, но driver_id будет передан как строка, а шаг будет выглядеть следующим образом:

When enter the "10"

Но, если вы хотите, чтобы он был проанализирован как int вместо этого вы можете использовать предопределенные типы данных d в этом случае, как показано ниже:

@when(u'enter the "{driver_id:d}"')
def step_enter_the_driver_id(context,driver_id):
     SelectDriver.input_driver(driver_id)

https://behave.readthedocs.io/en/latest/parse_builtin_types.html

0 голосов
/ 04 августа 2020

Определения шагов работают следующим образом:

  • Вы создаете новый файл py
  • Вы добавляете определение новой функции в этот файл
    • В этом если оба ваших файла имеют одинаковое имя функции, def step_impl
  • Вы украшаете свою новую функцию текстом файла функций, который хотите связать с ней
    • enter the {driver_id}
    • enter the configured block number
  • Когда вы запускаете свое поведение, программа собирает все свои файлы функций и все определения своих шагов, а затем пытается сопоставить два
  • В приведенном выше примере Behave находит текст enter the {driver_id} и связывает его с функцией step_impl
  • Затем Behave находит текст enter the configured block number и пытается связать его с определением своей функции, но обнаруживает, что функция step_impl уже была определена и связана с текстом функции. Не зная, что делать, Behave выдает исключение AmbiguousStep, чтобы вы знали, что имя функции использовалось дважды.

Чтобы исправить эту проблему, вам нужно убедиться, что имена ваших функций уникальны во всех файлах определения шагов. Итак, в вашем случае у вас есть два файла, каждый из которых определяет функцию с именем step_impl. Что вам следует сделать, так это переименовать эти функции с уникальными именами, чтобы Behave мог правильно соотносить эти имена во время выполнения. Чтобы имена были уникальными, я рекомендую выбирать имена, максимально соответствующие оформленному тексту. Если бы я писал эти определения, я бы переписал их следующим образом:

driverlogon.py

@when(u'enter the {driver_id}')
def step_enter_the_driver_id(context,driver_id):
     SelectDriver.input_driver(driver_id)

triplogon.py

@when(u'enter the configured block number') 
def step_enter_the_configured_block_number(context):
   ByBlock.block_data(context.block)

Edit # 1:

Спасибо за включение трассировки стека. Из этого следует, что вы определили один и тот же шаг дважды в двух разных файлах:

File "steps\triplogon.py", line 23, in <module>
    @when(u'enter the configured block number')
  File "c:\program files (x86)\python\lib\site-packages\behave\step_registry.py", line 92, in wrapper
    self.add_step_definition(step_type, step_text, func)
  File "c:\program files (x86)\python\lib\site-packages\behave\step_registry.py", line 58, in add_step_definition
    raise AmbiguousStep(message % (new_step, existing_step))
behave.step_registry.AmbiguousStep: @when('enter the configured block number') has already been defined in
  existing step @when('enter the {driver_id}') at steps/driverlogon.py:26

Вы заметите, что в верхней строке написано:

File "steps\triplogon.py", line 23, in <module>
    @when(u'enter the configured block number')

Это означает, что шаг enter the configured block number определен в triplogon.py

Затем последняя строка трассировки говорит:

behave.step_registry.AmbiguousStep: @when('enter the configured block number') has already been defined in
  existing step @when('enter the {driver_id}') at steps/driverlogon.py:26

Это означает, что enter the configured block number также был определен в driverlogon.py

Убедитесь, что шаг был определен только в одном из двух файлов.

...