【问题标题】:How to preserve Json Object Order in Robot Framework如何在 Robot Framework 中保留 Json 对象顺序
【发布时间】:2017-09-15 02:19:58
【问题描述】:

我正在使用一个 API,该 API 需要在创建资源时对 json 键值对进行排序。 API 提供了一种方法(称为 new),允许您发出将返回对象模型的 GET 请求。我想用我的 RobotFramework 测试用例中的值更新模型。 Robot Framework 中是否有一种本地方式来发出 GET 请求并保留服务器发送的 json 对象顺序?以下是对 GET 新方法的 JSON 响应示例:

{
"account": {
    "@id": "",
    "@uri": "",
    "@oldID": "",
    "person": {
        "@id": "",
        "@uri": ""
    },
    "accountType": {
        "@id": "",
        "@uri": "",
        "name": null
    },
    "accountName": "",
    "createdDate": null,
    "createdByPerson": {
        "@id": "",
        "@uri": ""
    },
    "lastUpdatedDate": null,
    "lastUpdatedByPerson": {
        "@id": "",
        "@uri": ""
    }
}

}

如果我使用以下内容,键值会自动排序:

${r}=   GET Request   MySession   /accounts/new

【问题讨论】:

  • 你,不能依赖字典中键的任何顺序。在这种结构中甚至没有指定顺序 - 即没有任何命令。从这个角度来看,json 只不过是字典和列表的嵌套结构。参见例如这个:stackoverflow.com/questions/4515676/…
  • @JanKovařík 一般来说你是对的,但 RF 是一个特例——那里的字典基于OrderedDict,所以插入顺序被保留。
  • @pgtips - 您正在使用 RequestsLibrary,对吗?我看不到任何内容,这会重新排序响应键...您确定不是服务器将它们按意外顺序排列吗?手动触发相同的请求会生成与 RF 中不同的结构?
  • @Todor 感谢您的解释。
  • 好吧,我没有库,也没有合适的测试系​​统来检查自己,但是,这一切都来自底层请求库 - see here, please。您可能想尝试的答案中有一个解决方案 - 例如${r}.json(object_pairs_hook=OrderedDict),但我自己不知道它是否会正确传播到请求库(通过快速浏览 ExtendedRequestsLibrary,它应该......)

标签: json robotframework


【解决方案1】:

对于其他需要在机器人框架中订购 JSON 的人,我可以通过以下方式实现它(感谢 cmets 的帮助):

&{object}=  Evaluate  json.loads('''${r.text}''', object_pairs_hook=collections.OrderedDict)  modules=json, collections

不过,最终这种逻辑可能最适合自定义帮助程序库。

【讨论】:

    猜你喜欢
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 2016-02-07
    • 2023-03-16
    • 2019-02-02
    • 2016-12-22
    相关资源
    最近更新 更多