【问题标题】:Add Multiple json objects to a json on Robotframework将多个 json 对象添加到 Robotframework 上的 json
【发布时间】:2020-03-11 20:34:04
【问题描述】:

edit a JSON file in Robot Framework

假设上面有同样的问题,但如果我需要添加多个对象,它应该作为变量传递。我们该怎么做?


json objects(key value pair)

{
"drive": 1,
"case_ids": [1419]
}


*** Settings ***
Documentation    Library with keywords
Library          Collections
Library          DateTime
Library          OperatingSystem
Library          JSONLibrary


Robot file
    *** Keywords ***
    ################################## New Functions Introduced       #########################################
    Add KeyValue To Json
    [Arguments]  ${config_file}  ${key}  ${value}  ${address}=$

    ${json_obj}=    Load JSON From File  ${config_file}
    ${object_to_add}=    Create Dictionary  ${key}=${value}
    ${json_obj}=    Add Object To Json  ${json_obj}  ${address}  ${object_to_add}

    [return]  ${json_obj}

我相信上次我检查它时我们无法为单个变量设置键和值。

任何想法都将不胜感激。

【问题讨论】:

    标签: json robotframework


    【解决方案1】:

    正如其中一个 cmets 中提到的(正确地如此),不要花时间像用“语言”那样去弄清楚一些事情,尽管这样做是非常好的(但是,这就像设计一个轮子然后测试相同 - 不要重新发明它),请考虑安装以下模块 pip install robotframework-jsonlibrary 并解决您面临的问题并继续下一个。

    示例如下所示 示例测试用例

    *** Settings ***                
    Library JSONLibrary         
    *** Test Cases ***              
    ${json_obj}=    Load JSON From File example.json        
    ${object_to_add}=   Create Dictionary   country=Thailand        
    **${json_obj}=  Add Object To Json  ${json_obj} $..address  ${object_to_add}**
    ${value}=   Get Value From Json ${json_obj} $..country  
    Should Be Equal As Strings  ${value[0]} Thailand        
    ${value_to_update}= Set Variable    Japan       
    ${json_obj}=    Update Value To Json    ${json_obj} $..country  ${value_to_update}
    Should Be Equal As Strings  ${json_obj['country']   ${value_to_update}      
    Documentation
    

    【讨论】:

    • 我一直在使用该模块,但让我展示一下我做了什么。当我传递多个 json 对象时,我对如何处理它感到困惑。我可以看到您已经通过静态对象 country=Thailand 处理了它。但我的问题是,如果它的 1 个以上的 json 对象作为变量传递,就像问题中我们如何循环字典或列表并实现这一点一样?
    • 我的问题是将 2 个对象添加到 json 中,但这是一个示例。我们如何迭代并添加json上同一地址中的所有对象
    • 重新阅读您的问题,我明白您的意思。不要过于复杂,因为它不是一种语言
    • 您只是将值添加到单个键,当您想将多个对象添加到单个 json 时,它会变得复杂。
    【解决方案2】:

    你可以为这个问题创建一个 Python 扩展。

    文件名必须与类名相同,否则Robot框架将找不到该函数。

    文件名:JsonExtender.py

    内容:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    
    class JsonExtender(object):
        def extend_json_obj(self, json_obj, key, value):
            json_obj[key]=value
            return json_obj
    

    测试套件文件:mytest.robot

    内容:

    *** Settings ***
    Library    ../path_to_file/JsonExtender.py
    
    *** Test Cases ***
    my test
         ${json_obj}=           Load JSON From File  ${config_file}
         ${extended_json_obj}=  Extend Json Obj      ${json_obj}        key_name    value
    

    记住,这个脚本只是一个例子,需要一点点适配,因为这个版本会接受普通的dict,而不是json。

    【讨论】:

    • 有没有其他即兴的方式来使用现有的库模块来实现这一点?上述解决方案是否针对该问题进行了测试?
    • 未测试,您可以在底部看到注释。那将是你的功课。
    • 只是一个旁注。机器人框架是测试框架,而不是程序语言。核心原则之一“让它变得简单”。如果你需要一些复杂的东西,那就创建一个外部模块。这就是为什么这是一个很好的例子。它还给出了一个简单的例子,如何创建外部模块。
    • 你能解释一下外部模块JsonExtender.py吗
    【解决方案3】:

    我把它保持得这么简单。我只需再次调用关键字即可将它们添加到对象中。重复使用相同的关键字来实现两者。

    Add KeyValue To JsonFile and JsonObject
        [Arguments]  ${key}  ${value}  ${config_file}=None  ${json_arg}=None  ${address}=$
        ${json_obj} =  Run Keyword If  '${config_file}' != 'None'    Load JSON From File  ${config_file}
        ${object_to_add}=    Create Dictionary  ${key}=${value}
        ${json_obj}=    Add Object To Json  ${json_obj}  ${address}  ${object_to_add}
        Return From Keyword If    ${json_obj} is not ${None}    ${json_obj}
    
        ${json_obj}=  Run Keyword    Create Dictionary
        ${json_obj}=    Add Object To Json  ${json_arg}  ${address}  ${object_to_add}
        Log    ${json_obj}
        [return]  ${json_obj}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-18
      • 1970-01-01
      相关资源
      最近更新 更多