在机器人框架中安全地从字典中获取密钥

Get a key from a dictionary safely in robot framework

我有一个只有一个功能的库,可以安全地从字典中获取键。这可能在测试套件中吗?

def safe_get(dict_obj, key):
    val = dict_obj.get(key)
    if val is None:
        val = {}
    return val

有没有办法使用 Run_Keyword_IfSet_Variable_If 之类的东西来做到这一点?

*** Variables ***
&{Charles Dictionary}

*** Test Cases ***

Safely Get a Key from Dictionary

    Set To Dictionary       ${Charles Dictionary}
    ... MyInterest              Hiking
    ... YourInterest            Swimming
    Work with Interests         ${Charles Dictionary}

*** Keywords ***

Work with Interests     [Arguments]         ${Charles Dictionary}
    ${val}=     Get This Value From Dictionary      ${Charles Dictionary}       MyInterest
    Run Keyword If      '${val}'!='None'        Log     That key is present in the dictionary!          console=yes
    Run Keyword If      '${val}'=='None'        Log     That key wasn't present in the dictionary!      console=yes


Get This Value From Dictionary      [Arguments]     ${Dictionary Name}      ${Key}
    ${KeyIsPresent}=    Run Keyword And Return Status       Dictionary Should Contain Key       ${Dictionary Name}      ${Key}
    ${Value}=           Run Keyword If      ${KeyIsPresent}     Get From Dictionary             ${Dictionary Name}      ${Key}
    Return From Keyword         ${Value}

这里,Charles Dictionary 是我在 Variables 部分声明的字典名称。我给它设置了 2 key-value 对,调用关键字 Work with Interests,并将这个字典作为参数传递给它。

Work with Interests 关键字从字典中获取值,允许 None 和 not-None 值。

如果字典中有键,变量 val 将获得该键的关联值。如果字典 没有 那个键,变量 val 将得到一个值 None.

我还说明了如何处理 None 而不是 None 值以调用不同的关键字。我使用 Log 关键字来说明,但实际上,您可以调用任何您喜欢的关键字,built-in 关键字或您自己的自定义关键字。

希望对您有所帮助。如果没有,请告诉我。

TL;DR:

假设您使用的是机器人 2.9 或更高版本,您可以使用 Evaluate 关键字在字典上调用 get 方法,这将允许您在键时指定默认值不存在。

例如:

| | ${data}=  | create dictionary | ...
| | ${value}= | evaluate          | $data.get("some key", "default value")

说明

从 robotframework 2.9 开始,您可以通过删除大括号直接访问表达式中的变量(请参阅 Evaluating Expressions in the BuiltIn 库文档)。例如,如果您有一个名为 ${data} 的字典,您可以在表达式中使用 $data.

的实际变量

这使得在 python 表达式中使用变量变得非常容易。例如,如果您想在字典没有键时提供默认值,您可以通过使用 Evaluate 关键字和类似 $data.get(...) 的关键字来调用字典的 get 方法.

另请注意,机器人将变量 ${None} 定义为 python 值 None 而不是 字符串 "None" ),您可以在表达式中使用它来检查值是否为 None

下面的例子展示了如何使用evaluate调用字典的get方法。第一个测试显示您可以检查 None 值,第二个示例显示如何提供默认值。

*** Settings ***
| Library | Collections

*** Test Cases ***
| Get value from dictionary, returning None if key not in dictionary
| | ${data}= | Create dictionary | key1=one | key2=two
| | ${value}= | Evaluate | $data.get("key3")
| | should be equal | ${value} | ${None}

| Get value from dictionary, returning default value if key not in dictionary
| | ${data}= | Create dictionary | key1=one | key2=two
| | ${value}= | Evaluate | $data.get("key3", "default value")
| | should be equal as strings | ${value} | default value

当然,如果您希望默认值是一个新字典(如您的问题所暗示的那样),您也可以这样做:

| | ${value}= | Evaluate | $data.get("key3", {})