首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSONAssert -在指定范围内进行比较

JSONAssert -在指定范围内进行比较
EN

Stack Overflow用户
提问于 2019-12-02 14:03:57
回答 1查看 342关注 0票数 0

我正在比较来自两台不同服务器的JSON响应。它们应该基本匹配,但由于缓存,在温度、风速等领域有一些微小的差异。

目前,我正在使用自定义来忽略某些总是失败的字段,如:

代码语言:javascript
复制
JSONAssert.assertEquals(response2.getResponseBodyContent(), response1.getResponseBodyContent(),
                        new CustomComparator(JSONCompareMode.LENIENT,
                        new Customization("**.TimeStamp", {a, b -> true}),
                        new Customization("**.EpochTime", {a, b -> true})
                        ));

问题:

  1. 如何指定一个范围(温度可以在10以内)?
  2. 如何指定该值只匹配某个类型(字符串、整数)?

JSON样本:

JSON 1

代码语言:javascript
复制
"Temperature":{
      "Metric":{
        "Value":4.6,
        "Unit":"C"
      },
      "Imperial":{
        "Value":40.0,
        "Unit":"F"
      }
    },
    "Wind":{
      "Direction":{
        "Degrees":293,
        "English":"WNW"
      },
      "Speed":{
        "Metric":{
          "Value":19.4,
          "Unit":"km/h"
        },
      "Imperial":{
          "Value":12.1,
          "Unit":"mi/h"
        }
      }

JSON 2

代码语言:javascript
复制
"Temperature":{
  "Metric":{
    "Value":5.1,
    "Unit":"C"
  },
  "Imperial":{
    "Value":43.0,
    "Unit":"F"
  }
},
"Wind":{
  "Direction":{
    "Degrees":271,
    "English":"ENE"
  },
  "Speed":{
    "Metric":{
      "Value":19.9,
      "Unit":"km/h"
    },
  "Imperial":{
      "Value":12.4,
      "Unit":"mi/h"
    }
  }

我正在使用一个名为Katalon的测试工具,它支持groovy/java。任何帮助都将不胜感激。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-02 14:28:01

我不知道Katalon,但我可以根据您展示的代码很好地猜测如何修复这个问题。此代码:

代码语言:javascript
复制
new Customization("**.TimeStamp", {a, b -> true})

提供一个闭包,该闭包比较任何两个TimeStamp节点,作为ab传递,并且始终返回true。这实际上忽略了比较中的TimeStamp (和EpochTime)。

为了实现您想要的结果,您只需要提供一个执行所需检查的闭包版本。

若要在10秒内返回true,请执行以下操作:

代码语言:javascript
复制
new Customization("**.TimeStamp", {a, b -> Math.abs(a - b) < 10 })

例如。您需要检查数据的适当值-- TimeStamp可能是一个文本字符串,您需要首先将其解析为一个合适的Date对象。

闭包可以有多行代码,可以单独定义:

代码语言:javascript
复制
def fuzzyCompareTimeStamps = { a, b ->
    def dateA = new Date(a).parse(<whatever>)
    def dateB = new Date(b).parse(<whatever>)
    def absoluteDifference = Math.abs(dateA - dateB)
    return (absoluteDifference < 10)
}

new Customization("**.TimeStamp", fuzzyCompareTimeStamps)

(这不是经过测试的代码,也不会像编写的那样工作;它只是给出解决方案的外观风格)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59140519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档