web-dev-qa-db-ja.com

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'
20
siesta

Robot Framework 2.9は the docs ごとに複数行リテラル文字列のサポートを追加しました。

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

上記と同じ出力になります。

7
Chris Hunt

残念ながら、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}'
25
Bryan Oakley

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...
0
Bohdan Sukhov