JSON-Schema-Validierung mit REST-gesichert

JSON-Schemaüberprüfung mit REST-Sicherheit

1. Überblick

Die von REST gesicherte Bibliothek bietet Unterstützung für das Testen von REST-APIs, normalerweise im JSON-Format.

Von Zeit zu Zeit kann es wünschenswert sein, ohne die Antwort im Detail zu analysieren, zuerst zu wissen, ob der JSON-Body einem bestimmten JSON-Format entspricht.

In diesem kurzen Tutorial sehen wir uns an, wiewe can validate a JSON response based on a predefined JSON schema sind.

2. Konfiguration

Das anfängliche REST-gesicherte Setup entsprichtour previous article.

Außerdem müssen wir das Moduljson-schema-validator in die Dateipom.xml aufnehmen:


    io.rest-assured
    json-schema-validator
    3.0.0

Um sicherzustellen, dass Sie die neueste Version haben, folgen Siethis link.

Wir brauchen auch eine andere Bibliothek mit dem gleichen Namen, aber einem anderen Autor und einer anderen Funktionalität. Es ist kein Modul von REST-versichert, sondern wird von denjson-schema-validator unter der Haube verwendet, um die Validierung durchzuführen:


    com.github.fge
    json-schema-validator
    2.2.6

Die neueste Version finden Sie unterhere.

Die Bibliothekjson-schema-validator benötigt möglicherweise auch die Abhängigkeitjson-schema-core:


    com.github.fge
    json-schema-core
    1.2.5

Und die neueste Version ist immerhere gefunden.

3. JSON-Schemaüberprüfung

Schauen wir uns ein Beispiel an.

Als JSON-Schema verwenden wir einen JSON, der in einer Datei namensevent_0.json gespeichert ist, die im Klassenpfad vorhanden ist:

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

Unter der Annahme, dass dies das allgemeine Format ist, dem alle von unserer REST-API zurückgegebenen Daten folgen, können wir dann eine JSON-Antwort wie folgt auf Konformität prüfen:

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

Beachten Sie, dass wirmatchesJsonSchemaInClasspath weiterhin statisch ausio.restassured.module.jsv.JsonSchemaValidator. importieren

4. JSON-Schemaüberprüfung die Einstellungen

4.1. Überprüfen Sie eine Antwort

Dasjson-schema-validator-Modul von REST-versichert gibt uns die Möglichkeit, eine detaillierte Validierung durchzuführen, indem wir unsere eigenen benutzerdefinierten Konfigurationsregeln definieren.

Angenommen, wir möchten, dass unsere Validierung immer das JSON-Schema Version 4 verwendet:

@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));
}

Wir würden dies tun, indem wirJsonSchemaFactory verwenden und die Version 4SchemaVersion angeben und behaupten, dass es dieses Schema verwendet, wenn eine Anfrage gestellt wird.

4.2. Überprüfen Sie die Validierungen

Standardmäßig führtjson-schema-validator überprüfte Validierungen für die JSON-Antwortzeichenfolge aus. Dies bedeutet, dass, wenn das Schemaodds als Array wie im folgenden JSON definiert:

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

dann erwartet der Validator immer ein Array als Wert fürodds, daher schlägt eine Antwort fehl, bei derodds einString ist. Wenn wir also mit unseren Antworten weniger streng sein möchten, können wir während der Validierung eine benutzerdefinierte Regel hinzufügen, indem wir zuerst den folgenden statischen Import durchführen:

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

Führen Sie dann den Test mit der Validierungsprüfung auffalse aus:

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

4.3. Globale Validierungskonfiguration

Diese Anpassungen sind sehr flexibel, aber bei einer großen Anzahl von Tests müssten wir für jeden Test eine Validierung definieren. Dies ist umständlich und nicht sehr wartbar.

Um dies zu vermeiden,we have the freedom to define our configuration just once and let it apply to all tests.

Wir konfigurieren die Validierung so, dass sie deaktiviert ist und immer für das JSON-Schema Version 3 verwendet wird:

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

Um diese Konfiguration zu entfernen, rufen Sie die Rücksetzmethode auf:

JsonSchemaValidator.reset();

5. Fazit

In diesem Artikel haben wir gezeigt, wie wir eine JSON-Antwort anhand eines Schemas validieren können, wenn Sie REST-versichert verwenden.

Wie immer ist der vollständige Quellcode für das Beispielover on GitHub verfügbar.