Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

De a máxima cobertura nos seus testes de API

Palestra ministrada no Reginonal Scrum Gathering Rio 2019 no dia 27/06/2019 sobre como dar uma cobertura de testes para uma API além do teste unitário e de integração, com um foco totalmente prático e com execução em pipeline.

De a máxima cobertura nos seus testes de API

  1. 1. DÊ A MÁXIMA COBERTURA NOS SEUS TESTES DE API ELIAS NOGUEIRA @eliasnogueira
  2. 2. Conceituação
  3. 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. 4. SUT – System Under Test | Front-end Informar um CPF: • válido • que não esteja com restrição • não cadastrado
  5. 5. SUT – System Under Test | Front-end Efetuar o cadastro respeitando as restrições
  6. 6. SUT – System Under Test | Front-end Efetuar operações de CRUD
  7. 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
  8. 8. 1. Entender a documentação da API
  9. 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. 10. 2. Pensar nos testes com uma divisão de pipeline
  11. 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
  12. 12. 3. Criar uma versão inicial da arquitetura
  13. 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. 14. Modelo 2 Projeto único para todas as APIs Como serão os projetos de teste? BACKEND TEST PROEJTO TESTE
  15. 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. 16. 4. Criar testes e definir as suítes de teste
  17. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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
  37. 37. Obrigado! @eliasnogueira github.com/eliasnogueira

×