机器人框架中是不是可以有一个变量跨越多行?

Posted

技术标签:

【中文标题】机器人框架中是不是可以有一个变量跨越多行?【英文标题】:Is it possible to have a variable span multiple lines in Robot Framework?机器人框架中是否可以有一个变量跨越多行? 【发布时间】:2013-05-09 05:48:36 【问题描述】:

我有一个很长的正则表达式,我想将它放入一个变量中进行测试。我希望能够把它放在多行上,这样它就不会那么难读了。我看到你可以用文档标签做多行。但是当我尝试这种格式时,Robot 似乎认为这是一个列表。有没有办法在 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】:

在变量表中

如果您在*** Variables *** 表中创建字符串,您可以将定义分布在多行中。您可以使用特殊参数SEPARATOR 来定义单元格如何连接在一起。默认情况下,这些行由空格连接,因此您需要通过明确不给 SEPARATOR 一个值来将其设置为空字符串。

有关详细信息,请参阅用户指南中的Variable table。

*** 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

在测试用例或关键字中

如果您尝试在测试用例或关键字中执行此操作,则不能直接定义多行字符串。但是,您可以在测试用例中使用 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'

【讨论】:

这是一个非常有用的技术。我的变量需要使用 $SPACE 变量来强制在行尾使用空格字符。 对于那些想要换行的人,在文本中输入\n$\n【参考方案2】:

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= 没有指定分隔符

您也可以考虑使用variable files,因为那时您可以获得 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

这会产生与上面相同的输出。

【讨论】:

【参考方案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...

【讨论】:

以上是关于机器人框架中是不是可以有一个变量跨越多行?的主要内容,如果未能解决你的问题,请参考以下文章

机器人框架:如何将变量添加到声明的变量中

机器人框架:从 python 库导入变量

对于使用机器人框架的数据驱动测试,是不是可以有多个数据驱动程序(使用多个数据表)?

是否可以在 Python 中编写机器人框架测试(不是关键字)?

如何构建一个表格标题而不是跨越 HTML 中的多行?

带有变量分配的机器人框架中的 IF ELSE