web-dev-qa-db-ja.com

RestAssuredとの完全なJsonマッチ

いくつかのAPIをテストするためにREST-Assuredを使用しています。私のAPIは明らかにJSONで応答し、これが応答である場合はドキュメントに従って:

{
    "id": "390",
    "data": {
        "leagueId": 35,
        "homeTeam": "Norway",
        "visitingTeam": "England",
    },
    "odds": [{
        "price": "1.30",
        "name": "1"
    },
    {
        "price": "5.25",
        "name": "X"
    }]
}

私はこのようにテストすることができます:

@Test
public void givenUrl_whenSuccessOnGetsResponseAndJsonHasRequiredKV_thenCorrect() {
   get("/events?id=390")
      .then()
         .statusCode(200)
         .assertThat()
            .body("data.leagueId", equalTo(35)); 
}

確かにこれは読み取り可能ですが、JSONを完全に比較します(つまり、これはJSON応答です。これは、定型のJSONです-リソースファイルは完璧です-これらのJSONは等しいですか?)。 REST-Assuredはそのようなものを提供しますか、それとも手動で作成する必要がありますか。

8
BAD_SEED

RestAssuredのJsonPathを使用してjsonファイルをマップに解析し、それをHamcrestMatchersと比較します。このように、順序などは重要ではありませんでした。

import static org.hamcrest.Matchers.equalTo;
import io.restassured.path.json.JsonPath;

...

JsonPath expectedJson = new JsonPath(new File("/path/to/expected.json"));

given()
    ...
    .then()
    .body("", equalTo(expectedJson.getMap("")));
5
HaC

空手 はまさにあなたが探しているものです-JSONペイロードの完全なequality一致を1つのステップで実行できます。

また、動的な値(生成されたキー、タイムスタンプ)がある場合、Karateは、これらのキーを無視する(または単にフォーマットを検証する)ための非常に洗練された方法を提供します。

空手を作成する主な動機の1つは、REST-assuredのより良い代替案を考え出すことでした。空手を評価し、組織内でそれを主張するのに役立つこのドキュメントを参照できます: 空手vs REST保証

3
Peter Thomas

簡単な方法:

String s = "{\"ip\": \"your_ip\"}";
given().log().all().contentType(ContentType.JSON).get("http://ip.jsontest.com/").then().log().all().assertThat().body(containsString(s))

簡単な方法ではありません。カスタムマッチャーを作成するか、jsonpathを使用できます。これには、jsonをcomapreするオプションがあります。

0
RocketRaccoon

REST AssuredはJSON比較をサポートしていません。質問にあるように、スキーマと本体の一部のみをサポートしています。あなたができることは、HamcrestのJSON比較器SameJSONAsを Hamcrest JSON SameJSONAs で使用することです。

0
BigGinDaHouse