如何从命令行将dict传递给Robot Framework变量?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (225)

我试图从我的RF文件中运行带有可选关键字参数范围,域和超时的python测试中的main()。如果我对RF文件中的args进行硬编码,测试工作正常,但我希望能够从命令行设置它们。我希望能够运行RF文件,给出上面列出的3个args中的任何,全部或全部,类似于robot -v dict_args:range=5_domain=4 -E space=_ run_test.robot。根据文档,“只能使用这种语法设置标量变量,它们只能获取字符串值”,但我看到这里的人能够编写列表的变通方法。无法在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)
提问于
用户回答回答于

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

*** 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

扫码关注云+社区

领取腾讯云代金券