robotframework

robotframework - Robot FW:集合库:“复制字典”:如何对复合字典进行浅表复制

发布于 2020-04-06 00:36:03

考虑以下代码:

在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},产生了相同的观察结果。

查看更多

提问者
HKN
被浏览
69
Todor Minakov 2020-02-01 01:00

问题不在于RF关键字(很少出现,它们具有广泛的UT),而在于您调用它的方式,即以下参数:

deepcopy=False

您可能会认为您正在传递布尔值,但实际上您正在传递string "False"
在关键字的实现内有以下分支:

    if deepcopy:
        return copy.deepcopy(dictionary)

,并且由于非空字符串的计算结果为True,因此您实际上正在获取深层副本。

这是通过真实的方式False

deepcopy=${False}