JSONAssert - сравнить в указанном диапазоне
Я сравниваю ответы 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. Любая помощь будет принята с благодарностью. Спасибо!
1 ответ
Я не знаю Katalon, но я могу хорошо догадаться, как это исправить, на основе кода, который вы показали. Этот код:
new Customization("**.TimeStamp", {a, b -> true})
обеспечивает закрытие, которое сравнивает любые два узла TimeStamp, переданные как a
а также b
, и всегда возвращается true
. Это фактически игнорирует TimeStamp (и EpochTime) при сравнении.
Чтобы добиться того, чего вы хотите, вам просто нужно предоставить версию этого закрытия, которая выполняет нужную проверку.
Чтобы вернуть истину, если время находится в пределах десяти секунд, вы можете сделать:
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)
(Это не проверенный код и не будет работать так, как написано; он просто дает представление о том, как будет выглядеть ваше решение).