Robotframework “与”的区别是什么;应该为True${list}=[';a';,';b';,';c';];及;应为真$list==[';a';,';b';,';c';];?

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

考虑内置库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 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:我已经更新了我的答案,添加了一个额外的解释。