JSONAssert - 在指定范围内进行比较
JSONAssert - Compare within a specified range
我正在比较来自两个不同服务器的 JSON 响应。应该基本一致,但由于缓存的原因,温度、风速等字段存在一些小差异
我目前正在使用自定义来忽略某些总是失败的字段,如下所示:
JSONAssert.assertEquals(response2.getResponseBodyContent(), response1.getResponseBodyContent(),
new CustomComparator(JSONCompareMode.LENIENT,
new Customization("**.TimeStamp", {a, b -> true}),
new Customization("**.EpochTime", {a, b -> true})
));
问题:
- 我将如何指定一个范围(温度可以在
10)?
- 如何指定值只匹配某种类型(字符串,
整数)?
JSON 样本:
JSON 1
"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
"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。任何帮助将不胜感激。谢谢!
我不了解 Katalon,但我可以根据您显示的代码很好地猜测如何解决此问题。此代码:
new Customization("**.TimeStamp", {a, b -> true})
提供了一个闭包来比较任何两个 TimeStamp 节点,传递为 a
和 b
,并且总是 returns true
。这实际上忽略了比较中的 TimeStamp(和 EpochTime)。
要实现你想要的,你只需要提供一个执行你想要的检查的闭包版本。
为了 return 如果时间在十秒内为真,你可以这样做:
new Customization("**.TimeStamp", {a, b -> Math.abs(a - b) < 10 })
例如。您需要检查数据的适当值 - TimeStamp 可能是一个文本字符串,您需要先将其解析为合适的 Date 对象。
闭包可以有多行代码,可以单独定义:
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)
(这不是经过测试的代码,不会像写的那样工作;它只是为了让您的解决方案看起来更像)。
我正在比较来自两个不同服务器的 JSON 响应。应该基本一致,但由于缓存的原因,温度、风速等字段存在一些小差异
我目前正在使用自定义来忽略某些总是失败的字段,如下所示:
JSONAssert.assertEquals(response2.getResponseBodyContent(), response1.getResponseBodyContent(),
new CustomComparator(JSONCompareMode.LENIENT,
new Customization("**.TimeStamp", {a, b -> true}),
new Customization("**.EpochTime", {a, b -> true})
));
问题:
- 我将如何指定一个范围(温度可以在 10)?
- 如何指定值只匹配某种类型(字符串, 整数)?
JSON 样本:
JSON 1
"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
"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。任何帮助将不胜感激。谢谢!
我不了解 Katalon,但我可以根据您显示的代码很好地猜测如何解决此问题。此代码:
new Customization("**.TimeStamp", {a, b -> true})
提供了一个闭包来比较任何两个 TimeStamp 节点,传递为 a
和 b
,并且总是 returns true
。这实际上忽略了比较中的 TimeStamp(和 EpochTime)。
要实现你想要的,你只需要提供一个执行你想要的检查的闭包版本。
为了 return 如果时间在十秒内为真,你可以这样做:
new Customization("**.TimeStamp", {a, b -> Math.abs(a - b) < 10 })
例如。您需要检查数据的适当值 - TimeStamp 可能是一个文本字符串,您需要先将其解析为合适的 Date 对象。
闭包可以有多行代码,可以单独定义:
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)
(这不是经过测试的代码,不会像写的那样工作;它只是为了让您的解决方案看起来更像)。