数据的解析规则

被忽略的数据

当Robot Framework解析测试数据时, 以下数据都会被忽略:

  • 所有在第一格中没有匹配 可识别的表格名称 的表格
  • 第一行中除了第一格之外的其它任何数据
  • 第一个表格之前的所有数据, 如果所使用的文档格式允许表格之间存在数据, 这些也会被忽略
  • 所有空行, 这意味着可以使用空行提供表格的可读性
  • 行末的空单元格, 除非已经 被转义.
  • 所有的单个反斜杠(\), 如果其不是用于转义的话
  • 如果井字符(#)是一个单元格的第一个字符, 则所有跟在后面的字符都被忽略, 也就是说可以使用 # 在测试数据中添加注释.
  • HTML/reST格式中其它的标记和格式

如果数据被Robot Framework忽略, 则这些数据不会出现在任何后续的报告中, 并且大部分使用Robot Framework的其它工具也会忽略它们.如果要添加在输出中可见的信息, 请将它们放在文档中, 或测试用例和套件的其它元数据(metadata)中, 或使用内置的关键字 LogComment 记入日志.

如何处理空格

Robot Framework处理空格的方式和HTML源代码处理空格的方式一样:

  • 换行, 回车, 以及制表符, 都转换为空格.
  • 单元格领头的空格和末尾的空格都会被忽略
  • 多个连续的空格被压缩为一个空格

此外, 非中断空格(non-breaking spaces)被替换为普通空格, 以避免引发难以定位的错误.

如果要用到领头或末尾的空格, 或连续的空格, 它们都 必须被转义.

换行, 回车, 制表符, 和非中断空格则可以分别用 escape sequences \n, \r, \t, and \xA0 来创建.

字符转义

Robot Framework的测试数据使用反斜杠(\)作为转义字符, 此外还增加了 built-in variables_ ${EMPTY}${SPACE} 经常用来作为转义. 不同的转义策略在下面的小节中详细讨论.

转义特殊字符

反斜杠可以用来转义特殊字符, 这样我们就能使用它们的字面值了.

转义特殊字符
CharacterMeaningExamples
\$正常用于 标量变量.\${notvar}
\@正常用于 列表变量.\@{notvar}
\%正常用于 环境变量.\%{notvar}
#正常用于 comment.# not comment
\=正常用于 命名参数.not\=named
|正常用于 竖线加空格的分隔方式.| Run | ps | grep xxx |
\用于转义.c:\temp, \${var}

提示

译注: 上表第2列, 原文是 Dollar sign, never starts a scalar variable.,感觉直译有些奇怪, 所以这里直接给出这些字符的原来作用是什么, 而后面的例子表示经过转义后, 这些字符就失去了原来的作用.

转义序列

反斜杠还可以用来创建特殊的转义序列(escape sequence), 这些转义序列所代表的意义很难(甚至不可能) 在测试数据中通过普通字符表示.

转义序列
SequenceMeaningExamples
\nNewline character.first line\n2nd line
\rCarriage return charactertext\rmore text
\tTab character.text\tmore text
\xhhCharacter with hex value hh.null byte: \x00, ä: \xE4
\uhhhhCharacter with hex value hhhh.snowman: \u2603
\UhhhhhhhhCharacter with hex value hhhhhhhh.love hotel: \U0001f3e9

注解

在测试数据中的所有字符串, 包括 \x02 这种字符, 都是Unicode.如果有需要的话, 必须明确地转换. 转换的方法可以使用 BuiltIn_ 关键字Convert To BytesString_ 库中的 Encode String To Bytes. 或者在Python代码中使用类似于 str(value)value.encode('UTF-8') 的方法.

注解

如果在 \x \u\U 转义符后面跟了非法的十六进制数,则解析的结果是保留原始的字符, 反斜杠除外. 例如, \xAX (X不是十六进制), \U00110000 (值太大了) 解析的结果分别是 xAXU00110000.不过, 这种情况可能会在将来有所改变.

注解

如果需要用与操作系统无关的换行符(Windows中是 \r\n, 其它系统是n),可以使用 Built-in variable_ ${\n}.

注解

跟在 \n 后面的未经转义的空格会被忽略. 也就是说, two lines\nheretwo lines\n here 是等价的. 这样做的动机是在使用HTML格式时, 能包裹包含换行符的长行, 不过同样的逻辑对其它格式也一样. 该规则的一个特殊情况是在 extended variable syntax_ 中的空白符不会忽略.

注解

\x, \u\U 等转义序列在Robot Framework 2.8.2版本新引入.

避免忽略空单元格

如果需要使用空值, 例如作为关键字的参数, 必须明确地转义以避免被框架 忽略. 不管使用哪种数据格式, 空的收尾单元格必须被转义. 当使用 空格分隔的格式 时, 所有的空值都必须被转义.

空的单元格既可以使用反斜杠转义, 也可以使用 内置变量 ${EMPTY}. 特别推荐使用后者, 因为更清楚易懂. 一个特殊情况是在 空格分隔的格式 中使用 FOR循环 时, 缩进的单元格中应使用反斜杠.所有这些情况都在下面的例子中进行了说明, 先是HTML格式, 然后是空格分隔的纯文本格式:

Test CaseActionArgumentArgumentArgument
Using backslashDo Somethingfirst arg\
Using ${EMPTY}Do Somethingfirst arg${EMPTY}
Non-trailing emptyDo Something second arg# No escaping needed in HTML
For loop:FOR${var}IN@{VALUES}
Log${var}# No escaping needed here either
  1. *** Test Cases ***
  2. Using backslash
  3. Do Something first arg \
  4. Using ${EMPTY}
  5. Do Something first arg ${EMPTY}
  6. Non-trailing empty
  7. Do Something ${EMPTY} second arg # Escaping needed in space separated format
  8. For loop
  9. :FOR ${var} IN @{VALUES}
  10. \ Log ${var} # Escaping needed here too

避免忽略空格

因为领头的, 收尾的, 以及连续的空格在单元格中都将被 忽略, 如果这些空格有需要保留的话, 例如作为关键字的参数, 则必须经过转义. 和避免忽略空单元格类似, 既可以使用反斜杠, 也可以使用 内置变量 ${SPACE}.

Escaping spaces examples
Escaping with backslashEscaping with ${SPACE}Notes
\ leading space${SPACE}leading space
trailing space \trailing space${SPACE}反斜杠必须跟在空格后面.
\ \${SPACE}两边都需要反斜杠.
consecutive \ \ spacesconsecutive${SPACE * 3}spaces使用 扩展变量语法

如上例所示, 使用 ${SPACE} 变量是测试数据更容易理解. 当需要不止一个空格时, 结合 扩展变量语法 使用时, 显得尤其方便.

测试数据分为多行

如果数据太多不方便放在一行, 可以另起一行, 下面一行的开头使用省略号()来表示继续.在测试用例和关键字表格中, 省略号的前面必须至少有一个空的单元格(因为第一列只有用例名称).在设置和变量表格中, 可以直接放在设置或变量名的下方.在所有类型的表格中, 省略号前面的空单元格都会被忽略.

此外, 某些设置只接受一个值(主要是文档), 这个值也可以分开写在多列. 当解析完毕, 最终将用空格将多列的值拼接起来. 从Robot Framework 2.7版本开始, 这些值如果分为多行, 将使用 换行符将多行拼接起来.

上面讨论的语法都通过下面的例子来解释说明.前3个表格中的数据没有分割, 接下来的3个表格展示了如何将数据分割为多行以占用更少的列数.

没有进行分割的数据
SettingValueValueValueValueValueValue
Default Tagstag-1tag-2tag-3tag-4tag-5tag-6
VariableValueValueValueValueValueValue
@{LIST}thislisthasquitemanyitems
Test CaseActionArgumentArgArgArgArgArgArg
Example[Documentation]Documentationfor this testcase.\n Thiscan get quitelong…
[Tags]t-1t-2t-3t-4t-5
Do Xonetwothreefourfivesix
${var} =Get X123456
分割为多行的测试数据
SettingValueValueValue
Default Tagstag-1tag-2tag-3
tag-4tag-5tag-6
VariableValueValueValue
@{LIST}thislisthas
quitemanyitems
Test CaseActionArgumentArgumentArgument
Example[Documentation]Documentationfor thistest case.
This can getquitelong…
[Tags]t-1t-2t-3
t-4t-5
Do Xonetwothree
fourfivesix
${var} =Get X12
34
56