Robotframework “与”的区别是什么;应该为True${list}=[';a';,';b';,';c';];及;应为真$list==[';a';,';b';,';c';];?
考虑内置库tests.robot中的以下代码:Robotframework “与”的区别是什么;应该为True${list}=[';a';,';b';,';c';];及;应为真$list==[';a';,';b';,';c';];?,robotframework,Robotframework,考虑内置库tests.robot中的以下代码: *** Test Cases *** Use "Create List" # The returned list can be assigned both to ${scalar} and @{list} variables @{list} = Create List a b c Should Be True ${list} == ['a', 'b', 'c'] # (1) Should
*** Test Cases ***
Use "Create List"
# The returned list can be assigned both to ${scalar} and @{list} variables
@{list} = Create List a b c
Should Be True ${list} == ['a', 'b', 'c'] # (1)
Should Be True $list == ['a', 'b', 'c'] # (2)
对我来说,(1)和(2)必须在执行上有所不同,即使它们都通过了
在(1)中,${list}
替换为@list
的字符串表示形式(即['a',b',c']
),结果表达式为字符串:
['a','b','c']==['a','b','c']
(1) 类似于在python控制台上运行eval(“['a','b','c']=['a','b','c'])。这是正确的吗
(2)不像在python控制台上运行eval(['a','b','c']==['a','b','c']);首先,求值命名空间中的$list
引用Robot中的@{list}
对象
$list==['a','b','c']
右侧的列表(即上面的“”['a”、“b”、“c'])是如何处理的?是否将其解析为字符串,并根据解析结果将一个新的列表对象放置在==运算符的右侧?简短的回答是,robot将在计算表达式之前将
${list}
转换为字符串,但将使用$list
使python可以直接访问该变量
这在内置库文档的一节中进行了说明:
当使用普通${variable}语法在表达式[sic]中使用变量时,其值将在计算表达式之前替换[sic]。这意味着表达式中使用的值将是变量值的字符串表示形式,而不是变量值本身。对于数字和其他具有可以直接计算的字符串表示形式的对象,这不是问题,但是对于其他对象,行为取决于字符串表示形式。最重要的是,字符串必须始终使用引号,如果它们可以包含换行符,则必须使用三重引号
从Robot Framework 2.9开始,变量本身在求值命名空间中自动可用。可以使用特殊的变量语法访问它们,而不需要像$variable这样的花括号。这些变量永远不应该被引用,事实上,它们甚至不会在字符串中被替换
你写道:“对我来说,(1)和(2)必须在执行上有所不同,即使它们都通过了。”
由于列表的字符串表示形式看起来像python中的列表,所以它们都可以通过。上面引用的第一段提到了这一点:
。。。对于数字和其他具有可直接计算的字符串表示形式的对象,这不是问题,但是对于其他对象,行为取决于字符串表示形式
要查看它们不具有相同行为的示例,请使用包含字符串的变量
例如:
*** Variables ***
${test} hello, world
*** Test Cases ***
Passing Example
should be true $test=='hello, world'
Failing Example
# this will fail with the following error:
# Evaluating expression 'hello, world=='hello, world'' failed: NameError: name 'hello' is not defined
should be true ${test}=='hello, world' # fails
稍后,您编辑了问题以提出以下问题:
右侧的列表(即上面的[a]、[b]、[c])是如何处理的?是否将其解析为字符串,并根据解析结果将新的列表对象放置到==运算符的右侧
简言之,是的
当机器人被赋予$list==['a','b','c']
时,它最初是一个字符串,字面上看起来像$list==['a','b','c']
。由于右侧没有变量,这就是传递给eval
的变量,eval看到一个看起来像列表的字符串,因此它在进行比较之前创建一个新列表
对于左侧的值,实际上robot只需删除
$
,同时使变量列表可用,因此这与调用eval
类似:eval(“list=['a','b','c'])
#2仍然不清楚,我通过编辑#1和#2上的问题,使我在#2上的问题更清楚了一点。@HKN:我已经更新了我的答案,添加了一个额外的解释。