REST保証のJSONスキーマ検証

RESTを使用したJSONスキーマ検証

1. 概要

REST保証ライブラリは、通常JSON形式のREST APIのテストをサポートします。

JSON本体が特定のJSON形式に準拠しているかどうかを最初に知ることは、応答を詳細に分析することなく、時々望ましい場合があります。

このクイックチュートリアルでは、we can validate a JSON response based on a predefined JSON schemaがどのようになっているのかを見ていきます。

2. セットアップ

RESTで保証された初期設定は、our previous articleと同じです。

さらに、pom.xmlファイルにjson-schema-validatorモジュールを含める必要もあります。


    io.rest-assured
    json-schema-validator
    3.0.0

最新バージョンであることを確認するには、this linkに従ってください。

また、同じ名前で作成者と機能が異なる別のライブラリも必要です。 これはREST保証のモジュールではなく、検証を実行するためにjson-schema-validatorによって内部で使用されます。


    com.github.fge
    json-schema-validator
    2.2.6

その最新バージョンはhereで見つけることができます。

ライブラリjson-schema-validatorにも、json-schema-coreの依存関係が必要な場合があります。


    com.github.fge
    json-schema-core
    1.2.5

そして、最新バージョンは常にhereで見つかります。

3. JSONスキーマ検証

例を見てみましょう。

JSONスキーマとして、クラスパスに存在するevent_0.jsonというファイルに保存されたJSONを使用します。

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

次に、これがREST APIによって返されるすべてのデータが続く一般的な形式であると仮定すると、JSON応答が次のように適合しているかどうかを確認できます。

@Test
public void givenUrl_whenJsonResponseConformsToSchema_thenCorrect() {
    get("/events?id=390").then().assertThat()
      .body(matchesJsonSchemaInClasspath("event_0.json"));
}

io.restassured.module.jsv.JsonSchemaValidator.からmatchesJsonSchemaInClasspathを静的にインポートすることに注意してください

4. JSONスキーマ検証 設定

4.1. 応答を検証する

REST-assuredのjson-schema-validatorモジュールは、独自のカスタム構成ルールを定義することにより、きめ細かい検証を実行する能力を提供します。

検証で常にJSONスキーマバージョン4を使用する必要があるとします。

@Test
public void givenUrl_whenValidatesResponseWithInstanceSettings_thenCorrect() {
    JsonSchemaFactory jsonSchemaFactory = JsonSchemaFactory.newBuilder()
      .setValidationConfiguration(
        ValidationConfiguration.newBuilder()
          .setDefaultVersion(SchemaVersion.DRAFTV4).freeze())
            .freeze();
    get("/events?id=390").then().assertThat()
      .body(matchesJsonSchemaInClasspath("event_0.json")
        .using(jsonSchemaFactory));
}

これを行うには、JsonSchemaFactoryを使用し、バージョン4のSchemaVersionを指定して、要求が行われたときにそのスキーマを使用していることを表明します。

4.2. 検証を確認する

デフォルトでは、json-schema-validatorはJSON応答文字列に対してチェック済み検証を実行します。 これは、スキーマが次のJSONのようにoddsを配列として定義している場合を意味します。

{
    "odds": [{
        "price": "1.30",
        "name": "1"
    },
    {
        "price": "5.25",
        "name": "X"
    }]
}

その場合、バリデーターは常にoddsの値として配列を期待するため、oddsStringである応答は検証に失敗します。 そのため、応答の厳密性を低くしたい場合は、最初に次の静的インポートを行うことにより、検証中にカスタムルールを追加できます。

io.restassured.module.jsv.JsonSchemaValidatorSettings.settings;

次に、検証チェックをfalseに設定してテストを実行します。

@Test
public void givenUrl_whenValidatesResponseWithStaticSettings_thenCorrect() {
    get("/events?id=390").then().assertThat().body(matchesJsonSchemaInClasspath
      ("event_0.json").using(settings().with().checkedValidation(false)));
}

4.3. グローバル検証構成

これらのカスタマイズは非常に柔軟ですが、多数のテストでは各テストの検証を定義する必要がありますが、これは面倒であり、あまりメンテナンスできません。

これを回避するには、we have the freedom to define our configuration just once and let it apply to all testsを使用します。

検証をオフにして、JSONスキーマバージョン3に対して常に使用するように構成します。

JsonSchemaFactory factory = JsonSchemaFactory.newBuilder()
  .setValidationConfiguration(
   ValidationConfiguration.newBuilder()
    .setDefaultVersion(SchemaVersion.DRAFTV3)
      .freeze()).freeze();
JsonSchemaValidator.settings = settings()
  .with().jsonSchemaFactory(factory)
      .and().with().checkedValidation(false);

次に、この構成を削除するには、resetメソッドを呼び出します。

JsonSchemaValidator.reset();

5. 結論

この記事では、REST-assuredを使用するときにスキーマに対してJSON応答を検証する方法を示しました。

いつものように、この例の完全なソースコードはover on GitHubで入手できます。