数据的解析规则
被忽略的数据
当Robot Framework解析测试数据时, 以下数据都会被忽略:
- 所有在第一格中没有匹配 可识别的表格名称 的表格
- 第一行中除了第一格之外的其它任何数据
- 第一个表格之前的所有数据, 如果所使用的文档格式允许表格之间存在数据, 这些也会被忽略
- 所有空行, 这意味着可以使用空行提供表格的可读性
- 行末的空单元格, 除非已经 被转义.
- 所有的单个反斜杠(
\
), 如果其不是用于转义的话 - 如果井字符(
#
)是一个单元格的第一个字符, 则所有跟在后面的字符都被忽略, 也就是说可以使用#
在测试数据中添加注释. - HTML/reST格式中其它的标记和格式
如果数据被Robot Framework忽略, 则这些数据不会出现在任何后续的报告中, 并且大部分使用Robot Framework的其它工具也会忽略它们.如果要添加在输出中可见的信息, 请将它们放在文档中, 或测试用例和套件的其它元数据(metadata)中, 或使用内置的关键字 Log 和 Comment 记入日志.
如何处理空格
Robot Framework处理空格的方式和HTML源代码处理空格的方式一样:
- 换行, 回车, 以及制表符, 都转换为空格.
- 单元格领头的空格和末尾的空格都会被忽略
- 多个连续的空格被压缩为一个空格
此外, 非中断空格(non-breaking spaces)被替换为普通空格, 以避免引发难以定位的错误.
如果要用到领头或末尾的空格, 或连续的空格, 它们都 必须被转义.
换行, 回车, 制表符, 和非中断空格则可以分别用 escape sequences \n
, \r
, \t
, and \xA0
来创建.
字符转义
Robot Framework的测试数据使用反斜杠(\
)作为转义字符, 此外还增加了 built-in variables
_ ${EMPTY}
和 ${SPACE}
经常用来作为转义. 不同的转义策略在下面的小节中详细讨论.
转义特殊字符
反斜杠可以用来转义特殊字符, 这样我们就能使用它们的字面值了.
Character | Meaning | Examples |
---|---|---|
\$ | 正常用于 标量变量. | \${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), 这些转义序列所代表的意义很难(甚至不可能) 在测试数据中通过普通字符表示.
注解
在测试数据中的所有字符串, 包括 \x02
这种字符, 都是Unicode.如果有需要的话, 必须明确地转换. 转换的方法可以使用 BuiltIn_ 关键字Convert To Bytes 或 String_ 库中的 Encode String To Bytes. 或者在Python代码中使用类似于 str(value)
和 value.encode('UTF-8')
的方法.
注解
如果在 \x
\u
或 \U
转义符后面跟了非法的十六进制数,则解析的结果是保留原始的字符, 反斜杠除外. 例如, \xAX
(X不是十六进制), \U00110000
(值太大了) 解析的结果分别是 xAX
和 U00110000
.不过, 这种情况可能会在将来有所改变.
注解
如果需要用与操作系统无关的换行符(Windows中是 \r\n
, 其它系统是n
),可以使用 Built-in variable
_ ${\n}
.
注解
跟在 \n
后面的未经转义的空格会被忽略. 也就是说, two lines\nhere
和two lines\n here
是等价的. 这样做的动机是在使用HTML格式时, 能包裹包含换行符的长行, 不过同样的逻辑对其它格式也一样. 该规则的一个特殊情况是在 extended variable syntax
_ 中的空白符不会忽略.
注解
\x
, \u
和 \U
等转义序列在Robot Framework 2.8.2版本新引入.
避免忽略空单元格
如果需要使用空值, 例如作为关键字的参数, 必须明确地转义以避免被框架 忽略. 不管使用哪种数据格式, 空的收尾单元格必须被转义. 当使用 空格分隔的格式 时, 所有的空值都必须被转义.
空的单元格既可以使用反斜杠转义, 也可以使用 内置变量 ${EMPTY}
. 特别推荐使用后者, 因为更清楚易懂. 一个特殊情况是在 空格分隔的格式 中使用 FOR循环 时, 缩进的单元格中应使用反斜杠.所有这些情况都在下面的例子中进行了说明, 先是HTML格式, 然后是空格分隔的纯文本格式:
Test Case | Action | Argument | Argument | Argument |
---|---|---|---|---|
Using backslash | Do Something | first arg | \ | |
Using ${EMPTY} | Do Something | first arg | ${EMPTY} | |
Non-trailing empty | Do Something | second arg | # No escaping needed in HTML | |
For loop | :FOR | ${var} | IN | @{VALUES} |
Log | ${var} | # No escaping needed here either |
- *** Test Cases ***
- Using backslash
- Do Something first arg \
- Using ${EMPTY}
- Do Something first arg ${EMPTY}
- Non-trailing empty
- Do Something ${EMPTY} second arg # Escaping needed in space separated format
- For loop
- :FOR ${var} IN @{VALUES}
- \ Log ${var} # Escaping needed here too
避免忽略空格
因为领头的, 收尾的, 以及连续的空格在单元格中都将被 忽略, 如果这些空格有需要保留的话, 例如作为关键字的参数, 则必须经过转义. 和避免忽略空单元格类似, 既可以使用反斜杠, 也可以使用 内置变量 ${SPACE}
.
Escaping with backslash | Escaping with ${SPACE} | Notes |
---|---|---|
\ leading space | ${SPACE}leading space | |
trailing space \ | trailing space${SPACE} | 反斜杠必须跟在空格后面. |
\ \ | ${SPACE} | 两边都需要反斜杠. |
consecutive \ \ spaces | consecutive${SPACE * 3}spaces | 使用 扩展变量语法 |
如上例所示, 使用 ${SPACE}
变量是测试数据更容易理解. 当需要不止一个空格时, 结合 扩展变量语法 使用时, 显得尤其方便.
测试数据分为多行
如果数据太多不方便放在一行, 可以另起一行, 下面一行的开头使用省略号(…
)来表示继续.在测试用例和关键字表格中, 省略号的前面必须至少有一个空的单元格(因为第一列只有用例名称).在设置和变量表格中, 可以直接放在设置或变量名的下方.在所有类型的表格中, 省略号前面的空单元格都会被忽略.
此外, 某些设置只接受一个值(主要是文档), 这个值也可以分开写在多列. 当解析完毕, 最终将用空格将多列的值拼接起来. 从Robot Framework 2.7版本开始, 这些值如果分为多行, 将使用 换行符将多行拼接起来.
上面讨论的语法都通过下面的例子来解释说明.前3个表格中的数据没有分割, 接下来的3个表格展示了如何将数据分割为多行以占用更少的列数.
Setting | Value | Value | Value | Value | Value | Value |
---|---|---|---|---|---|---|
Default Tags | tag-1 | tag-2 | tag-3 | tag-4 | tag-5 | tag-6 |
Variable | Value | Value | Value | Value | Value | Value |
---|---|---|---|---|---|---|
@{LIST} | this | list | has | quite | many | items |
Test Case | Action | Argument | Arg | Arg | Arg | Arg | Arg | Arg |
---|---|---|---|---|---|---|---|---|
Example | [Documentation] | Documentationfor this testcase.\n Thiscan get quitelong… | ||||||
[Tags] | t-1 | t-2 | t-3 | t-4 | t-5 | |||
Do X | one | two | three | four | five | six | ||
${var} = | Get X | 1 | 2 | 3 | 4 | 5 | 6 |
Setting | Value | Value | Value |
---|---|---|---|
Default Tags | tag-1 | tag-2 | tag-3 |
… | tag-4 | tag-5 | tag-6 |
Variable | Value | Value | Value |
---|---|---|---|
@{LIST} | this | list | has |
… | quite | many | items |
Test Case | Action | Argument | Argument | Argument |
---|---|---|---|---|
Example | [Documentation] | Documentation | for this | test case. |
… | This can get | quite | long… | |
[Tags] | t-1 | t-2 | t-3 | |
… | t-4 | t-5 | ||
Do X | one | two | three | |
… | four | five | six | |
${var} = | Get X | 1 | 2 | |
… | 3 | 4 | ||
… | 5 | 6 |