考虑以下代码:
在Utils.py中:
@keyword
def get_compound_dictionary():
"""
https://docs.python.org/3/library/copy.html
An example compound dictionary
"""
return {'key1': 'value1', 'deep_dict': {'key2': 'value2'}}
在collection-library-tests.robot中
*** Settings ***
Documentation A test suite utilizing all collection library keywords
Library Collections
Library Utils.py
# To run:
# robot --pythonpath Resources --noncritical failure-expected -d Results/ Tests/collection-
library-tests.robot
*** Test Cases ***
Use "Copy Dictionary" : Shallow Copy
${compound_python_dictionary} = get compound dictionary
&{shallow_copy} = Copy Dictionary ${compound_python_dictionary} deepcopy=False
# if we modify the contained objects (i.e. deep_dict) through the shallow_copy,
# the original compound_python_dictionary will see the changes in the contained objects
Set To Dictionary ${shallow_copy}[deep_dict] key2=modified
Log ${shallow_copy}
Log ${compound_python_dictionary}
Should Be Equal ${compound_python_dictionary}[deep_dict][key2] modified # fails, why?
该目标在测试用例中表示为:
如果我们通过shallow_copy修改包含的对象(即deep_dict),则原始的compound_python_dictionary将看到包含的对象中的更改
预期结果
Should Be Equal ${compound_python_dictionary}[deep_dict][key2] modified # passes
请注意,我使用的是Robot FW版本:Robot Framework 3.1.2(Linux上的Python 3.7.4)
deepcopy参数控制返回的字典是浅副本还是深副本。默认情况下会返回一个浅表副本,但是可以通过为Deepcopy提供真实值来更改它(请参阅Boolean arguments)。该>是Robot Framework 3.1.2中的新选项。早期版本总是返回浅拷贝。
根据有关布尔参数的文档:
一些关键字接受作为布尔值true或false处理的参数。如果将这样的参数指定为字符串,则不区分大小写,如果为空字符串或等于FALSE,NONE,NO,OFF或0,则将其视为false。不管其他字符串的值如何,都将其视为true。
还请注意,我也尝试过deepcopy=${False}
,产生了相同的观察结果。
问题不在于RF关键字(很少出现,它们具有广泛的UT),而在于您调用它的方式,即以下参数:
deepcopy=False
您可能会认为您正在传递布尔值,但实际上您正在传递string "False"
。
在关键字的实现内有以下分支:
if deepcopy:
return copy.deepcopy(dictionary)
,并且由于非空字符串的计算结果为True
,因此您实际上正在获取深层副本。
这是通过真实的方式False
:
deepcopy=${False}
我已根据您的评论说明更新了票证。长话短说,deepcopy = $ {False}也不起作用。可以在您的机器上运行此代码吗?谢谢托多。
“某些关键字接受作为布尔值处理的参数……”-此关键字不支持,请检查其实现。 github.com/robotframework/robotframework/blob/master/src/robot/… 我无法尽快运行您的代码,但是如果它的行为与正确的布尔值false在一起,将会感到非常惊讶。
我承认您提供的代码链接的确与关键字文档中所说的不同。因此,一个问题是代码与其文档之间的冲突。另一个问题是,鉴于您提供的代码,deepcopy = $ {False}无法正常工作(我删除了所有测试日志并重新运行了两次测试用例)。是什么原因??
不在主题之列,但是我看不到关键字的文档与它的实现有何不同;它准确地描述了关键字的作用。
关键字的文档说deepcopy = False或deepcopy = $ {False}将被视为虚假值,因此将进行浅表复制。请注意,我已使用关键字文档更新了该票证。