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.