Возможно ли иметь переменный интервал в несколько строк в Robot Framework?

У меня есть очень длинное регулярное выражение, которое я хотел бы поместить в переменную для тестирования. Я хотел бы иметь возможность поместить его в несколько строк, чтобы он не был настолько нечитаемым. Я видел, что вы можете сделать несколько строк с тегом документации. Но когда я пробую это форматирование, Робот, кажется, думает, что это список. Есть ли способ сделать это в Robot Framework?

Рассмотрим:

${example_regex} =      '(?m)Setting IP address to [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\nSetting MAC address to [0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}\nSetting IP forwarding kernel options'

Я бы хотел написать:

${example_regex}   '(?m)Setting IP address to [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\n
                     Setting MAC address to [0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}\n
                     Setting IP forwarding kernel options'

Ответы

Ответ 1

В Robot Framework 2.9 добавлена поддержка многострочных буквенных строк для документов.

test.robot

*** Variables ***
${example_regex} =  SEPARATOR=
...  (?m)Setting IP address to [0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\n
...  Setting MAC address to [0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}\\n
...  Setting IP forwarding kernel options

*** Test Cases ***
Show output
    Log  \n${example_regex}  console=yes

robot test.robot

==============================================================================
Test
==============================================================================
Show output
(?m)Setting IP address to [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\nSetting MAC address to [0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}\nSetting IP forwarding kernel options
Show output                                                           | PASS |
------------------------------------------------------------------------------
Test                                                                  | PASS |
1 critical test, 1 passed, 0 failed
1 test total, 1 passed, 0 failed
==============================================================================

Несколько заметок:

  • Все начальные и конечные пробелы обрезаются из каждой строки
  • Простой SEPARATOR= в первой строке не указывает разделитель

Вы также можете рассмотреть возможность использования переменных файлов с тех пор, как вы получите всю мощь форматирования букв Python, что может упростить ведение таких вещей, как сложные регулярные выражения. Если вы используете Robot Framework 3+ и Python 3. 5+ (для f -strings), то это может выглядеть следующим образом:

vars.py

ip_address_pattern = r'[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
lower_mac_address_pattern = '[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}'
example_regex = (
  rf'(?m)Setting IP address to {ip_address_pattern}\n'
  rf'Setting MAC address to {lower_mac_address_pattern}\n'
    'Setting IP forwarding kernel options'
)

test.robot

*** Settings ***
Variables  vars.py

*** Test Cases ***
Show output
    Log  \n${example_regex}  console=yes

Что приводит к тому же выводу, что и выше.

Ответ 2

К сожалению, Robot Framework напрямую не поддерживает многострочные литеральные строки. Однако вы можете получить тот же эффект, используя ключевое слово catenate в тестовом примере или ключевое слово, чтобы объединить данные, которые распределены по нескольким ячейкам. Обязательно правильно избегайте обратной косой черты и установите символ разделителя на пустую строку, если вы не хотите, чтобы в данных были новые строки.

Например:

*** Test Cases ***
Multiline variable example
  ${example_regex}=  catenate  SEPARATOR=
  ...  (?m)Setting IP address to [0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\n
  ...  Setting MAC address to [0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}\\n
  ...  Setting IP forwarding kernel options
  log  regex: '${example_regex}'

Ответ 3

До Robot Framework 2.9 можно было использовать функцию python join :

*** Variables ***

@{example_regex}=
...  (?m)Setting IP address to [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\n
...  Setting MAC address to [0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}\n
...  Setting IP forwarding kernel options'

*** Test Cases ***

MultiLine
  ${example_regex}=  Evaluate  "".join(${example_regex})
  Log  "\n"${example_regex}

Результат:

20190813 14:02:39.421 - INFO - ${example_regex} = (?m)Setting IP address to [0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}
Setting MAC address to [0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}:[0-9a-f]{2}
Setting IP forwarding kernel option...