如何通过引用机器人框架关键字来传递参数?

How to pass arguments by reference to robot framework keywords?

我在机器人框架中有一个关键字;它接受一个参数,对其执行一些处理,然后 returns 它毕竟:

My Keyword Name
    [Arguments]    ${arg}
    # Some process on ${arg}
    [Return]       ${arg}

所以它的用法是:

${x} =    My Keyword Name    ${x}

这意味着我将 ${x} 的旧值赋给关键字,它返回给我它的新值。

我想在 My Keyword Name 上通过引用进行调用,因此我不需要使用赋值来为 ${x} 设置新值。我已阅读 BuiltIn and UserGuide, 但是没有关于这个主题的台词。谁能帮我解决这个问题?

如果${x}是可变类型,例如列表或字典,您可以传递对象本身。如果它表示一个标量值,例如字符串或 int,则不能为所欲为。您唯一的选择是 return 新值并将其重新分配给原始变量。

如果您将变量初始化为

,它将起作用
My Keyword Name
    [Arguments]    ${arg}
    ${arg} =    Set Variable    56
    [Return]       ${arg}

Test
    Log To Console  \n\nin Test
    ${x} =  Set Variable    0
    ${x} =    My Keyword Name    ${x}
    Log To Console  ${x}

能否探讨一下是否可以使用设置全局变量设置测试变量

好吧,我 运行 遇到了同样的问题,因为我在 For 循环中使用了 运行 关键字 If 语句。知道如果我使用 return 作为值的关键字,机器人框架就会崩溃。

所以我只是认为这是一个潜在的解决方案。它将使用我的示例。它确实有冗余,但那是因为在这种情况下你只需要这样做。

***Keywords***
| Increment | [Arguments] | ${var} |
| | ${var} | Evaluate | ${var} + 1 |
| | Set Test Variable | ${var} | ${var} |

用法:

| Increment | ${idx} |
| Set Test Variable | ${idx} | ${var}

现在我并不是说这是最好的解决方案,但是如果你 运行 进入你必须 return 一个带有关键字的变量的值的场景,你是在 "Run Keyword If" 中,这应该可以让您规避这个问题。我不太喜欢它,但它完成了工作。

我花了一些时间才得到解决方案!

* Variables
${someVar}    initial value

* Test Cases
[Check reference]
    Set this          ${someVar}    new value
    Should Be Equal    ${someVar}    new value

* Keywords
Set this
[Arguments]          ${varName}    ${value}
Set Test Variable    ${varName}    ${value}

关键在于神奇的“\”字符 :)

它实际上归结为 python 中的 mutable/immutable 个变量,以及它们如何传递给函数。

此处有详细信息 in this answer,但在 RF 上下文中它归结为 - 您可以更改列表和字典,而不是字符串和数字(​​int、float)。示例:

A testcase
    Log To Console      \n
    ${var}=     Create List   member1
    Log To Console      ${var}

    Mutate The List     ${var}
    Log To Console      ${var}

*** Keywords ***
Mutate The List
    [Arguments]     ${lst}
    Append To List      ${lst}    new one

运行 时的输出为:

==============================================================================
A testcase                                                            

['member1']
['member1', 'new one']
| PASS |

,例如案例中定义的变量被关键字更改了。字典也可以这样做。

如果您在函数中重新分配变量,它不会改变;例如使用这样的关键字:

Mutate The Dict
    [Arguments]     ${lst}
    ${lst}=     Create List    fsf
    Append To List      ${lst}    bogus

,原变量${var}不会改变
为什么这样?简而言之,在 python 中,变量只是内存地址的标识符("names");当您将 ${lst} 分配给新列表时,该变量现在指向内存中的新地址,并且进一步的交互不会更改原始地址。