在关键字“运行关键字”内分配变量可能吗?

时间:2018-12-14 13:52:19

标签: testing automated-tests robotframework

以下代码产生了一些问题:

API Setup
[Arguments]                           ${url}                           ${username}    ${password}    ${run}=True    ${fail}=False
Run Keyword If                        ${run}
...  Run Keywords     
     ...  ${passed}=                  Run Keyword And Return Status    Setup          ${url}         ${username}    ${password}
     ...  AND  Log To Console         ${passed}
     ...  AND  Should Not Be Equal    ${fail}                          ${passed}

当我尝试执行该操作时,我的RF会说:Variable '${passed}' not found

RED IDE也显示

Multiple markers at this line:
  • Variable 'passed' is used, but not defined
  • Keyword name '${passed}=' contains variables. RED is unable to validate 
    arguments given to this keyword

关键字“运行关键字”是否不允许将值赋给变量?如果允许,是否有“最佳实践”方法来执行我想做的事情?

谢谢!

2 个答案:

答案 0 :(得分:3)

Run Keywords 不允许允许分配,的确如此。这来自解析器-关键字的目的是运行其他关键字;它以赋值(${passed}= Run...)开头,试图用其值替换变量“ passed”,以便它可以执行它,但在这一点上var仍未定义-并且失败。

看起来您想要做的是仅在条件为true时才运行特定关键字(Setup),并且只有在条件为true时才记录其结果并断言(结果)是想要的。

这可以通过将模块分成两部分来实现。关键字Run Keyword If返回嵌入式关键字的值,因此可以使用:

${passed}=    Run Keyword If    ${run}    Run Keyword And Return Status    Setup          ${url}         ${username}    ${password}
                             ...    ELSE    Set Variable    ${False}

如果将运行${run} == True关键字Setup,并且执行通过后,{passed}将保留True / False值。如果${run} != True我们将${passed}设置为False,那么它就没有值None(在这种情况下,它的值并不重要,但是这样做可以使它具有的数据类型具有一致性)。

另外两个关键字现在可以自己位于if块中-仅在${run} == True时起作用:

Run Keyword If    ${run}   Run Keywords     Log To Console         ${passed}
 ...  AND  Should Not Be Equal    ${fail}    ${passed}

答案 1 :(得分:1)

的确,Run Keywords不允许在其中进行变量分配

制作一个包含Run Keywords中所有内容的关键字,然后直接调用它。

例如

*** Test Cases ***
API Setup
[Arguments]                           ${url}                           ${username}    ${password}    ${run}=True    ${fail}=False
Run Keyword If                        ${run}                           Keyword A

*** Keywords ***
Keyword A
    # put everything you need here