Validation de schéma JSON avec REST-assuré

Validation de schéma JSON avec REST-assuré

1. Vue d'ensemble

La bibliothèque assurée par REST prend en charge le test des API REST, généralement au format JSON.

De temps en temps, il peut être souhaitable, sans analyser la réponse en détail, de savoir d'abord si le corps JSON est conforme à un certain format JSON.

Dans ce rapide tutoriel, nous allons voir commentwe can validate a JSON response based on a predefined JSON schema.

2. Installer

La configuration initiale assurée par REST est la même queour previous article.

De plus, nous devons également inclure le modulejson-schema-validator dans le fichierpom.xml:


    io.rest-assured
    json-schema-validator
    3.0.0

Pour vous assurer que vous disposez de la dernière version, suivezthis link.

Nous avons également besoin d’une autre bibliothèque portant le même nom mais avec un auteur et des fonctionnalités différents. Ce n’est pas un module de REST assuré mais plutôt, il est utilisé sous le capot par lesjson-schema-validator pour effectuer la validation:


    com.github.fge
    json-schema-validator
    2.2.6

Sa dernière version peut être trouvéehere.

La bibliothèque,json-schema-validator, peut également avoir besoin de la dépendancejson-schema-core:


    com.github.fge
    json-schema-core
    1.2.5

Et la dernière version est toujours trouvéehere.

3. Validation du schéma JSON

Voyons un exemple.

En tant que schéma JSON, nous utiliserons un JSON enregistré dans un fichier appeléevent_0.json, qui est présent dans le classpath:

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

En supposant qu'il s'agisse du format général suivi de toutes les données renvoyées par notre API REST, nous pouvons alors vérifier la conformité d'une réponse JSON, comme suit:

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

Notez que nous allons toujours importer statiquementmatchesJsonSchemaInClasspath depuisio.restassured.module.jsv.JsonSchemaValidator.

4. Validation du schéma JSON Paramètres

4.1. Valider une réponse

Le modulejson-schema-validator de REST-assuré nous donne le pouvoir d'effectuer une validation fine en définissant nos propres règles de configuration personnalisées.

Supposons que notre validation utilise toujours le schéma JSON version 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));
}

Nous ferions cela en utilisant lesJsonSchemaFactory et en spécifiant la version 4SchemaVersion et en affirmant qu'il utilise ce schéma lorsqu'une demande est faite.

4.2. Vérifier les validations

Par défaut, lejson-schema-validator exécute des validations vérifiées sur la chaîne de réponse JSON. Cela signifie que si le schéma définitodds comme un tableau comme dans le JSON suivant:

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

alors le validateur attendra toujours un tableau comme valeur pourodds, donc une réponse oùodds est unString échouera à la validation. Ainsi, si nous souhaitons être moins stricts dans nos réponses, nous pouvons ajouter une règle personnalisée lors de la validation en effectuant tout d'abord l'importation statique suivante:

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

puis exécutez le test avec le contrôle de validation réglé surfalse:

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

4.3. Configuration de validation globale

Ces personnalisations sont très flexibles, mais avec un grand nombre de tests, il faudrait définir une validation pour chaque test, ce qui est fastidieux et difficile à gérer.

Pour éviter cela,we have the freedom to define our configuration just once and let it apply to all tests.

Nous allons configurer la validation pour qu'elle soit décochée et pour toujours l'utiliser avec la version 3 du schéma JSON:

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

puis pour supprimer cette configuration, appelez la méthode reset:

JsonSchemaValidator.reset();

5. Conclusion

Dans cet article, nous avons montré comment nous pouvons valider une réponse JSON par rapport à un schéma lors de l'utilisation de la garantie REST.

Comme toujours, le code source complet de l'exemple est disponibleover on GitHub.