Java >> Java tutorial >  >> Tag >> Json

JSON-skemavalidering med REST-assured

1. Oversigt

Det REST-assured-bibliotek giver support til test af REST API'er, normalt i JSON-format.

Fra tid til anden kan det være ønskeligt, uden at analysere svaret i detaljer, først at vide, om JSON-kroppen er i overensstemmelse med et bestemt JSON-format.

I denne hurtige vejledning tager vi et kig på, hvordan vi kan validere et JSON-svar baseret på et foruddefineret JSON-skema .

2. Opsætning

Den indledende REST-sikrede opsætning er den samme som vores tidligere artikel.

Derudover skal vi også inkludere json-schema-validator modul i pom.xml fil:

<dependency>
    <groupId>io.rest-assured</groupId>
    <artifactId>json-schema-validator</artifactId>
    <version>3.3.0</version>
    <scope>test</scope>
</dependency>

For at sikre, at du har den nyeste version, skal du følge dette link.

3. JSON-skemavalidering

Lad os se på et eksempel.

Som et JSON-skema bruger vi en JSON, der er gemt i en fil kaldet event_0.json , som er til stede i klassestien:

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

Hvis vi så antager, at dette er det generelle format efterfulgt af alle data, der returneres af vores REST API, kan vi derefter kontrollere et JSON-svar for overensstemmelse som sådan:

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

Bemærk, at vi stadig statisk importerer matchesJsonSchemaInClasspath fra io.restassured.module.jsv.JsonSchemaValidator.

4. JSON-skemavalidering Indstillinger

4.1. Valider et svar

json-schema-validator modul af REST-assured giver os magten til at udføre finkornet validering ved at definere vores egne brugerdefinerede konfigurationsregler.

Lad os sige, at vi ønsker, at vores validering altid skal bruge JSON-skemaet 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));
}

Vi ville gøre dette ved at bruge JsonSchemaFactory og angiv version 4 SchemaVersion og påstå, at den bruger det skema, når en anmodning fremsættes.

4.2. Tjek valideringer

Som standard er json-schema-validator kører kontrollerede valideringer på JSON-svarstrengen. Dette betyder, at hvis skemaet definerer odds som et array som i følgende JSON:

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

så vil validatoren altid forvente et array som værdien for odds , derfor et svar med odds er en streng vil mislykkes i valideringen. Så hvis vi gerne vil være mindre strenge med vores svar, kan vi tilføje en tilpasset regel under valideringen ved først at foretage følgende statiske import:

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

udfør derefter testen med valideringskontrollen sat til falsk :

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

4.3. Global valideringskonfiguration

Disse tilpasninger er meget fleksible, men med et stort antal tests ville vi være nødt til at definere en validering for hver test, dette er besværligt og ikke særlig vedligeholdeligt.

For at undgå dette har vi friheden til kun at definere vores konfiguration én gang og lade den gælde for alle tests .

Vi konfigurerer valideringen til at være afkrydset og til altid at bruge den mod JSON-skema version 3:

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

for at fjerne denne konfiguration skal du kalde nulstillingsmetoden:

JsonSchemaValidator.reset();

5. Konklusion

I denne artikel har vi vist, hvordan vi kan validere et JSON-svar mod et skema, når vi bruger REST-assured.

Som altid er den fulde kildekode til eksemplet tilgængelig på GitHub.


Java tag