如何从“导入变量”中创建变量'全球可用?

时间:2017-11-25 21:45:14

标签: python robotframework

我目前正在使用 Robot Framework 来自动化某些测试。

问题:我正试图找出一种方法来从'导入变量'中导入变量。关键字全球可用( - 遗憾的是, - variablefile对我来说不是一个选项。)

我已经尝试了一些解决方法,没有运气:

 1. Import Variables
 2. Get Variables available in current scope
 3. Loop through each variable and get its key and value
 4. Set each variable globally (using Set Global Variable)

我在上述方法中遇到的问题是我的外部文件(标量,列表,词典)上有不同类型的数据,因此设置全局变量'在尝试设置字典时,某些时候失败了。它抱怨"词典项目' no'不包含' ='分离器"

我研究了一下,发现机器人不能像这样分配一个dict类型变量"设置全局变量$ {DICT_VAR} {" key1":" data1&# 34;," key2":" data2"}"。可以在robot-framework github tests找到实用的解释。

好吧,我正在考虑建立一个小型库来完成这个并使用它: "导入变量/path/to/variables.py scope = global",其中属性范围可以是以下之一:test,suite,global。

嗯,那是我的斗争,伙计们。希望有人可以帮助我。 (:

编辑:那么,关于无法使用--variablefile选项:目前,我在测试执行开始时要求用户输入一些输入,并且其中一个输入是现有外部文件中的一个选择。我知道我可以对用户说'#34;请提供--variablefile选项和外部文件绝对路径。",但我不希望这样,因为它对用户来说不太实用。

[已解决]结论: 我意识到我试图做的事情不是用机器人来完成的。 Robot是一个用于创建和维护测试,生成报告等的工具。应该在.robot文件中避免使用变量(和全局变量)管理许多文件。然后我想出了一个外部文件(一个python脚本),它只是做所有这些选择文件和设置全局变量的脏工作。在这个脚本的最后我只调用subprocess.run(" robot",args)其中args是机器人开始测试执行所需的所有参数(-V,-v,-i等) 。最后,我能够在外部脚本中实际使用--variablefile(-V)选项。

1 个答案:

答案 0 :(得分:1)

请记住,全局变量本质上应该是不变的。尽管可以从关键字或测试用例更新全局变量,但这应该是一个例外操作。要定期更新变量,应使用套件,测试用例和关键字范围。

在下面的示例中,我使用了一个包含嵌套值的YAML变量文件。 YAML导入允许以人类可读的格式定义Python列表,标量和字典,这使得它们对这些类型的嵌套导入非常有用。

<强> data.yaml

DATA:
  Set 1:
    Lisa:
      - list item 1
      - list item 2
    Dica:
      dict item 1: value 1
      dict item 2: value 2
    vara: variable value 1
  Set 2:
    Lisa:
      - list item 3
      - list item 4
    Dica:
      dict item 1: value 3
      dict item 2: value 4
    vara: variable value 2

上面的脚本是通过下面的Variables data.yaml语句加载的。然后,脚本的其余部分将获取该结构的特定子集,并通过循环遍历项目来创建全局变量。

<强> create_globals.robot

*** Setting ***
Library    Collections    

Variables    data.yaml

*** Test Cases ***
Test Case
    Create Globals    Set 2
    No Operation


*** Keywords ***
Get Data Set
    [Arguments]    ${name}
    [Return]    ${DATA['${name}']}

Create Globals
    [Arguments]    ${name}
    ${dataset}    Get Data Set    ${name}
    @{global_var_names}    Get Dictionary Keys    ${dataset}
    :FOR    ${global_var_name}    IN    @{global_var_names}
    \    Set Global Variable    ${${global_var_name}}    ${dataset['${global_var_name}']}

因为通过关键字抽取数据集本身是抽象的,所以将数据源更改为例如命令行导入甚至是数据库都是相对较小的变化。