0

2 つの異なるサーバーからの JSON 応答を比較しています。それらは基本的に一致するはずですが、キャッシングのために、温度、風速などのフィールドにいくつかの小さな違いがあります.

現在、次のように常に失敗する特定のフィールドを無視するためのカスタマイズを使用しています。

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 サンプル:

JSON1

"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"
        }
      }

JSON2

"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"
    }
  }

groovy/java をサポートする Katalon というテスト ツールを使用しています。どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

1

私はカタロンを知りませんが、あなたが示したコードに基づいてこれを修正する方法を推測することができます. このコード:

new Customization("**.TimeStamp", {a, b -> true})

と として渡された任意の 2 つの TimeStamp ノードを比較し、常に を返すクロージャを提供してabますtrue。これは、比較で TimeStamp (および EpochTime) を効果的に無視します。

目的を達成するには、目的のチェックを実行するクロージャのバージョンを指定するだけです。

時間が 10 秒以内の場合に true を返すには、次のようにします。

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)

(これはテスト済みのコードではなく、記述どおりには機能しません。ソリューションがどのように見えるかを示すためのものです)。

于 2019-12-02T14:28:01.787 に答える