如何从命令行

时间:2018-06-04 19:48:53

标签: python python-3.x dictionary command-line robotframework

我正在尝试从我的RF文件中运行带有可选关键字参数范围,域和超时的python测试中的main()。如果我在RF文件中对args进行硬编码,测试工作正常,但我希望能够从命令行设置它们。我希望能够运行RF文件,给出上面列出的3个args中的任何,全部或全部,与robot -v dict_args:range=5_domain=4 -E space=_ run_test.robot类似。根据文档,“只能使用这种语法设置标量变量,它们只能获取字符串值”,但我看到这里有人能够编写列表的变通方法(How to pass a list as command line argument in robot framework.?)。无法在dicts上找到任何内容,任何建议/帮助将不胜感激。

run_test.robot:

*** Settings ***

Library    my_test
Library    Process

*** Test Cases ***
Run RNTester
    Run Program    ${dict-args}


*** Keywords ***
Run Program
    [Arguments]    &{configuration}
    main    &{configuration}

my_test.py:

def main(**kwargs):
    #process args
    if 'range' in kwargs:
        range_ = kwargs['range'].split(':')
        range_ = list(map(int,range_))
        if len(range_) == 1:
            range_.insert(0,0)
        test_count = range_[1] - range_[0]
    else:
        range_ = None
        test_count = 0

    if 'domain' in kwargs:
        domain = kwargs['domain'].split(',')
    else:
        domain = None

    if 'timeout' in kwargs:
        timeout = int(kwargs['timeout'])
    else:
        timeout = 30

    run_test(domain, range_, test_count, timeout)

固定 编辑我的代码写为@jil建议的yaml文件。添加了YAMLCreator.py以生成我的RF文件导入的yaml文件。这就是我现在所拥有的

run_test.robot:

*** Settings ***

Library    my_test
Variables    ${testname}.yaml

*** Test Cases ***

Run RNTester
    Run Program    &{test_name}


*** Keywords ***
Run Program
    [Arguments]    &{configuration}
    main    &{configuration}

YAMLCreator.py:

import yaml
import sys

def make_dict(**kwargs):

    data = dict()
    for key in kwargs:
        value = kwargs[key]
        data[key] = value
    return data

if __name__ == '__main__':

    args = sys.argv
    test_name = args[1]
    data = make_dict(**dict(arg.split('=') for arg in args[2:]))

    test_name_dict=dict()
    test_name_dict[test_name] = data

    with open(test_name + '.yaml', 'w') as outfile:
        yaml.dump(test_name_dict, outfile, default_flow_style=False)

2 个答案:

答案 0 :(得分:2)

扩展您链接的示例代码可以这样做:

*** Settings ***
Library    String

*** Keywords ***
Convert String To Dictionary
    [Arguments]    ${my_dict_string}
    @{list_of_items}    Split String    ${my_dict_string}
    ${my_dict} =  Create Dictionary  @{list_of_items}
    [Return]  ${my_dict}

但我个人觉得这种传递dict变量的方式非常难看。如果变量文件不可用,我可能会使用jsoneval代替:

*** Keywords ***
Convert JSON to Dictionary
    [Arguments]  ${json_string}
    ${d}=  evaluate  json.loads('''${json_string}''')  json
    [Return]  ${d}

然后像这样调用它:

robot -v 'dict_args:{"range":5, "domain":4}' run_test.robot

答案 1 :(得分:0)

无法从命令行传递字典。导入Python结构的最佳方法是使用YAML。这将允许您将这些作为变量直接加载到Robot中。

加载YAML文件可以通过三种方式完成:

  1. 使用--variablefile FileName.yaml
  2. command-line
  3. Settings sectionVariable FileName.yaml
  4. 使用KeywordImport Variables FileName.yaml
  5. 这三种方法各有利弊。如果你有一个固定的数据集需要导入,那么方法2就可以了。如果您知道在Robot Framework启动时应该使用哪个数据集,那么我选择编号1.如果该决定只能在测试的运行时进行,则选择选项3.