python - 如何从命令行将 dict 传递给 Robot Framework 变量
问题描述
我正在尝试从我的 RF 文件中运行我的 python 测试中的 main(),并使用可选的关键字参数范围、域和超时。如果我在 RF 文件中对 args 进行硬编码,测试工作正常,但我希望能够从命令行设置它们。我希望能够运行 RF 文件,提供上面列出的 3 个参数中的任何一个、全部或不提供类似于robot -v dict_args:range=5_domain=4 -E space=_ 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 文件。这是我现在拥有的
运行测试机器人:
*** 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)
解决方案
扩展您链接的示例代码可以这样完成:
*** 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 变量的方式非常难看。如果变量文件是不可能的,我可能会使用json
andeval
代替:
*** 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
推荐阅读
- wpf - WPF:禁用组合框中的选定项目
- javascript - 使用 vee-validate 离开页面前提示
- swift - Swift 顺序执行函数
- javascript - 节点进程不以猫鼬索引退出
- php - 无法使用 apache 从根 Centos 7 引用的 php 中的 scandir()
- javascript - Node.js 异步/等待模块导出
- oracle - 将 nls 日期格式传递给 SQL Loader 控制文件
- google-chrome - chrome 的 200 和 200 OK 有什么区别?
- meteor - 流星银河“部署失败”
- java - Twitter4j:Oauth 不起作用