Automatizando Testes de Contrato API REST – Parte 1

API_MATERACada vez mais os sistemas estão deixando de ser monolíticos e sendo construídos no formato de microservices, onde serviços são providos e consumidos por outros sistemas.
Neste modelo um teste fundamental é o teste de integração.

No entanto, para realizar testes automáticos de integração entre serviços nem sempre é uma tarefa simples, uma vez que é necessário possuir uma infraestrutura que contenha todos os serviços que fazem parte da integração rodando, sistemas secundários que fazem parte do ecossistema, base de dados, além de fatores como latência e concorrência de rede que podem interferir diretamente nos testes.

Os testes de integração não podem ser descartáveis, mas dependendo do cenário, como por exemplo de deploy contínuo, uma abordagem mais ágil seria automatizar esse tipo de teste, seguindo a linha de testes de contrato, uma vez que não é necessário subir um ambiente end-to-end.

Mas vamos por parte: O que é teste de contrato? Como automatizar?

Testes de contrato

São testes que comparam os tipos de dados de uma requisição a partir de um sistema consumidor (aplicação que chamará um serviço, ou seja, irá consumi-lo) e provedor (aplicação que fornece dados via serviço) a partir de um contrato definido.

Este “contrato” pode ser um arquivo no formato json, yaml, xml que contém dados da requisição como protocolo HTTP de envio, estrutura dos dados de envio e retorno, headers, url destino entre outros.

Basicamente o teste funciona da seguinte maneira: o sistema consumidor realiza uma chamada para o provedor e recebe os dados de retorno. A estrutura de dados retornada é comparada com a estrutura definida no contrato. Se os dados não forem iguais o teste falha indicando que a API está retornando dados diferentes do que o cliente está esperando, ou seja, houve a quebra de contrato de algum dado recebido.

A ideia geral é garantir a integridade da API antes que o sistema consumidor processe os dados da requisição enviada pelo provedor, que pode enviar alguma informação inconsistente que o consumidor ainda não consegue identificar como válida.

An integration contract test is a test at the boundary of an external service verifying that it meets the contract expected by a consuming service — Martin Fowler

Como automatizar?

Uma vez definido o contrato (um arquivo com a estrutura do request e response), é possível utilizar um framework para realizar a validação.

Estes frameworks permitem que de uma forma simples, seja automatizado a validação de contrato entre serviços.

Para a automação não é necessário possuir todas as aplicações rodando, com um mock é possível simular os serviços e a validação do contrato pode ser realizada normalmente, pois a ideia não é validar o comportamento do sistema após o consumo do serviço e sim a estrutura enviada.

O ideal é executar esse tipo de teste em um ambiente de integração contínua, garantindo a integridade dos serviços a cada nova build.

No próximo post (Parte 2 desta série) será mostrado um exemplo de um teste automático de validação de contrato utilizando o framework Pact que é orientado a testes para os sistemas consumidores.

Esta foi uma introdução do que é teste de contrato, com o objetivo de mostrar que a mudança para microservices exige também que novos modelos de testes sejam executados para atender e garantir a qualidade de aplicações que trabalham com este formato.

Por MONISE COSTA

Formada em Sistemas de Informação pela PUC Campinas, MATERANA desde 2011. Apaixonada pela área de TI, Analista de Requisitos na maior parte do tempo e desenvolvedora Java/Android por lazer.

Postado em: 30 de novembro de 2017

Confira outros artigos do nosso blog

Introdução ao Dev-Test Pairing

13 de junho de 2018

Caio Rizolli

Falando sobre Teste de Intrusão (ou PenTest)

03 de abril de 2018

Jacqueline Costa

Protractor – Testes automáticos end-to-end para aplicações em Angular

07 de dezembro de 2017

Jacqueline Costa

Testes em Node.js

04 de dezembro de 2017

Alan Cesar Elias

Deixe seu comentário