SlideShare ist ein Scribd-Unternehmen logo
1 von 37
Downloaden Sie, um offline zu lesen
DÊ A MÁXIMA COBERTURA NOS
SEUS TESTES DE API
ELIAS NOGUEIRA
@eliasnogueira
Conceituação
FRONTENDBACKEND
API Gateway
testes funcionais e de
aceitação para o frontend
web e/ou mobile
testes unitários e
integração no backend
testes na api de
consumo
SUT – System Under Test | Front-end
Informar um CPF:
• válido
• que não esteja com restrição
• não cadastrado
SUT – System Under Test | Front-end
Efetuar o cadastro
respeitando as restrições
SUT – System Under Test | Front-end
Efetuar operações de CRUD
Passos...
1 Entender a documentação da API
2 Pensar nos testes com uma divisão de pipeline
3 Criar uma versão inicial da arquitetura
4 Criar os testes e definir as suítes de testes
1.
Entender a
documentação da API
Open API
Swagger
Ter a documentação correta e
dentro de padrões é a melhor
forma de entender a API e iniciar
os testes .
2.
Pensar nos testes com
uma divisão de
pipeline
API
Pipeline
Health Check
Contrato
Funcional
Aceitação
Garantir que o endpoint está respondendo
Garantir que o endpoint não teve seus
atributos alterados
Garantir que o endpoint funciona ou apresenta
os resultados de falha esperados
Garantir que um conjunto de endpoints
funcionam como na UI
3.
Criar uma versão
inicial da arquitetura
Modelo 1
Um projeto de teste para cada microserviço +
um projeto de testes de aceitação
Como serão os projetos de teste?
BACKEND
TEST TEST TEST
PROEJTO
TESTE
TEST
PROJETO
ACEITAÇÃO
Modelo 2
Projeto único para todas as APIs
Como serão os projetos de teste?
BACKEND
TEST
PROEJTO
TESTE
Base Test
Ponto centralizado para pré e pós condições de teste
Builder
Criação de métodos fluentes
Data Factory
Criação de dados de forma dinâmica e centralizada
Data Driven
Estratégia de utilização de dados nos testes
Uso de Padrões de Projeto
4.
Criar testes e definir as
suítes de teste
Rest-Assured
http://rest-assured.io
DSL Java para testar e validar APIs REST.
import static io.restassured.RestAssured.*;
import static org.hamcrest.Matchers.*;
public class ExemploRestAssured {
@Test
public void boasVindas() {
given().
param("nome", "Elias").
when().
post("/cadastro").
then().
body("mensagem", is("Olá Elias"));
}
}
Rest-Assured
http://rest-assured.io
DSL Java para testar e validar APIs REST.
import static io.restassured.RestAssured.*;
import static org.hamcrest.Matchers.*;
public class ExemploRestAssured {
@Test
public void boasVindas() {
given().
param("nome", "Elias").
when().
post("/cadastro").
then().
body("mensagem", is("Olá Elias"));
}
}
importação das
bibliotecas necessárias
Rest-Assured
http://rest-assured.io
DSL Java para testar e validar APIs REST.
import static io.restassured.RestAssured.*;
import static org.hamcrest.Matchers.*;
public class ExemploRestAssured {
@Test
public void boasVindas() {
given().
param("nome", "Elias").
when().
post("/cadastro").
then().
body("mensagem", is("Olá Elias"));
}
}
pré-condição para a
requisição
Rest-Assured
http://rest-assured.io
DSL Java para testar e validar APIs REST.
import static io.restassured.RestAssured.*;
import static org.hamcrest.Matchers.*;
public class ExemploRestAssured {
@Test
public void boasVindas() {
given().
param("nome", "Elias").
when().
post("/cadastro").
then().
body("mensagem", is("Olá Elias"));
}
}
ação (requisição)
Rest-Assured
http://rest-assured.io
DSL Java para testar e validar APIs REST.
import static io.restassured.RestAssured.*;
import static org.hamcrest.Matchers.*;
public class ExemploRestAssured {
@Test
public void boasVindas() {
given().
param("nome", "Elias").
when().
post("/cadastro").
then().
body("mensagem", is("Olá Elias"));
}
}
validação dos dados
de retorno
API
health-check
Health Check
Contrato
Funcional
Aceitação
Garantir que o endpoint está respondendo
Garantir que o endpoint não teve seus
atributos alterados
Garantir que o endpoint funciona ou apresenta
os resultados de falha esperados
Garantir que um conjunto de endpoints
funcionam como na UI
heath-check
Apenas validamos se a API está disponível
Se existir alguma abordagem de verificação ou monitoramento validamos
o status geral do retorno
@Test(groups = "health")
public void healthCheckViaActuator() {
basePath = "/actuator";
when().
get("/health").
then().
statusCode(200).
body("status", is("UP"));
}
@Test(groups = "health")
public void healthCheckViaAPI() {
given().
pathParam("cpf", "81016654049").
when().
get("/restricoes/{cpf}").
then().
statusCode(204);
}
via monitoramento via API
API
contrato
Health Check
Contrato
Funcional
Aceitação
Garantir que o endpoint está respondendo
Garantir que o endpoint não teve seus
atributos alterados
Garantir que o endpoint funciona ou apresenta
os resultados de falha esperados
Garantir que um conjunto de endpoints
funcionam como na UI
● É o nome dado ao pacto entre o produtor e consumidor
● Garante que mudanças na API não invalidem o consumo:
● path
● parâmetros
● dados de envio (request)
● dados de retorno (response body)
● json-schema é um contrato que define os dados
esperados, tipos e formatos de cada campo na resposta
contrato
{
"nome": "Elias",
"idade": 36
}
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"nome": {
"type": "string"
},
"idade": {
"type": "integer"
}
},
"required": [
"nome",
"idade"
],
"additionalProperties": false
}
json-schema
{
"nome": "Elias",
"idade": 36
}
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"nome": {
"type": "string"
},
"idade": {
"type": "integer"
}
},
"required": [
"nome",
"idade"
],
"additionalProperties": false
}
json-schema possui o nome
do atributo e o tipo de dados
json-schema
{
"nome": "Elias",
"idade": 36
}
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"nome": {
"type": "string"
},
"idade": {
"type": "integer"
}
},
"required": [
"nome",
"idade"
],
"additionalProperties": false
}
os dois atributos devem estar
presentes, obrigatoriamente
json-schema
{
"nome": "Elias",
"idade": 36
}
{
"$schema": "http://json-schema.org/draft-04/schema#",
"type": "object",
"properties": {
"nome": {
"type": "string"
},
"idade": {
"type": "integer"
}
},
"required": [
"nome",
"idade"
],
"additionalProperties": false
}
json-schema
nenhum outro
atributo é permitido
API
funcional
Health Check
Contrato
Funcional
Aceitação
Garantir que o endpoint está respondendo
Garantir que o endpoint não teve seus
atributos alterados
Garantir que o endpoint funciona ou apresenta
os resultados de falha esperados
Garantir que um conjunto de endpoints
funcionam como na UI
funcional
Validar cenários positivos e negativos (caminho feliz | fluxo exceção)
@Test(groups = {"funcional"})
public void cPFExistente() {
given().
pathParam("cpf", "66414919004").
when().
get("/simulacoes/{cpf}").
then().
statusCode(200).
body(
"id", equalTo(1),
"nome", equalTo("Fulano"),
"cpf", equalTo("66414919004"),
"email", equalTo("fulano@gmail.com"),
"valor", equalTo(11000f),
"parcelas", equalTo(3),
"seguro", equalTo(true)
);
}
validação de dados
API
aceitação
Health Check
Contrato
Funcional
Aceitação
Garantir que o endpoint está respondendo
Garantir que o endpoint não teve seus
atributos alterados
Garantir que o endpoint funciona ou apresenta
os resultados de falha esperados
Garantir que um conjunto de endpoints
funcionam como na UI
Testar com a perspectiva do usuário
● Acessar a página e efetuar a consulta de
restrição no CPF
● Inserir uma simulação de crédito
aceitação
@Test(groups = {"aceitacao"})
public void realizaSimulacaoCredito() {
baseURI = "http://localhost";
port = 8088;
basePath = "/api/v1";
String cpf = "12345678901";
// efetua a verificacao de cpf restrito
given().
pathParam("cpf", cpf).
when().
get("/restricoes/{cpf}").
then().
statusCode(204);
// efetua a simulacao
port = 8089;
Simulacao simulacao = SimulacaoDataFactory.criaNovaSimulacao();
given().
contentType(ContentType.JSON).
body(simulacao).
when().
post("/simulacoes").
then().
statusCode(201);
}
aceitação
@Test(groups = {"aceitacao"})
public void realizaSimulacaoCredito() {
baseURI = "http://localhost";
port = 8088;
basePath = "/api/v1";
String cpf = "12345678901";
// efetua a verificacao de cpf restrito
given().
pathParam("cpf", cpf).
when().
get("/restricoes/{cpf}").
then().
statusCode(204);
// efetua a simulacao
port = 8089;
Simulacao simulacao = SimulacaoDataFactory.criaNovaSimulacao();
given().
contentType(ContentType.JSON).
body(simulacao).
when().
post("/simulacoes").
then().
statusCode(201);
}
requisição de consulta
restrição
aceitação
@Test(groups = {"aceitacao"})
public void realizaSimulacaoCredito() {
baseURI = "http://localhost";
port = 8088;
basePath = "/api/v1";
String cpf = "12345678901";
// efetua a verificacao de cpf restrito
given().
pathParam("cpf", cpf).
when().
get("/restricoes/{cpf}").
then().
statusCode(204);
// efetua a simulacao
port = 8089;
Simulacao simulacao = SimulacaoDataFactory.criaNovaSimulacao();
given().
contentType(ContentType.JSON).
body(simulacao).
when().
post("/simulacoes").
then().
statusCode(201);
}
requisição de
simulação de crédito
Obrigado!
@eliasnogueira
github.com/eliasnogueira

Weitere ähnliche Inhalte

Was ist angesagt?

Testes De Software - Uma Visão Geral
Testes De Software - Uma Visão GeralTestes De Software - Uma Visão Geral
Testes De Software - Uma Visão Geral
paulo peres
 
Planejamento de Testes
Planejamento de TestesPlanejamento de Testes
Planejamento de Testes
elliando dias
 

Was ist angesagt? (20)

DevCamp - O papel de um testador em uma equipe ágil
DevCamp - O papel de um testador em uma equipe ágilDevCamp - O papel de um testador em uma equipe ágil
DevCamp - O papel de um testador em uma equipe ágil
 
Testes de ponta a ponta
Testes de ponta a pontaTestes de ponta a ponta
Testes de ponta a ponta
 
Pirâmide de testes mobile, dividindo seus testes de maneira efetiva
Pirâmide de testes mobile, dividindo seus testes de maneira efetivaPirâmide de testes mobile, dividindo seus testes de maneira efetiva
Pirâmide de testes mobile, dividindo seus testes de maneira efetiva
 
Workshop Agile Testing Mindset
Workshop Agile Testing MindsetWorkshop Agile Testing Mindset
Workshop Agile Testing Mindset
 
API Testing following the Test Pyramid
API Testing following the Test PyramidAPI Testing following the Test Pyramid
API Testing following the Test Pyramid
 
Karate - powerful and simple framework for REST API automation testing
Karate - powerful and simple framework for REST API automation testingKarate - powerful and simple framework for REST API automation testing
Karate - powerful and simple framework for REST API automation testing
 
API Test Automation Using Karate (Anil Kumar Moka)
API Test Automation Using Karate (Anil Kumar Moka)API Test Automation Using Karate (Anil Kumar Moka)
API Test Automation Using Karate (Anil Kumar Moka)
 
Agile testing
Agile testing Agile testing
Agile testing
 
Testes em todos os niveis de planejamento
Testes em todos os niveis de planejamentoTestes em todos os niveis de planejamento
Testes em todos os niveis de planejamento
 
Arquitetura de Automação de Teste
Arquitetura de Automação de TesteArquitetura de Automação de Teste
Arquitetura de Automação de Teste
 
Todas as abordagens de testes dentro do ágil
Todas as abordagens de testes dentro do ágilTodas as abordagens de testes dentro do ágil
Todas as abordagens de testes dentro do ágil
 
Testes De Software - Uma Visão Geral
Testes De Software - Uma Visão GeralTestes De Software - Uma Visão Geral
Testes De Software - Uma Visão Geral
 
TOTVS - Agile Testing e a Importância de se ter Estratégia de Testes
TOTVS - Agile Testing e a Importância de se ter Estratégia de TestesTOTVS - Agile Testing e a Importância de se ter Estratégia de Testes
TOTVS - Agile Testing e a Importância de se ter Estratégia de Testes
 
Planejamento de testes em um mundo ágil
Planejamento de testes em um mundo ágilPlanejamento de testes em um mundo ágil
Planejamento de testes em um mundo ágil
 
API Automation Testing Using RestAssured+Cucumber
API Automation Testing Using RestAssured+CucumberAPI Automation Testing Using RestAssured+Cucumber
API Automation Testing Using RestAssured+Cucumber
 
Software Testing - Test Design Techniques
Software Testing - Test Design TechniquesSoftware Testing - Test Design Techniques
Software Testing - Test Design Techniques
 
Planejamento de Testes
Planejamento de TestesPlanejamento de Testes
Planejamento de Testes
 
Como criar e executar testes paralelos web usando Selenium e containers
Como criar e executar testes paralelos web usando Selenium e containersComo criar e executar testes paralelos web usando Selenium e containers
Como criar e executar testes paralelos web usando Selenium e containers
 
Confie no seu pipeline: Teste automaticamente um aplicativo Java de ponta a p...
Confie no seu pipeline: Teste automaticamente um aplicativo Java de ponta a p...Confie no seu pipeline: Teste automaticamente um aplicativo Java de ponta a p...
Confie no seu pipeline: Teste automaticamente um aplicativo Java de ponta a p...
 
Karate DSL
Karate DSLKarate DSL
Karate DSL
 

Ähnlich wie De a máxima cobertura nos seus testes de API

PDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETPDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NET
slides_teltools
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POO
Wesley Lemos
 

Ähnlich wie De a máxima cobertura nos seus testes de API (20)

Workshop Microservices - Construindo APIs RESTful com Spring Boot
Workshop Microservices - Construindo APIs RESTful com Spring BootWorkshop Microservices - Construindo APIs RESTful com Spring Boot
Workshop Microservices - Construindo APIs RESTful com Spring Boot
 
PDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NETPDC - Engenharia - Plataforma Microsoft .NET
PDC - Engenharia - Plataforma Microsoft .NET
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Spring MVC - QConSP
Spring MVC - QConSPSpring MVC - QConSP
Spring MVC - QConSP
 
Explorando a API Rest Jira Cloud
Explorando a API Rest Jira CloudExplorando a API Rest Jira Cloud
Explorando a API Rest Jira Cloud
 
Spring Capitulo 03
Spring Capitulo 03Spring Capitulo 03
Spring Capitulo 03
 
Integrando o dev com o ops - Marcelo Castellani
Integrando o dev com o ops - Marcelo CastellaniIntegrando o dev com o ops - Marcelo Castellani
Integrando o dev com o ops - Marcelo Castellani
 
uma história sobre testes de API
uma história sobre testes de APIuma história sobre testes de API
uma história sobre testes de API
 
Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOL
 
Path to the future #2 - Internet das coisas com AWS IoT
Path to the future #2 - Internet das coisas com AWS IoTPath to the future #2 - Internet das coisas com AWS IoT
Path to the future #2 - Internet das coisas com AWS IoT
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POO
 
Onde nenhum desenvolvedor jamais testou: Introduzindo testes unitários em cód...
Onde nenhum desenvolvedor jamais testou: Introduzindo testes unitários em cód...Onde nenhum desenvolvedor jamais testou: Introduzindo testes unitários em cód...
Onde nenhum desenvolvedor jamais testou: Introduzindo testes unitários em cód...
 
JAX-RS 2.0
JAX-RS 2.0JAX-RS 2.0
JAX-RS 2.0
 
GUJavaSC - Combinando AngularJS com Java EE
GUJavaSC - Combinando AngularJS com Java EEGUJavaSC - Combinando AngularJS com Java EE
GUJavaSC - Combinando AngularJS com Java EE
 
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpike
 
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
 
QCon 2015 - Combinando AngularJS com Java EE
QCon 2015 - Combinando AngularJS com Java EEQCon 2015 - Combinando AngularJS com Java EE
QCon 2015 - Combinando AngularJS com Java EE
 
Workshop05
Workshop05Workshop05
Workshop05
 
JavaOne LATAM 2016 - Combinando AngularJS com Java EE
JavaOne LATAM 2016 - Combinando AngularJS com Java EEJavaOne LATAM 2016 - Combinando AngularJS com Java EE
JavaOne LATAM 2016 - Combinando AngularJS com Java EE
 
Tornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JSTornando as coisas mais simples com Azure Functions e Node.JS
Tornando as coisas mais simples com Azure Functions e Node.JS
 

Mehr von Elias Nogueira

Mehr von Elias Nogueira (20)

Coach por Imersão - Buscando a excelência técnica com o time
Coach por Imersão - Buscando a excelência técnica com o timeCoach por Imersão - Buscando a excelência técnica com o time
Coach por Imersão - Buscando a excelência técnica com o time
 
O Agile Coach pode (e muitas vezes deve) ser técnico
O Agile Coach pode (e muitas vezes deve) ser técnicoO Agile Coach pode (e muitas vezes deve) ser técnico
O Agile Coach pode (e muitas vezes deve) ser técnico
 
Create an architecture for web test automation
Create an architecture for web test automationCreate an architecture for web test automation
Create an architecture for web test automation
 
Paralelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidosParalelize seus testes web e mobile para ter feedbacks mais rápidos
Paralelize seus testes web e mobile para ter feedbacks mais rápidos
 
Como 4 Agile Coaches trabalham em uma Transformação Ágil
Como 4 Agile Coaches trabalham em uma Transformação Ágil Como 4 Agile Coaches trabalham em uma Transformação Ágil
Como 4 Agile Coaches trabalham em uma Transformação Ágil
 
BDD não é automação de teste - Scrum Gathering
BDD não é automação de teste - Scrum GatheringBDD não é automação de teste - Scrum Gathering
BDD não é automação de teste - Scrum Gathering
 
Improve Yourself -- Learn the Skills, Join the Community - Tests
Improve Yourself -- Learn the Skills, Join the Community - TestsImprove Yourself -- Learn the Skills, Join the Community - Tests
Improve Yourself -- Learn the Skills, Join the Community - Tests
 
BDD não é Automação de Testes
BDD não é Automação de TestesBDD não é Automação de Testes
BDD não é Automação de Testes
 
Criando uma grid para execução de testes paralelo com Appium
Criando uma grid para execução de testes paralelo com AppiumCriando uma grid para execução de testes paralelo com Appium
Criando uma grid para execução de testes paralelo com Appium
 
Como ter sucesso ministrando uma palestra técnica
Como ter sucesso ministrando uma palestra técnicaComo ter sucesso ministrando uma palestra técnica
Como ter sucesso ministrando uma palestra técnica
 
Quais são os steps de que deve conter na sua pipeline?
Quais são os steps de que deve conter na sua pipeline?Quais são os steps de que deve conter na sua pipeline?
Quais são os steps de que deve conter na sua pipeline?
 
Tem que testar mesmo?
Tem que testar mesmo?Tem que testar mesmo?
Tem que testar mesmo?
 
Coaching the Agile Coach
Coaching the Agile CoachCoaching the Agile Coach
Coaching the Agile Coach
 
Java Test Automation for REST, Web and Mobile
Java Test Automation for REST, Web and MobileJava Test Automation for REST, Web and Mobile
Java Test Automation for REST, Web and Mobile
 
Trust Your Pipeline - Automatically Testing and End-to-End Java Application
Trust Your Pipeline - Automatically Testing and End-to-End Java ApplicationTrust Your Pipeline - Automatically Testing and End-to-End Java Application
Trust Your Pipeline - Automatically Testing and End-to-End Java Application
 
O que é um Agile Coach
O que é um Agile CoachO que é um Agile Coach
O que é um Agile Coach
 
Criando uma grid para execução de teste automatizado funcional e e2e
Criando uma grid para execução de teste automatizado funcional e e2eCriando uma grid para execução de teste automatizado funcional e e2e
Criando uma grid para execução de teste automatizado funcional e e2e
 
A importancia de testes em todos os aspectos
A importancia de testes em todos os aspectosA importancia de testes em todos os aspectos
A importancia de testes em todos os aspectos
 
O Testador Técnico
O Testador TécnicoO Testador Técnico
O Testador Técnico
 
Apenas um script de teste para iOS e Android
Apenas um script de teste para iOS e AndroidApenas um script de teste para iOS e Android
Apenas um script de teste para iOS e Android
 

De a máxima cobertura nos seus testes de API

  • 1. DÊ A MÁXIMA COBERTURA NOS SEUS TESTES DE API ELIAS NOGUEIRA @eliasnogueira
  • 3. FRONTENDBACKEND API Gateway testes funcionais e de aceitação para o frontend web e/ou mobile testes unitários e integração no backend testes na api de consumo
  • 4. SUT – System Under Test | Front-end Informar um CPF: • válido • que não esteja com restrição • não cadastrado
  • 5. SUT – System Under Test | Front-end Efetuar o cadastro respeitando as restrições
  • 6. SUT – System Under Test | Front-end Efetuar operações de CRUD
  • 7. Passos... 1 Entender a documentação da API 2 Pensar nos testes com uma divisão de pipeline 3 Criar uma versão inicial da arquitetura 4 Criar os testes e definir as suítes de testes
  • 9. Open API Swagger Ter a documentação correta e dentro de padrões é a melhor forma de entender a API e iniciar os testes .
  • 10. 2. Pensar nos testes com uma divisão de pipeline
  • 11. API Pipeline Health Check Contrato Funcional Aceitação Garantir que o endpoint está respondendo Garantir que o endpoint não teve seus atributos alterados Garantir que o endpoint funciona ou apresenta os resultados de falha esperados Garantir que um conjunto de endpoints funcionam como na UI
  • 13. Modelo 1 Um projeto de teste para cada microserviço + um projeto de testes de aceitação Como serão os projetos de teste? BACKEND TEST TEST TEST PROEJTO TESTE TEST PROJETO ACEITAÇÃO
  • 14. Modelo 2 Projeto único para todas as APIs Como serão os projetos de teste? BACKEND TEST PROEJTO TESTE
  • 15. Base Test Ponto centralizado para pré e pós condições de teste Builder Criação de métodos fluentes Data Factory Criação de dados de forma dinâmica e centralizada Data Driven Estratégia de utilização de dados nos testes Uso de Padrões de Projeto
  • 16. 4. Criar testes e definir as suítes de teste
  • 17. Rest-Assured http://rest-assured.io DSL Java para testar e validar APIs REST. import static io.restassured.RestAssured.*; import static org.hamcrest.Matchers.*; public class ExemploRestAssured { @Test public void boasVindas() { given(). param("nome", "Elias"). when(). post("/cadastro"). then(). body("mensagem", is("Olá Elias")); } }
  • 18. Rest-Assured http://rest-assured.io DSL Java para testar e validar APIs REST. import static io.restassured.RestAssured.*; import static org.hamcrest.Matchers.*; public class ExemploRestAssured { @Test public void boasVindas() { given(). param("nome", "Elias"). when(). post("/cadastro"). then(). body("mensagem", is("Olá Elias")); } } importação das bibliotecas necessárias
  • 19. Rest-Assured http://rest-assured.io DSL Java para testar e validar APIs REST. import static io.restassured.RestAssured.*; import static org.hamcrest.Matchers.*; public class ExemploRestAssured { @Test public void boasVindas() { given(). param("nome", "Elias"). when(). post("/cadastro"). then(). body("mensagem", is("Olá Elias")); } } pré-condição para a requisição
  • 20. Rest-Assured http://rest-assured.io DSL Java para testar e validar APIs REST. import static io.restassured.RestAssured.*; import static org.hamcrest.Matchers.*; public class ExemploRestAssured { @Test public void boasVindas() { given(). param("nome", "Elias"). when(). post("/cadastro"). then(). body("mensagem", is("Olá Elias")); } } ação (requisição)
  • 21. Rest-Assured http://rest-assured.io DSL Java para testar e validar APIs REST. import static io.restassured.RestAssured.*; import static org.hamcrest.Matchers.*; public class ExemploRestAssured { @Test public void boasVindas() { given(). param("nome", "Elias"). when(). post("/cadastro"). then(). body("mensagem", is("Olá Elias")); } } validação dos dados de retorno
  • 22. API health-check Health Check Contrato Funcional Aceitação Garantir que o endpoint está respondendo Garantir que o endpoint não teve seus atributos alterados Garantir que o endpoint funciona ou apresenta os resultados de falha esperados Garantir que um conjunto de endpoints funcionam como na UI
  • 23. heath-check Apenas validamos se a API está disponível Se existir alguma abordagem de verificação ou monitoramento validamos o status geral do retorno @Test(groups = "health") public void healthCheckViaActuator() { basePath = "/actuator"; when(). get("/health"). then(). statusCode(200). body("status", is("UP")); } @Test(groups = "health") public void healthCheckViaAPI() { given(). pathParam("cpf", "81016654049"). when(). get("/restricoes/{cpf}"). then(). statusCode(204); } via monitoramento via API
  • 24. API contrato Health Check Contrato Funcional Aceitação Garantir que o endpoint está respondendo Garantir que o endpoint não teve seus atributos alterados Garantir que o endpoint funciona ou apresenta os resultados de falha esperados Garantir que um conjunto de endpoints funcionam como na UI
  • 25. ● É o nome dado ao pacto entre o produtor e consumidor ● Garante que mudanças na API não invalidem o consumo: ● path ● parâmetros ● dados de envio (request) ● dados de retorno (response body) ● json-schema é um contrato que define os dados esperados, tipos e formatos de cada campo na resposta contrato
  • 26. { "nome": "Elias", "idade": 36 } { "$schema": "http://json-schema.org/draft-04/schema#", "type": "object", "properties": { "nome": { "type": "string" }, "idade": { "type": "integer" } }, "required": [ "nome", "idade" ], "additionalProperties": false } json-schema
  • 27. { "nome": "Elias", "idade": 36 } { "$schema": "http://json-schema.org/draft-04/schema#", "type": "object", "properties": { "nome": { "type": "string" }, "idade": { "type": "integer" } }, "required": [ "nome", "idade" ], "additionalProperties": false } json-schema possui o nome do atributo e o tipo de dados json-schema
  • 28. { "nome": "Elias", "idade": 36 } { "$schema": "http://json-schema.org/draft-04/schema#", "type": "object", "properties": { "nome": { "type": "string" }, "idade": { "type": "integer" } }, "required": [ "nome", "idade" ], "additionalProperties": false } os dois atributos devem estar presentes, obrigatoriamente json-schema
  • 29. { "nome": "Elias", "idade": 36 } { "$schema": "http://json-schema.org/draft-04/schema#", "type": "object", "properties": { "nome": { "type": "string" }, "idade": { "type": "integer" } }, "required": [ "nome", "idade" ], "additionalProperties": false } json-schema nenhum outro atributo é permitido
  • 30. API funcional Health Check Contrato Funcional Aceitação Garantir que o endpoint está respondendo Garantir que o endpoint não teve seus atributos alterados Garantir que o endpoint funciona ou apresenta os resultados de falha esperados Garantir que um conjunto de endpoints funcionam como na UI
  • 31. funcional Validar cenários positivos e negativos (caminho feliz | fluxo exceção) @Test(groups = {"funcional"}) public void cPFExistente() { given(). pathParam("cpf", "66414919004"). when(). get("/simulacoes/{cpf}"). then(). statusCode(200). body( "id", equalTo(1), "nome", equalTo("Fulano"), "cpf", equalTo("66414919004"), "email", equalTo("fulano@gmail.com"), "valor", equalTo(11000f), "parcelas", equalTo(3), "seguro", equalTo(true) ); } validação de dados
  • 32. API aceitação Health Check Contrato Funcional Aceitação Garantir que o endpoint está respondendo Garantir que o endpoint não teve seus atributos alterados Garantir que o endpoint funciona ou apresenta os resultados de falha esperados Garantir que um conjunto de endpoints funcionam como na UI
  • 33. Testar com a perspectiva do usuário ● Acessar a página e efetuar a consulta de restrição no CPF ● Inserir uma simulação de crédito
  • 34. aceitação @Test(groups = {"aceitacao"}) public void realizaSimulacaoCredito() { baseURI = "http://localhost"; port = 8088; basePath = "/api/v1"; String cpf = "12345678901"; // efetua a verificacao de cpf restrito given(). pathParam("cpf", cpf). when(). get("/restricoes/{cpf}"). then(). statusCode(204); // efetua a simulacao port = 8089; Simulacao simulacao = SimulacaoDataFactory.criaNovaSimulacao(); given(). contentType(ContentType.JSON). body(simulacao). when(). post("/simulacoes"). then(). statusCode(201); }
  • 35. aceitação @Test(groups = {"aceitacao"}) public void realizaSimulacaoCredito() { baseURI = "http://localhost"; port = 8088; basePath = "/api/v1"; String cpf = "12345678901"; // efetua a verificacao de cpf restrito given(). pathParam("cpf", cpf). when(). get("/restricoes/{cpf}"). then(). statusCode(204); // efetua a simulacao port = 8089; Simulacao simulacao = SimulacaoDataFactory.criaNovaSimulacao(); given(). contentType(ContentType.JSON). body(simulacao). when(). post("/simulacoes"). then(). statusCode(201); } requisição de consulta restrição
  • 36. aceitação @Test(groups = {"aceitacao"}) public void realizaSimulacaoCredito() { baseURI = "http://localhost"; port = 8088; basePath = "/api/v1"; String cpf = "12345678901"; // efetua a verificacao de cpf restrito given(). pathParam("cpf", cpf). when(). get("/restricoes/{cpf}"). then(). statusCode(204); // efetua a simulacao port = 8089; Simulacao simulacao = SimulacaoDataFactory.criaNovaSimulacao(); given(). contentType(ContentType.JSON). body(simulacao). when(). post("/simulacoes"). then(). statusCode(201); } requisição de simulação de crédito