Validação de esquema JSON com garantia REST

Validação de esquema JSON com garantia REST

1. Visão geral

A biblioteca garantida por REST fornece suporte para testar APIs REST, geralmente no formato JSON.

De tempos em tempos, pode ser desejável, sem analisar a resposta em detalhes, saber primeiro se o corpo JSON está em conformidade com um determinado formato JSON.

Neste tutorial rápido, vamos dar uma olhada em comowe can validate a JSON response based on a predefined JSON schema.

2. Configuração

A configuração inicial garantida por REST é igual aour previous article.

Além disso, também precisamos incluir o módulojson-schema-validator no arquivopom.xml:


    io.rest-assured
    json-schema-validator
    3.0.0

Para garantir que você tenha a versão mais recente, sigathis link.

Também precisamos de outra biblioteca com o mesmo nome, mas um autor e funcionalidade diferentes. Não é um módulo com garantia de REST, mas sim, é usado por baixo do capô porjson-schema-validator para realizar a validação:


    com.github.fge
    json-schema-validator
    2.2.6

Sua versão mais recente pode ser encontradahere.

A biblioteca,json-schema-validator, também pode precisar da dependênciajson-schema-core:


    com.github.fge
    json-schema-core
    1.2.5

E a versão mais recente é sempre encontradahere.

3. Validação de esquema JSON

Vamos dar uma olhada em um exemplo.

Como um esquema JSON, usaremos um JSON salvo em um arquivo chamadoevent_0.json, que está presente no classpath:

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

Supondo que este seja o formato geral seguido por todos os dados retornados por nossa API REST, podemos verificar uma resposta JSON quanto à conformidade, como segue:

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

Observe que ainda importaremos estaticamentematchesJsonSchemaInClasspath deio.restassured.module.jsv.JsonSchemaValidator.

4. Validação de esquema JSON Configurações

4.1. Validar uma resposta

O módulojson-schema-validator de REST-assegurado nos dá o poder de realizar validação refinada definindo nossas próprias regras de configuração personalizadas.

Digamos que queremos que nossa validação sempre use o esquema JSON versão 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));
}

Faríamos isso usandoJsonSchemaFactorye especificaríamos a versão 4SchemaVersione afirmaríamos que está usando esse esquema quando uma solicitação é feita.

4.2. Verifique as validações

Por padrão, ojson-schema-validator executa validações verificadas na string de resposta JSON. Isso significa que se o esquema definirodds como uma matriz como no seguinte JSON:

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

então o validador sempre estará esperando um array como o valor paraodds, portanto, uma resposta ondeodds éString falhará na validação. Portanto, se quisermos ser menos rigorosos com nossas respostas, podemos adicionar uma regra personalizada durante a validação, primeiro fazendo a seguinte importação estática:

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

em seguida, execute o teste com a verificação de validação definida parafalse:

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

4.3. Configuração de validação global

Essas personalizações são muito flexíveis, mas com um grande número de testes, teríamos que definir uma validação para cada teste, isso é complicado e não é de fácil manutenção.

Para evitar isso,we have the freedom to define our configuration just once and let it apply to all tests.

Vamos configurar a validação para ser desmarcada e sempre usá-la contra o esquema JSON versão 3:

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

para remover essa configuração, chame o método de redefinição:

JsonSchemaValidator.reset();

5. Conclusão

Neste artigo, mostramos como podemos validar uma resposta JSON em relação a um esquema ao usar REST garantido.

Como sempre, o código-fonte completo do exemplo está disponívelover on GitHub.