SlideShare uma empresa Scribd logo
1 de 63
Baixar para ler offline
GraphQL e APIs:
como manter a
qualidade?
Olar!
Sou a Mai!
22, deva backend na
testes ● microsservices ● graphQL
girl power ● go vegan
/maiarar /maiarrod
2
3
Antes de ir para
a apresentação,
Vamos alinhar certos conceitos e
ferramentas!
1.
APIs
Entendendo melhor esse mundo
4
API? É de comer?
5
Interface de Programação de
Aplicações
◆ Interface de integração
◆ “Cola digital” entre duas pontas
◆ Retorna infos do sistema
◆ Quem consome não precisa
saber detalhes
Coisas legais a se considerar
6
URI - Uniform Resource Identifier
https://dev.empresa.com/api-especifica/recurso
Coisas legais a se considerar
7
URI - Uniform Resource Identifier
https://dev.empresa.com/api-especifica/recurso
protocolo
Coisas legais a se considerar
8
URI - Uniform Resource Identifier
https://dev.empresa.com/api-especifica/recurso
a empresa
Coisas legais a se considerar
9
URI - Uniform Resource Identifier
https://dev.empresa.com/api-especifica/recurso
nome da API
Coisas legais a se considerar
10
URI - Uniform Resource Identifier
https://dev.empresa.com/api-especifica/recurso
recursos e
parâmetros
Coisas legais a se considerar
11
URI - Uniform Resource Identifier
https://dev.empresa.com/api-especifica/recurso
protocolo a empresa nome da API recursos e
parâmetros
12
API USUÁRIO API LOGIN
https://empresa.com/usuario/ https://empresa.com/login/
Coisas legais a se considerar
13
JSON
◆ Formatação de troca
de dados
◆ .json
◆ Tem essa carinha →
{
"id": 01,
"nome": "Fulaninha da Silva",
"telefones": [
{
"id": 01,
"contexto": "Casa",
"valor": "+551131133113"
},
{
"id": 02,
"contexto": "Celular",
"valor": "+5511981172662"
}
]
}
14
API USUÁRIO API LOGIN
https://empresa.com/usuario/ https://empresa.com/login/
json
E como é padronizado?
15
Com o REST!
◆ Transferência de Estado
Representacional
◆ Abstração do HTTP
◆ RESTful: quem aplica os padrões
REST
◆ Verbos
Os verbos
16
◆ Realizam ações em
determinado recurso
◆ Mais usados são:
◆ GET: busca
◆ POST: salva
◆ PUT: atualiza
◆ DELETE: remove
2.
GraphQL
“A query language for your API”
17
18
GraphQL:
O que é?
Pra quê serve?
Onde é usado?
Como é usado?
HOJE, NO QA Ladies!
O que é?
19
◆ Linguagem de consulta
(grafos)
◆ Flexível e intuitiva
◆ Origem: problemas com
REST
◆ Client-side
◆ Único recurso: /graphql
Diferenças com o REST
20
Recursos principais
21
◆ Queries: consultas
◆ Mutations: alterações
◆ Schema: como será cada objeto (types)
◆ E muuuito mais coisas!
https://developer.github.com/v4/explorer/
Queries
22
#simples
query {
posts
}
#filtros
query {
posts(userId: 3)
}
#mais níveis
query {
posts {
curtidas{
numero
}
comentarios{
numero
}
}
}
#resposta
{
"data": {
"posts": {
"curtidas": {
"numero": 5
},
"comentarios": {
"numero": 3
}
}
}
}
Mutations
23
#mutation exemplo
mutation CriarComentario(
valor: "Linda da tia! Beijos",
elementoComentado: 1223
){
comentario {
valor
elementoComentado {
curtidas {
numero
}
}
}
}
Mutations
24
#mutation exemplo
mutation CriarComentario(
valor: "Linda da tia! Beijos",
elementoComentado: 1223
){
comentario {
valor
elementoComentado {
curtidas {
numero
}
}
}
}
O que será salvo
Mutations
25
#mutation exemplo
mutation CriarComentario(
valor: "Linda da tia! Beijos",
elementoComentado: 1223
){
comentario {
valor
elementoComentado {
curtidas {
numero
}
}
}
}
O que quero de
retorno
Mutations
26
#mutation exemplo
mutation CriarComentario(
valor: "Linda da tia! Beijos",
elementoComentado: 1223
){
comentario {
valor
elementoComentado {
curtidas {
numero
}
}
}
}
#resposta
{
"data": {
"comentario": {
“valor": “Linda da tia! Beijos”
"elementoComentado": {
"curtidas": {
"numero": 30
}
}
}
}
}
Mutations
27
#mutation exemplo
mutation CriarComentario(
valor: "Linda da tia! Beijos",
elementoComentado: 1223
){
comentario {
valor
elementoComentado {
curtidas {
numero
}
}
}
}
#resposta
{
"data": {
"comentario": {
“valor": “Linda da tia! Beijos”
"elementoComentado": {
"curtidas": {
"numero": 30
}
}
}
}
}
Mutations
28
#mutation exemplo
mutation CriarComentario(
valor: "Linda da tia! Beijos",
elementoComentado: 1223
){
comentario {
valor
elementoComentado {
curtidas {
numero
}
}
}
}
#resposta
{
"data": {
"comentario": {
“valor": “Linda da tia! Beijos”
"elementoComentado": {
"curtidas": {
"numero": 30
}
}
}
}
}
Mutations
29
#mutation exemplo
mutation CriarComentario(
valor: "Linda da tia! Beijos",
elementoComentado: 1223
){
comentario {
valor
elementoComentado {
curtidas {
numero
}
}
}
}
#resposta
{
"data": {
"comentario": {
“valor": “Linda da tia! Beijos”
"elementoComentado": {
"curtidas": {
"numero": 30
}
}
}
}
}
Mas então,
Como fica a
arquitetura
GraphQL + APIs?30
Arquitetura
31
User Order
Other ServicesWeb App Mobile App
LoginNotification ProductShipping Token
E pra manter a qualidade disso tudo?
32
Relembrando...
33
MS
Relembrando...
34
{
{
Testes manuais buscando
comportamentos indesejados {
Testes para cada unidade
de código fonte
{
Comunicação entre
componentes (defeitos em
interfaces)
{Comportamento de uma
API
Regras de negócio
externas
Necessário pelo menos...
35
◆ Cucumber: BDD/End-to-end
◆ JUnit/Jasmine: unitários
◆ Postman/Insomnia: testes de
integração
Necessário pelo menos...
36
◆ Cucumber: BDD/End-to-end
◆ JUnit/Jasmine: unitários
◆ Postman/Insomnia: testes de
integração
Vamos falar
bastante desse
cara!
O que é Cucumber?
Framework que suporta
Desenvolvimento
Orientado por
Comportamento -
Behavior Driven
Development (BDD).
37
O que é Cucumber?
◆ Muitas, mas muitas
implementações (23)
◆ Ideal para a automação
https://docs.cucumber.io/
38
Como o Cucumber trabalha?
1. Gherkin → onde existirá
o “texto” igualzinho
semelhante ao Cenário
de Teste
2. Step Definitions → onde
esse “texto” irá ser
quebrado em functions
e assim ser codificado
39
Gherkin
Step
Definitions
Cucumber
{
CTs
Falando mais do Gherkin
◆ BusinessReadableDSL
◆ Documentação do
projeto
◆ Testes automatizados
40
41
cenario-teste-matematico.feature#Esse é um cenário de exemplo.
@Tag_cenario_exemplo @Tag_outro_exemplo
Feature: Cenário de Teste Matemático
Esse cenário de teste tem como objetivo realizar as
validações de uma soma e de multiplicações.
Scenario: Realização de uma soma simples
Given que eu tenho uma variável com o valor numérico 1
When eu incremento o valor desta variável com mais 1
Then o valor da variável passa a ser 2
Scenario Outline: Realização de uma expressão simples
Given que eu tenho uma variável com o valor numérico
<numeroA>
When eu multiplico o valor desta variável com pelo
valor numérico <numeroB>
And adiciono o número <numeroC>
Then o valor da variável multiplicada passa a ser
<resultado>
Examples:
| numeroA | numeroB | numeroC | resultado |
| 1 | 2 | 2 | 4 |
| 3 | 4 | 5 | 17 |
◆ Feature → “nome” daquele conjunto
de cenários de teste
◆ Scenario → Cenário de Teste
◆ Given, When, Then → palavras
reservadas para instruções (dado,
quando, então)
◆ And → quando existirá mais
algum passo dentro daquela
instrução
◆ Scenario Outline → quando o
cenário terá algumas variáveis
◆ Examples → exemplos que
serão substituídos no cenário
de teste
42
Examples:
| numeroA | numeroB | numeroC | resultado |
| 1 | 2 | 2 | 4 |
| 3 | 4 | 5 | 17 |
Examples
Scenario Outline: Realização de uma expressão simples
Given que eu tenho uma variável com o valor numérico
<numeroA>
When eu multiplico o valor desta variável com pelo
valor numérico <numeroB>
And adiciono o número <numeroC>
Then o valor da variável multiplicada passa a ser
<resultado>
Outline
Scenario Outline: Realização de uma expressão
simples
Given que eu tenho uma variável com o valor
numérico 1
When eu multiplico o valor desta variável com
pelo valor numérico 2
And adiciono o número 2
Then o valor da variável multiplicada passa a ser
4
1ª iteração
Scenario Outline: Realização de uma expressão
simples
Given que eu tenho uma variável com o valor
numérico 3
When eu multiplico o valor desta variável com
pelo valor numérico 4
And adiciono o número 5
Then o valor da variável multiplicada passa a ser
17
2ª iteração
43
valida-acesso-pedidos.feature#Esse é outro cenário de exemplo.
@tag_pagina_pedidos @tag_usuario_comum
Feature: Acesso à página de pedidos
Esse cenário de teste tem como objetivo realizar as validações para
acesso à página de pedidos.
Background: Login realizado
Given que eu tenha realizado um cadastro no sistema
@Ter_pedidos_no_carrinho
Scenario: Acesso à página de pedidos com itens no carrinho
Given que eu esteja na tela inicial do sistema
When eu clico no botão de "pedidos"
Then é retornada a página de pedidos contendo meus pedidos
@Carrinho_vazio
Scenario: Acesso à página de pedidos sem itens no carrinho
Given que eu esteja na tela inicial do sistema
When eu clico no botão de "pedidos"
Then é retornada a página de pedidos informando que "não existem
pedidos registrados"
@Ter_pedidos_no_carrinho
Scenario: Acesso à página de pedidos após login ter expirado
Given que eu esteja na tela inicial do sistema
When eu clico no botão de "pedidos"
But meu token de acesso expirou
Then é retornada uma página informando que "é preciso estar logado para
visualizar os pedidos"
◆ Background → cenário
prévio necessário apenas
para a feature
◆ É possível haverem @tags
em cenário
◆ But → “exceção” dentre os
passos do cenário
44
#Esse é outro cenário de exemplo.
@Tag_criacao_usuarios
Feature: Criação de Usuários no sistema
Esse cenário de teste tem como objetivo realizar as validações para Criação de
Usuários no sistema.
Scenario: Exibição de cenário de erro ao tentar criar um novo usuário sem cadastrar
e-mail
Given que eu esteja logada no sistema
And que eu tenha autorização para criar usuários no sistema
When eu preencho o campo de "Nome" com "Nome Exemplo"
And eu preencho o campo de "Idade" com 22
And eu preencho o campo de "Estado Civil" com "Solteiro"
And eu preencho o campo de "Endereço" com "Rua Exemplo, 333 - Campinas, SP, Brasil"
And eu preencho o campo de "Por onde nos conheceu" com "Texto Exemplo"
And eu preencho o campo de "Algum campo específico demais" com "Valor de exemplo
específico demais"
But eu não preencho o campo "e-mail"
And eu clico no botão "criar"
Then eu recebo uma mensagem de erro informando que "campos obrigatórios não
preenchidos"
Scenario: Exibição de cenário de erro ao tentar criar um novo usuário sem cadastrar
Nome
Given que eu esteja logada no sistema
And que eu tenha autorização para criar usuários no sistema
When eu preencho o campo de "e-mail" com "email@provedor.com"
And eu preencho o campo de "Idade" com 22
And eu preencho o campo de "Estado Civil" com "Solteiro"
And eu preencho o campo de "Endereço" com "Rua Exemplo, 333 - Campinas, SP, Brasil"
And eu preencho o campo de "Por onde nos conheceu" com "Texto Exemplo"
And eu preencho o campo de "Algum campo específico demais" com "Valor de exemplo
específico demais"
But eu não preencho o campo "Nome"
And eu clico no botão "criar"
Then eu recebo uma mensagem de erro informando que "campos obrigatórios não
preenchidos"
+ declarativo, - imperativo
#Esse é outro cenário de exemplo.
@Tag_criacao_usuarios
Feature: Criação de Usuários no sistema
Esse cenário de teste tem como objetivo realizar as
validações para Criação de Usuários no sistema.
Scenario: Exibição de cenário de erro ao tentar criar um
novo usuário sem cadastrar e-mail
Given que eu esteja logada no sistema
And que eu tenha autorização para criar usuários no sistema
When eu preencho os campos obrigatórios
But eu não preencho o campo "e-mail"
And eu clico no botão "criar"
Then eu recebo uma mensagem de erro informando que "campos
obrigatórios não preenchidos"
Scenario: Exibição de cenário de erro ao tentar criar um
novo usuário sem cadastrar Nome
Given que eu esteja logada no sistema
And que eu tenha autorização para criar usuários no sistema
When eu preencho os campos obrigatórios
But eu não preencho o campo "Nome"
And eu clico no botão "criar"
Then eu recebo uma mensagem de erro informando que "campos
obrigatórios não preenchidos"
45
Mas cuidado...
#Esse é outro cenário de exemplo, mas zoado.
@Tag_login_usuarios
Feature: Login de Usuários no sistema
Esse cenário de teste tem como objetivo
realizar as validações para Login de Usuários
no sistema.
Scenario: Exibição de mensagem de sucesso ao
criar um novo usuário
Given Eu queira me cadastrar no sistema
When Eu faço o cadastro
Then Eu vejo a mensagem de sucesso
◆ Muito vago
◆ Inútil para servir de
documentação
Mas e pra codar
esse textão?
46
47
Step Definitions!
Temos os
const { Given, When, Then } = require('cucumber');
const assert = require('assert');
//Realização de uma soma simples
Given('que eu tenho uma variável com o valor numérico {int}', (firstnumero)
=> {
this.number = firstNumber;
})
When('eu incremento o valor desta variável com mais {int}', (newNumber) =>
{
this.number = (this.number) + newNumber
})
Then('o valor da variável passa a ser {int}', (result) => {
assert(this.number,result);
})
//Realização de uma expressão simples
When('eu multiplico o valor desta variável com pelo valor numérico {int}',
(newNumber) => {
this.number = (this.number) * newNumber
})
Given('adiciono o número {int}', function and(numberC) {
this.number += numberC;
});
Then('o valor da variável multiplicada passa a ser {int}', (result) => {
assert(this.number,result);
})
cenario-teste-matematico.js
48
cenario-teste-matematico.js
Libs básicas:
◆ cucumber
◆ assert
◆ joi e joi-assert (mock)
“Como assim this.number? Onde
tá essa variável?”
◆ variável no contexto
const { Given, When, Then } = require('cucumber');
const assert = require('assert');
//Realização de uma soma simples
Given('que eu tenho uma variável com o valor numérico {int}', (firstNumber)
=> {
this.number = firstNumber;
})
When('eu incremento o valor desta variável com mais {int}', (newNumber) =>
{
this.number = (this.number) + newNumber
})
Then('o valor da variável passa a ser {int}', (result) => {
assert(this.number,result);
})
//Realização de uma expressão simples
When('eu multiplico o valor desta variável com pelo valor numérico {int}',
(newNumber) => {
this.number = (this.number) * newNumber
})
Given('adiciono o número {int}', function and(numberC) {
this.number += numberC;
});
Then('o valor da variável multiplicada passa a ser {int}', (result) => {
assert(this.number,result);
})
49
const { Given, When, Then } = require('cucumber');
const assert = require('assert');
//Realização de uma soma simples
Given('que eu tenho uma variável com o valor numérico {int}',
(firstNumber) => {
this.number = firstNumber;
})
When('eu incremento o valor desta variável com mais {int}', (newNumber) =>
{
this.number = (this.number) + newNumber
})
Then('o valor da variável passa a ser {int}', (result) => {
assert(this.number,result);
})
//Realização de uma expressão simples
When('eu multiplico o valor desta variável com pelo valor numérico {int}',
(newNumber) => {
this.number = (this.number) * newNumber
})
Given('adiciono o número {int}', function and(numberC) {
this.number += numberC;
});
Then('o valor da variável multiplicada passa a ser {int}', (result) => {
assert(this.number,result);
})
#Esse é um cenário de exemplo.
@Tag_cenario_exemplo
Feature: Cenário de Teste Matemático
Esse cenário de teste tem como objetivo realizar as
validações de uma soma e de multiplicações.
Scenario: Realização de uma soma simples
Given que eu tenho uma variável com o valor numérico 1
When eu incremento o valor desta variável com mais 1
Then o valor da variável passa a ser 2
Scenario Outline: Realização de uma expressão simples
Given que eu tenho uma variável com o valor numérico
<numeroA>
When eu multiplico o valor desta variável com pelo valor
numérico <numeroB>
And adiciono o número <numeroC>
Then o valor da variável multiplicada passa a ser
<resultado>
Examples:
| numeroA | numeroB | numeroC | resultado |
| 1 | 2 | 2 | 4 |
| 3 | 4 | 5 | 17 |
cenario-teste-matematico.feature
cenario-teste-matematico.js
50
const { Given, When, Then } = require('cucumber');
const assert = require('assert');
//Realização de uma soma simples
Given('que eu tenho uma variável com o valor numérico {int}',
(firstNumber) => {
this.number = firstNumber;
})
When('eu incremento o valor desta variável com mais {int}', (newNumber) =>
{
this.number = (this.number) + newNumber
})
Then('o valor da variável passa a ser {int}', (result) => {
assert(this.number,result);
})
//Realização de uma expressão simples
When('eu multiplico o valor desta variável com pelo valor numérico {int}',
(newNumber) => {
this.number = (this.number) * newNumber
})
Given('adiciono o número {int}', function and(numberC) {
this.number += numberC;
});
Then('o valor da variável multiplicada passa a ser {int}', (result) => {
assert(this.number,result);
})
#Esse é um cenário de exemplo.
@Tag_cenario_exemplo
Feature: Cenário de Teste Matemático
Esse cenário de teste tem como objetivo realizar as
validações de uma soma e de multiplicações.
Scenario: Realização de uma soma simples
Given que eu tenho uma variável com o valor numérico 1
When eu incremento o valor desta variável com mais 1
Then o valor da variável passa a ser 2
Scenario Outline: Realização de uma expressão simples
Given que eu tenho uma variável com o valor numérico
<numeroA>
When eu multiplico o valor desta variável com pelo valor
numérico <numeroB>
And adiciono o número <numeroC>
Then o valor da variável multiplicada passa a ser
<resultado>
Examples:
| numeroA | numeroB | numeroC | resultado |
| 1 | 2 | 2 | 4 |
| 3 | 4 | 5 | 17 |
cenario-teste-matematico.feature
cenario-teste-matematico.js
51
const { Given, When, Then } = require('cucumber');
const assert = require('assert');
//Realização de uma soma simples
Given('que eu tenho uma variável com o valor numérico {int}',
(firstNumber) => {
this.number = firstNumber;
})
When('eu incremento o valor desta variável com mais {int}', (newNumber) =>
{
this.number = (this.number) + newNumber
})
Then('o valor da variável passa a ser {int}', (result) => {
assert(this.number,result);
})
//Realização de uma expressão simples
When('eu multiplico o valor desta variável com pelo valor numérico {int}',
(newNumber) => {
this.number = (this.number) * newNumber
})
Given('adiciono o número {int}', function and(numberC) {
this.number += numberC;
});
Then('o valor da variável multiplicada passa a ser {int}', (result) => {
assert(this.number,result);
})
#Esse é um cenário de exemplo.
@Tag_cenario_exemplo
Feature: Cenário de Teste Matemático
Esse cenário de teste tem como objetivo realizar as
validações de uma soma e de multiplicações.
Scenario: Realização de uma soma simples
Given que eu tenho uma variável com o valor numérico 1
When eu incremento o valor desta variável com mais 1
Then o valor da variável passa a ser 2
Scenario Outline: Realização de uma expressão simples
Given que eu tenho uma variável com o valor numérico
<numeroA>
When eu multiplico o valor desta variável com pelo valor
numérico <numeroB>
And adiciono o número <numeroC>
Then o valor da variável multiplicada passa a ser
<resultado>
Examples:
| numeroA | numeroB | numeroC | resultado |
| 1 | 2 | 2 | 4 |
| 3 | 4 | 5 | 17 |
cenario-teste-matematico.feature
cenario-teste-matematico.js
52
const { Given, When, Then } = require('cucumber');
const assert = require('assert');
//Realização de uma soma simples
Given('que eu tenho uma variável com o valor numérico {int}',
(firstNumber) => {
this.number = firstNumber;
})
When('eu incremento o valor desta variável com mais {int}', (newNumber) =>
{
this.number = (this.number) + newNumber
})
Then('o valor da variável passa a ser {int}', (result) => {
assert(this.number,result);
})
//Realização de uma expressão simples
When('eu multiplico o valor desta variável com pelo valor numérico {int}',
(newNumber) => {
this.number = (this.number) * newNumber
})
Given('adiciono o número {int}', function and(numberC) {
this.number += numberC;
});
Then('o valor da variável multiplicada passa a ser {int}', (result) => {
assert(this.number,result);
})
#Esse é um cenário de exemplo.
@Tag_cenario_exemplo
Feature: Cenário de Teste Matemático
Esse cenário de teste tem como objetivo realizar as
validações de uma soma e de multiplicações.
Scenario: Realização de uma soma simples
Given que eu tenho uma variável com o valor numérico 1
When eu incremento o valor desta variável com mais 1
Then o valor da variável passa a ser 2
Scenario Outline: Realização de uma expressão simples
Given que eu tenho uma variável com o valor numérico
<numeroA>
When eu multiplico o valor desta variável com pelo valor
numérico <numeroB>
And adiciono o número <numeroC>
Then o valor da variável multiplicada passa a ser
<resultado>
Examples:
| numeroA | numeroB | numeroC | resultado |
| 1 | 2 | 2 | 4 |
| 3 | 4 | 5 | 17 |
cenario-teste-matematico.feature
cenario-teste-matematico.js
53
const { Given, When, Then } = require('cucumber');
const assert = require('assert');
//Realização de uma soma simples
Given('que eu tenho uma variável com o valor numérico {int}',
(firstNumber) => {
this.number = firstNumber;
})
When('eu incremento o valor desta variável com mais {int}', (newNumber) =>
{
this.number = (this.number) + newNumber
})
Then('o valor da variável passa a ser {int}', (result) => {
assert(this.number,result);
})
//Realização de uma expressão simples
When('eu multiplico o valor desta variável com pelo valor numérico {int}',
(newNumber) => {
this.number = (this.number) * newNumber
})
Given('adiciono o número {int}', function and(numberC) {
this.number += numberC;
});
Then('o valor da variável multiplicada passa a ser {int}', (result) => {
assert(this.number,result);
})
#Esse é um cenário de exemplo.
@Tag_cenario_exemplo
Feature: Cenário de Teste Matemático
Esse cenário de teste tem como objetivo realizar as
validações de uma soma e de multiplicações.
Scenario: Realização de uma soma simples
Given que eu tenho uma variável com o valor numérico 1
When eu incremento o valor desta variável com mais 1
Then o valor da variável passa a ser 2
Scenario Outline: Realização de uma expressão simples
Given que eu tenho uma variável com o valor numérico
<numeroA>
When eu multiplico o valor desta variável com pelo valor
numérico <numeroB>
And adiciono o número <numeroC>
Then o valor da variável multiplicada passa a ser
<resultado>
Examples:
| numeroA | numeroB | numeroC | resultado |
| 1 | 2 | 2 | 4 |
| 3 | 4 | 5 | 17 |
cenario-teste-matematico.feature
cenario-teste-matematico.js
54
const { Given, When, Then } = require('cucumber');
const assert = require('assert');
//Realização de uma soma simples
Given('que eu tenho uma variável com o valor numérico {int}',
(firstNumber) => {
this.number = firstNumber;
})
When('eu incremento o valor desta variável com mais {int}', (newNumber) =>
{
this.number = (this.number) + newNumber
})
Then('o valor da variável passa a ser {int}', (result) => {
assert(this.number,result);
})
//Realização de uma expressão simples
When('eu multiplico o valor desta variável com pelo valor numérico {int}',
(newNumber) => {
this.number = (this.number) * newNumber
})
Given('adiciono o número {int}', function and(numberC) {
this.number += numberC;
});
Then('o valor da variável multiplicada passa a ser {int}', (result) => {
assert(this.number,result);
})
#Esse é um cenário de exemplo.
@Tag_cenario_exemplo
Feature: Cenário de Teste Matemático
Esse cenário de teste tem como objetivo realizar as
validações de uma soma e de multiplicações.
Scenario: Realização de uma soma simples
Given que eu tenho uma variável com o valor numérico 1
When eu incremento o valor desta variável com mais 1
Then o valor da variável passa a ser 2
Scenario Outline: Realização de uma expressão simples
Given que eu tenho uma variável com o valor numérico
<numeroA>
When eu multiplico o valor desta variável com pelo valor
numérico <numeroB>
And adiciono o número <numeroC>
Then o valor da variável multiplicada passa a ser
<resultado>
Examples:
| numeroA | numeroB | numeroC | resultado |
| 1 | 2 | 2 | 4 |
| 3 | 4 | 5 | 17 |
cenario-teste-matematico.feature
cenario-teste-matematico.js
55
const { Given, When, Then } = require('cucumber');
const assert = require('assert');
//Realização de uma soma simples
Given('que eu tenho uma variável com o valor numérico {int}',
(firstNumber) => {
this.number = firstNumber;
})
When('eu incremento o valor desta variável com mais {int}', (newNumber) =>
{
this.number = (this.number) + newNumber
})
Then('o valor da variável passa a ser {int}', (result) => {
assert(this.number,result);
})
//Realização de uma expressão simples
When('eu multiplico o valor desta variável com pelo valor numérico {int}',
(newNumber) => {
this.number = (this.number) * newNumber
})
Given('adiciono o número {int}', function and(numberC) {
this.number += numberC;
});
Then('o valor da variável multiplicada passa a ser {int}', (result) => {
assert(this.number,result);
})
#Esse é um cenário de exemplo.
@Tag_cenario_exemplo
Feature: Cenário de Teste Matemático
Esse cenário de teste tem como objetivo realizar as
validações de uma soma e de multiplicações.
Scenario: Realização de uma soma simples
Given que eu tenho uma variável com o valor numérico 1
When eu incremento o valor desta variável com mais 1
Then o valor da variável passa a ser 2
Scenario Outline: Realização de uma expressão simples
Given que eu tenho uma variável com o valor numérico
<numeroA>
When eu multiplico o valor desta variável com pelo valor
numérico <numeroB>
And adiciono o número <numeroC>
Then o valor da variável multiplicada passa a ser
<resultado>
Examples:
| numeroA | numeroB | numeroC | resultado |
| 1 | 2 | 2 | 4 |
| 3 | 4 | 5 | 17 |
cenario-teste-matematico.feature
cenario-teste-matematico.js
Testes de criação de usuário
◆ Banco não-exclusivo pros testes
◆ Pré-requisito? Username não ter
sido criado ainda
◆ Como garanto? Verificando no
banco se o username já existe
→ todo teste precisa disso
◆ Faz parte do cenário de teste esse
pré-requisito?
Agora imaginem...
56
Tem como se
colocar passos
antes e depois de
todos os testes?
57
Claro! Temos o
arquivo
HOOKS!
58
59
hooks.js
Imports básicos
◆ Before
◆ BeforeAll
◆ After
◆ AfterAll
var {After, Before, BeforeAll, AfterAll} =
require('cucumber');
BeforeAll(function () {
// Será realizado antes de todos os cenários
});
Before({tags: "@foo"}, function () {
// Será realizado antes de cenários com a tag @foo
});
AfterAll(function () {
// Será realizado depois de todos os cenários
});
After({tags: "@foo"}, function () {
// Será realizado depois de cenários com a tag @foo
});
E o que colocar no before e no after?
60
After/AfterAll
◆ Preparação de base
(deleção/desassociação
de registros)
◆ Pós-requisito que não
faz parte do escopo do
cenário de teste
Before/BeforeAll
◆ Preparação de base
◆ Credenciais de
acesso
◆ Pré-requisito que não
faz parte do escopo
do cenário de teste
61
Gherkin
Step
Definitions
Cucumber
{
CTs
@tags
hooks
E é isso!
Alguma dúvida?
Algum questionamento?
62
(finjam que não dormiram )
63
Let’s Code!
“Talk is cheap. Show me the code!”

Mais conteúdo relacionado

Mais procurados

Hybrid cloud overview and VCF on VxRAIL
Hybrid cloud overview and VCF on VxRAILHybrid cloud overview and VCF on VxRAIL
Hybrid cloud overview and VCF on VxRAILDavid Pasek
 
MongoDB Days Silicon Valley: Using MongoDB with Adobe AEM Communities
MongoDB Days Silicon Valley: Using MongoDB with Adobe AEM CommunitiesMongoDB Days Silicon Valley: Using MongoDB with Adobe AEM Communities
MongoDB Days Silicon Valley: Using MongoDB with Adobe AEM CommunitiesMongoDB
 
Introduction to SDN, NFV & Edge Computing
Introduction to SDN, NFV & Edge ComputingIntroduction to SDN, NFV & Edge Computing
Introduction to SDN, NFV & Edge ComputingShahjahansirat
 
Server virtualization by VMWare
Server virtualization by VMWareServer virtualization by VMWare
Server virtualization by VMWaresgurnam73
 
Tadx - Présentation Conteneurisation
Tadx -  Présentation ConteneurisationTadx -  Présentation Conteneurisation
Tadx - Présentation ConteneurisationTADx
 
Building a Stretched Cluster using Virtual SAN 6.1
Building a Stretched Cluster using Virtual SAN 6.1Building a Stretched Cluster using Virtual SAN 6.1
Building a Stretched Cluster using Virtual SAN 6.1Duncan Epping
 

Mais procurados (8)

Hybrid cloud overview and VCF on VxRAIL
Hybrid cloud overview and VCF on VxRAILHybrid cloud overview and VCF on VxRAIL
Hybrid cloud overview and VCF on VxRAIL
 
MongoDB Days Silicon Valley: Using MongoDB with Adobe AEM Communities
MongoDB Days Silicon Valley: Using MongoDB with Adobe AEM CommunitiesMongoDB Days Silicon Valley: Using MongoDB with Adobe AEM Communities
MongoDB Days Silicon Valley: Using MongoDB with Adobe AEM Communities
 
Introduction to SDN, NFV & Edge Computing
Introduction to SDN, NFV & Edge ComputingIntroduction to SDN, NFV & Edge Computing
Introduction to SDN, NFV & Edge Computing
 
Server virtualization by VMWare
Server virtualization by VMWareServer virtualization by VMWare
Server virtualization by VMWare
 
Tadx - Présentation Conteneurisation
Tadx -  Présentation ConteneurisationTadx -  Présentation Conteneurisation
Tadx - Présentation Conteneurisation
 
Docker
DockerDocker
Docker
 
Building a Stretched Cluster using Virtual SAN 6.1
Building a Stretched Cluster using Virtual SAN 6.1Building a Stretched Cluster using Virtual SAN 6.1
Building a Stretched Cluster using Virtual SAN 6.1
 
Virtualisation
VirtualisationVirtualisation
Virtualisation
 

Semelhante a GraphQL e APIs: como manter a qualidade

T08_T09_LM3: Estruturas de repetição (2013-2014)
T08_T09_LM3: Estruturas de repetição (2013-2014)T08_T09_LM3: Estruturas de repetição (2013-2014)
T08_T09_LM3: Estruturas de repetição (2013-2014)Carlos Santos
 
C#4 - Parte 2 - COM interop e variância
C#4 - Parte 2 - COM interop e variânciaC#4 - Parte 2 - COM interop e variância
C#4 - Parte 2 - COM interop e variânciaGiovanni Bassi
 
Programação Web com PHP 7.x
Programação Web com PHP 7.xProgramação Web com PHP 7.x
Programação Web com PHP 7.xNorton Guimarães
 
Introdução à análise orientada a objetos parte 1
Introdução à análise orientada a objetos parte 1Introdução à análise orientada a objetos parte 1
Introdução à análise orientada a objetos parte 1ariovaldodias
 
Introdução à análise orientada a objetos parte 1
Introdução à análise orientada a objetos parte 1Introdução à análise orientada a objetos parte 1
Introdução à análise orientada a objetos parte 1ariovaldodias
 
Testes automatizados
Testes automatizadosTestes automatizados
Testes automatizadosRodrigo Maia
 
LabMM3 - Aula teórica 07
LabMM3 - Aula teórica 07LabMM3 - Aula teórica 07
LabMM3 - Aula teórica 07Carlos Santos
 
Tutorial visão automação de testes e casper js
Tutorial visão automação de testes e casper jsTutorial visão automação de testes e casper js
Tutorial visão automação de testes e casper js4ALL Tests
 
Tutorial - Visão sobre Automação de Testes com CasperJS
Tutorial - Visão sobre Automação de Testes com CasperJSTutorial - Visão sobre Automação de Testes com CasperJS
Tutorial - Visão sobre Automação de Testes com CasperJSFrederico Allan
 
Testes com python: como fazer uma refatoração segura
Testes com python: como fazer uma refatoração seguraTestes com python: como fazer uma refatoração segura
Testes com python: como fazer uma refatoração seguraValberto Carneiro
 
Workshop Ruby on Rails dia 2 ruby-pt
Workshop Ruby on Rails dia 2  ruby-ptWorkshop Ruby on Rails dia 2  ruby-pt
Workshop Ruby on Rails dia 2 ruby-ptPedro Sousa
 
Testes automatizados com alto valor de negócio e baixo custo de manutenção
Testes automatizados com alto valor de negócio e baixo custo de manutençãoTestes automatizados com alto valor de negócio e baixo custo de manutenção
Testes automatizados com alto valor de negócio e baixo custo de manutençãoTaise Dias da Silva
 
(A09) LabMM3 - JavaScript - Estruturas de repetição
(A09) LabMM3 - JavaScript - Estruturas de repetição(A09) LabMM3 - JavaScript - Estruturas de repetição
(A09) LabMM3 - JavaScript - Estruturas de repetiçãoCarlos Santos
 
Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.Alex Guido
 

Semelhante a GraphQL e APIs: como manter a qualidade (20)

T08_T09_LM3: Estruturas de repetição (2013-2014)
T08_T09_LM3: Estruturas de repetição (2013-2014)T08_T09_LM3: Estruturas de repetição (2013-2014)
T08_T09_LM3: Estruturas de repetição (2013-2014)
 
C#4 - Parte 2 - COM interop e variância
C#4 - Parte 2 - COM interop e variânciaC#4 - Parte 2 - COM interop e variância
C#4 - Parte 2 - COM interop e variância
 
C# 4.0
C# 4.0C# 4.0
C# 4.0
 
Programação Web com PHP 7.x
Programação Web com PHP 7.xProgramação Web com PHP 7.x
Programação Web com PHP 7.x
 
Refactoring - Design no Código
Refactoring - Design no CódigoRefactoring - Design no Código
Refactoring - Design no Código
 
Desafio Rest API
Desafio Rest APIDesafio Rest API
Desafio Rest API
 
Introdução à análise orientada a objetos parte 1
Introdução à análise orientada a objetos parte 1Introdução à análise orientada a objetos parte 1
Introdução à análise orientada a objetos parte 1
 
Introdução à análise orientada a objetos parte 1
Introdução à análise orientada a objetos parte 1Introdução à análise orientada a objetos parte 1
Introdução à análise orientada a objetos parte 1
 
Testes automatizados
Testes automatizadosTestes automatizados
Testes automatizados
 
LabMM3 - Aula teórica 07
LabMM3 - Aula teórica 07LabMM3 - Aula teórica 07
LabMM3 - Aula teórica 07
 
Tutorial visão automação de testes e casper js
Tutorial visão automação de testes e casper jsTutorial visão automação de testes e casper js
Tutorial visão automação de testes e casper js
 
Tutorial - Visão sobre Automação de Testes com CasperJS
Tutorial - Visão sobre Automação de Testes com CasperJSTutorial - Visão sobre Automação de Testes com CasperJS
Tutorial - Visão sobre Automação de Testes com CasperJS
 
Testes com python: como fazer uma refatoração segura
Testes com python: como fazer uma refatoração seguraTestes com python: como fazer uma refatoração segura
Testes com python: como fazer uma refatoração segura
 
Workshop Ruby on Rails dia 2 ruby-pt
Workshop Ruby on Rails dia 2  ruby-ptWorkshop Ruby on Rails dia 2  ruby-pt
Workshop Ruby on Rails dia 2 ruby-pt
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
 
Testes automatizados com alto valor de negócio e baixo custo de manutenção
Testes automatizados com alto valor de negócio e baixo custo de manutençãoTestes automatizados com alto valor de negócio e baixo custo de manutenção
Testes automatizados com alto valor de negócio e baixo custo de manutenção
 
(A09) LabMM3 - JavaScript - Estruturas de repetição
(A09) LabMM3 - JavaScript - Estruturas de repetição(A09) LabMM3 - JavaScript - Estruturas de repetição
(A09) LabMM3 - JavaScript - Estruturas de repetição
 
04_Introducao_JavaScript.pdf
04_Introducao_JavaScript.pdf04_Introducao_JavaScript.pdf
04_Introducao_JavaScript.pdf
 
Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.Desenvolvimento Ágil com Grails.
Desenvolvimento Ágil com Grails.
 
Grails
GrailsGrails
Grails
 

Mais de Qaladies

Criar testes em Java é tão chato e demorado... Então use Spock e crie testes ...
Criar testes em Java é tão chato e demorado... Então use Spock e crie testes ...Criar testes em Java é tão chato e demorado... Então use Spock e crie testes ...
Criar testes em Java é tão chato e demorado... Então use Spock e crie testes ...Qaladies
 
Testes de Acessibilidade em Mobile e Web
Testes de Acessibilidade em Mobile e WebTestes de Acessibilidade em Mobile e Web
Testes de Acessibilidade em Mobile e WebQaladies
 
DevOps na nuvem: Azure DevOps Projects
DevOps na nuvem: Azure DevOps ProjectsDevOps na nuvem: Azure DevOps Projects
DevOps na nuvem: Azure DevOps ProjectsQaladies
 
Potencializando seus testes com Jenkins
Potencializando seus testes com JenkinsPotencializando seus testes com Jenkins
Potencializando seus testes com JenkinsQaladies
 
Como transformar um site desktop em uma aplicação responsiva com flex-box e m...
Como transformar um site desktop em uma aplicação responsiva com flex-box e m...Como transformar um site desktop em uma aplicação responsiva com flex-box e m...
Como transformar um site desktop em uma aplicação responsiva com flex-box e m...Qaladies
 
Automação is comming - Como transformamos os Gritos em Risadas
Automação is comming - Como transformamos os Gritos em RisadasAutomação is comming - Como transformamos os Gritos em Risadas
Automação is comming - Como transformamos os Gritos em RisadasQaladies
 
Testes Contínuos na metodologia DEVOps
Testes Contínuos na metodologia DEVOpsTestes Contínuos na metodologia DEVOps
Testes Contínuos na metodologia DEVOpsQaladies
 
Sysadmin: como chegar lá ?
Sysadmin: como chegar lá ?Sysadmin: como chegar lá ?
Sysadmin: como chegar lá ?Qaladies
 
Será que testes automatizados resolvem tudo?
Será que testes automatizados resolvem tudo?Será que testes automatizados resolvem tudo?
Será que testes automatizados resolvem tudo?Qaladies
 

Mais de Qaladies (9)

Criar testes em Java é tão chato e demorado... Então use Spock e crie testes ...
Criar testes em Java é tão chato e demorado... Então use Spock e crie testes ...Criar testes em Java é tão chato e demorado... Então use Spock e crie testes ...
Criar testes em Java é tão chato e demorado... Então use Spock e crie testes ...
 
Testes de Acessibilidade em Mobile e Web
Testes de Acessibilidade em Mobile e WebTestes de Acessibilidade em Mobile e Web
Testes de Acessibilidade em Mobile e Web
 
DevOps na nuvem: Azure DevOps Projects
DevOps na nuvem: Azure DevOps ProjectsDevOps na nuvem: Azure DevOps Projects
DevOps na nuvem: Azure DevOps Projects
 
Potencializando seus testes com Jenkins
Potencializando seus testes com JenkinsPotencializando seus testes com Jenkins
Potencializando seus testes com Jenkins
 
Como transformar um site desktop em uma aplicação responsiva com flex-box e m...
Como transformar um site desktop em uma aplicação responsiva com flex-box e m...Como transformar um site desktop em uma aplicação responsiva com flex-box e m...
Como transformar um site desktop em uma aplicação responsiva com flex-box e m...
 
Automação is comming - Como transformamos os Gritos em Risadas
Automação is comming - Como transformamos os Gritos em RisadasAutomação is comming - Como transformamos os Gritos em Risadas
Automação is comming - Como transformamos os Gritos em Risadas
 
Testes Contínuos na metodologia DEVOps
Testes Contínuos na metodologia DEVOpsTestes Contínuos na metodologia DEVOps
Testes Contínuos na metodologia DEVOps
 
Sysadmin: como chegar lá ?
Sysadmin: como chegar lá ?Sysadmin: como chegar lá ?
Sysadmin: como chegar lá ?
 
Será que testes automatizados resolvem tudo?
Será que testes automatizados resolvem tudo?Será que testes automatizados resolvem tudo?
Será que testes automatizados resolvem tudo?
 

GraphQL e APIs: como manter a qualidade

  • 1. GraphQL e APIs: como manter a qualidade?
  • 2. Olar! Sou a Mai! 22, deva backend na testes ● microsservices ● graphQL girl power ● go vegan /maiarar /maiarrod 2
  • 3. 3 Antes de ir para a apresentação, Vamos alinhar certos conceitos e ferramentas!
  • 5. API? É de comer? 5 Interface de Programação de Aplicações ◆ Interface de integração ◆ “Cola digital” entre duas pontas ◆ Retorna infos do sistema ◆ Quem consome não precisa saber detalhes
  • 6. Coisas legais a se considerar 6 URI - Uniform Resource Identifier https://dev.empresa.com/api-especifica/recurso
  • 7. Coisas legais a se considerar 7 URI - Uniform Resource Identifier https://dev.empresa.com/api-especifica/recurso protocolo
  • 8. Coisas legais a se considerar 8 URI - Uniform Resource Identifier https://dev.empresa.com/api-especifica/recurso a empresa
  • 9. Coisas legais a se considerar 9 URI - Uniform Resource Identifier https://dev.empresa.com/api-especifica/recurso nome da API
  • 10. Coisas legais a se considerar 10 URI - Uniform Resource Identifier https://dev.empresa.com/api-especifica/recurso recursos e parâmetros
  • 11. Coisas legais a se considerar 11 URI - Uniform Resource Identifier https://dev.empresa.com/api-especifica/recurso protocolo a empresa nome da API recursos e parâmetros
  • 12. 12 API USUÁRIO API LOGIN https://empresa.com/usuario/ https://empresa.com/login/
  • 13. Coisas legais a se considerar 13 JSON ◆ Formatação de troca de dados ◆ .json ◆ Tem essa carinha → { "id": 01, "nome": "Fulaninha da Silva", "telefones": [ { "id": 01, "contexto": "Casa", "valor": "+551131133113" }, { "id": 02, "contexto": "Celular", "valor": "+5511981172662" } ] }
  • 14. 14 API USUÁRIO API LOGIN https://empresa.com/usuario/ https://empresa.com/login/ json
  • 15. E como é padronizado? 15 Com o REST! ◆ Transferência de Estado Representacional ◆ Abstração do HTTP ◆ RESTful: quem aplica os padrões REST ◆ Verbos
  • 16. Os verbos 16 ◆ Realizam ações em determinado recurso ◆ Mais usados são: ◆ GET: busca ◆ POST: salva ◆ PUT: atualiza ◆ DELETE: remove
  • 17. 2. GraphQL “A query language for your API” 17
  • 18. 18 GraphQL: O que é? Pra quê serve? Onde é usado? Como é usado? HOJE, NO QA Ladies!
  • 19. O que é? 19 ◆ Linguagem de consulta (grafos) ◆ Flexível e intuitiva ◆ Origem: problemas com REST ◆ Client-side ◆ Único recurso: /graphql
  • 20. Diferenças com o REST 20
  • 21. Recursos principais 21 ◆ Queries: consultas ◆ Mutations: alterações ◆ Schema: como será cada objeto (types) ◆ E muuuito mais coisas! https://developer.github.com/v4/explorer/
  • 22. Queries 22 #simples query { posts } #filtros query { posts(userId: 3) } #mais níveis query { posts { curtidas{ numero } comentarios{ numero } } } #resposta { "data": { "posts": { "curtidas": { "numero": 5 }, "comentarios": { "numero": 3 } } } }
  • 23. Mutations 23 #mutation exemplo mutation CriarComentario( valor: "Linda da tia! Beijos", elementoComentado: 1223 ){ comentario { valor elementoComentado { curtidas { numero } } } }
  • 24. Mutations 24 #mutation exemplo mutation CriarComentario( valor: "Linda da tia! Beijos", elementoComentado: 1223 ){ comentario { valor elementoComentado { curtidas { numero } } } } O que será salvo
  • 25. Mutations 25 #mutation exemplo mutation CriarComentario( valor: "Linda da tia! Beijos", elementoComentado: 1223 ){ comentario { valor elementoComentado { curtidas { numero } } } } O que quero de retorno
  • 26. Mutations 26 #mutation exemplo mutation CriarComentario( valor: "Linda da tia! Beijos", elementoComentado: 1223 ){ comentario { valor elementoComentado { curtidas { numero } } } } #resposta { "data": { "comentario": { “valor": “Linda da tia! Beijos” "elementoComentado": { "curtidas": { "numero": 30 } } } } }
  • 27. Mutations 27 #mutation exemplo mutation CriarComentario( valor: "Linda da tia! Beijos", elementoComentado: 1223 ){ comentario { valor elementoComentado { curtidas { numero } } } } #resposta { "data": { "comentario": { “valor": “Linda da tia! Beijos” "elementoComentado": { "curtidas": { "numero": 30 } } } } }
  • 28. Mutations 28 #mutation exemplo mutation CriarComentario( valor: "Linda da tia! Beijos", elementoComentado: 1223 ){ comentario { valor elementoComentado { curtidas { numero } } } } #resposta { "data": { "comentario": { “valor": “Linda da tia! Beijos” "elementoComentado": { "curtidas": { "numero": 30 } } } } }
  • 29. Mutations 29 #mutation exemplo mutation CriarComentario( valor: "Linda da tia! Beijos", elementoComentado: 1223 ){ comentario { valor elementoComentado { curtidas { numero } } } } #resposta { "data": { "comentario": { “valor": “Linda da tia! Beijos” "elementoComentado": { "curtidas": { "numero": 30 } } } } }
  • 30. Mas então, Como fica a arquitetura GraphQL + APIs?30
  • 31. Arquitetura 31 User Order Other ServicesWeb App Mobile App LoginNotification ProductShipping Token
  • 32. E pra manter a qualidade disso tudo? 32
  • 34. Relembrando... 34 { { Testes manuais buscando comportamentos indesejados { Testes para cada unidade de código fonte { Comunicação entre componentes (defeitos em interfaces) {Comportamento de uma API Regras de negócio externas
  • 35. Necessário pelo menos... 35 ◆ Cucumber: BDD/End-to-end ◆ JUnit/Jasmine: unitários ◆ Postman/Insomnia: testes de integração
  • 36. Necessário pelo menos... 36 ◆ Cucumber: BDD/End-to-end ◆ JUnit/Jasmine: unitários ◆ Postman/Insomnia: testes de integração Vamos falar bastante desse cara!
  • 37. O que é Cucumber? Framework que suporta Desenvolvimento Orientado por Comportamento - Behavior Driven Development (BDD). 37
  • 38. O que é Cucumber? ◆ Muitas, mas muitas implementações (23) ◆ Ideal para a automação https://docs.cucumber.io/ 38
  • 39. Como o Cucumber trabalha? 1. Gherkin → onde existirá o “texto” igualzinho semelhante ao Cenário de Teste 2. Step Definitions → onde esse “texto” irá ser quebrado em functions e assim ser codificado 39 Gherkin Step Definitions Cucumber { CTs
  • 40. Falando mais do Gherkin ◆ BusinessReadableDSL ◆ Documentação do projeto ◆ Testes automatizados 40
  • 41. 41 cenario-teste-matematico.feature#Esse é um cenário de exemplo. @Tag_cenario_exemplo @Tag_outro_exemplo Feature: Cenário de Teste Matemático Esse cenário de teste tem como objetivo realizar as validações de uma soma e de multiplicações. Scenario: Realização de uma soma simples Given que eu tenho uma variável com o valor numérico 1 When eu incremento o valor desta variável com mais 1 Then o valor da variável passa a ser 2 Scenario Outline: Realização de uma expressão simples Given que eu tenho uma variável com o valor numérico <numeroA> When eu multiplico o valor desta variável com pelo valor numérico <numeroB> And adiciono o número <numeroC> Then o valor da variável multiplicada passa a ser <resultado> Examples: | numeroA | numeroB | numeroC | resultado | | 1 | 2 | 2 | 4 | | 3 | 4 | 5 | 17 | ◆ Feature → “nome” daquele conjunto de cenários de teste ◆ Scenario → Cenário de Teste ◆ Given, When, Then → palavras reservadas para instruções (dado, quando, então) ◆ And → quando existirá mais algum passo dentro daquela instrução ◆ Scenario Outline → quando o cenário terá algumas variáveis ◆ Examples → exemplos que serão substituídos no cenário de teste
  • 42. 42 Examples: | numeroA | numeroB | numeroC | resultado | | 1 | 2 | 2 | 4 | | 3 | 4 | 5 | 17 | Examples Scenario Outline: Realização de uma expressão simples Given que eu tenho uma variável com o valor numérico <numeroA> When eu multiplico o valor desta variável com pelo valor numérico <numeroB> And adiciono o número <numeroC> Then o valor da variável multiplicada passa a ser <resultado> Outline Scenario Outline: Realização de uma expressão simples Given que eu tenho uma variável com o valor numérico 1 When eu multiplico o valor desta variável com pelo valor numérico 2 And adiciono o número 2 Then o valor da variável multiplicada passa a ser 4 1ª iteração Scenario Outline: Realização de uma expressão simples Given que eu tenho uma variável com o valor numérico 3 When eu multiplico o valor desta variável com pelo valor numérico 4 And adiciono o número 5 Then o valor da variável multiplicada passa a ser 17 2ª iteração
  • 43. 43 valida-acesso-pedidos.feature#Esse é outro cenário de exemplo. @tag_pagina_pedidos @tag_usuario_comum Feature: Acesso à página de pedidos Esse cenário de teste tem como objetivo realizar as validações para acesso à página de pedidos. Background: Login realizado Given que eu tenha realizado um cadastro no sistema @Ter_pedidos_no_carrinho Scenario: Acesso à página de pedidos com itens no carrinho Given que eu esteja na tela inicial do sistema When eu clico no botão de "pedidos" Then é retornada a página de pedidos contendo meus pedidos @Carrinho_vazio Scenario: Acesso à página de pedidos sem itens no carrinho Given que eu esteja na tela inicial do sistema When eu clico no botão de "pedidos" Then é retornada a página de pedidos informando que "não existem pedidos registrados" @Ter_pedidos_no_carrinho Scenario: Acesso à página de pedidos após login ter expirado Given que eu esteja na tela inicial do sistema When eu clico no botão de "pedidos" But meu token de acesso expirou Then é retornada uma página informando que "é preciso estar logado para visualizar os pedidos" ◆ Background → cenário prévio necessário apenas para a feature ◆ É possível haverem @tags em cenário ◆ But → “exceção” dentre os passos do cenário
  • 44. 44 #Esse é outro cenário de exemplo. @Tag_criacao_usuarios Feature: Criação de Usuários no sistema Esse cenário de teste tem como objetivo realizar as validações para Criação de Usuários no sistema. Scenario: Exibição de cenário de erro ao tentar criar um novo usuário sem cadastrar e-mail Given que eu esteja logada no sistema And que eu tenha autorização para criar usuários no sistema When eu preencho o campo de "Nome" com "Nome Exemplo" And eu preencho o campo de "Idade" com 22 And eu preencho o campo de "Estado Civil" com "Solteiro" And eu preencho o campo de "Endereço" com "Rua Exemplo, 333 - Campinas, SP, Brasil" And eu preencho o campo de "Por onde nos conheceu" com "Texto Exemplo" And eu preencho o campo de "Algum campo específico demais" com "Valor de exemplo específico demais" But eu não preencho o campo "e-mail" And eu clico no botão "criar" Then eu recebo uma mensagem de erro informando que "campos obrigatórios não preenchidos" Scenario: Exibição de cenário de erro ao tentar criar um novo usuário sem cadastrar Nome Given que eu esteja logada no sistema And que eu tenha autorização para criar usuários no sistema When eu preencho o campo de "e-mail" com "email@provedor.com" And eu preencho o campo de "Idade" com 22 And eu preencho o campo de "Estado Civil" com "Solteiro" And eu preencho o campo de "Endereço" com "Rua Exemplo, 333 - Campinas, SP, Brasil" And eu preencho o campo de "Por onde nos conheceu" com "Texto Exemplo" And eu preencho o campo de "Algum campo específico demais" com "Valor de exemplo específico demais" But eu não preencho o campo "Nome" And eu clico no botão "criar" Then eu recebo uma mensagem de erro informando que "campos obrigatórios não preenchidos" + declarativo, - imperativo #Esse é outro cenário de exemplo. @Tag_criacao_usuarios Feature: Criação de Usuários no sistema Esse cenário de teste tem como objetivo realizar as validações para Criação de Usuários no sistema. Scenario: Exibição de cenário de erro ao tentar criar um novo usuário sem cadastrar e-mail Given que eu esteja logada no sistema And que eu tenha autorização para criar usuários no sistema When eu preencho os campos obrigatórios But eu não preencho o campo "e-mail" And eu clico no botão "criar" Then eu recebo uma mensagem de erro informando que "campos obrigatórios não preenchidos" Scenario: Exibição de cenário de erro ao tentar criar um novo usuário sem cadastrar Nome Given que eu esteja logada no sistema And que eu tenha autorização para criar usuários no sistema When eu preencho os campos obrigatórios But eu não preencho o campo "Nome" And eu clico no botão "criar" Then eu recebo uma mensagem de erro informando que "campos obrigatórios não preenchidos"
  • 45. 45 Mas cuidado... #Esse é outro cenário de exemplo, mas zoado. @Tag_login_usuarios Feature: Login de Usuários no sistema Esse cenário de teste tem como objetivo realizar as validações para Login de Usuários no sistema. Scenario: Exibição de mensagem de sucesso ao criar um novo usuário Given Eu queira me cadastrar no sistema When Eu faço o cadastro Then Eu vejo a mensagem de sucesso ◆ Muito vago ◆ Inútil para servir de documentação
  • 46. Mas e pra codar esse textão? 46
  • 47. 47 Step Definitions! Temos os const { Given, When, Then } = require('cucumber'); const assert = require('assert'); //Realização de uma soma simples Given('que eu tenho uma variável com o valor numérico {int}', (firstnumero) => { this.number = firstNumber; }) When('eu incremento o valor desta variável com mais {int}', (newNumber) => { this.number = (this.number) + newNumber }) Then('o valor da variável passa a ser {int}', (result) => { assert(this.number,result); }) //Realização de uma expressão simples When('eu multiplico o valor desta variável com pelo valor numérico {int}', (newNumber) => { this.number = (this.number) * newNumber }) Given('adiciono o número {int}', function and(numberC) { this.number += numberC; }); Then('o valor da variável multiplicada passa a ser {int}', (result) => { assert(this.number,result); }) cenario-teste-matematico.js
  • 48. 48 cenario-teste-matematico.js Libs básicas: ◆ cucumber ◆ assert ◆ joi e joi-assert (mock) “Como assim this.number? Onde tá essa variável?” ◆ variável no contexto const { Given, When, Then } = require('cucumber'); const assert = require('assert'); //Realização de uma soma simples Given('que eu tenho uma variável com o valor numérico {int}', (firstNumber) => { this.number = firstNumber; }) When('eu incremento o valor desta variável com mais {int}', (newNumber) => { this.number = (this.number) + newNumber }) Then('o valor da variável passa a ser {int}', (result) => { assert(this.number,result); }) //Realização de uma expressão simples When('eu multiplico o valor desta variável com pelo valor numérico {int}', (newNumber) => { this.number = (this.number) * newNumber }) Given('adiciono o número {int}', function and(numberC) { this.number += numberC; }); Then('o valor da variável multiplicada passa a ser {int}', (result) => { assert(this.number,result); })
  • 49. 49 const { Given, When, Then } = require('cucumber'); const assert = require('assert'); //Realização de uma soma simples Given('que eu tenho uma variável com o valor numérico {int}', (firstNumber) => { this.number = firstNumber; }) When('eu incremento o valor desta variável com mais {int}', (newNumber) => { this.number = (this.number) + newNumber }) Then('o valor da variável passa a ser {int}', (result) => { assert(this.number,result); }) //Realização de uma expressão simples When('eu multiplico o valor desta variável com pelo valor numérico {int}', (newNumber) => { this.number = (this.number) * newNumber }) Given('adiciono o número {int}', function and(numberC) { this.number += numberC; }); Then('o valor da variável multiplicada passa a ser {int}', (result) => { assert(this.number,result); }) #Esse é um cenário de exemplo. @Tag_cenario_exemplo Feature: Cenário de Teste Matemático Esse cenário de teste tem como objetivo realizar as validações de uma soma e de multiplicações. Scenario: Realização de uma soma simples Given que eu tenho uma variável com o valor numérico 1 When eu incremento o valor desta variável com mais 1 Then o valor da variável passa a ser 2 Scenario Outline: Realização de uma expressão simples Given que eu tenho uma variável com o valor numérico <numeroA> When eu multiplico o valor desta variável com pelo valor numérico <numeroB> And adiciono o número <numeroC> Then o valor da variável multiplicada passa a ser <resultado> Examples: | numeroA | numeroB | numeroC | resultado | | 1 | 2 | 2 | 4 | | 3 | 4 | 5 | 17 | cenario-teste-matematico.feature cenario-teste-matematico.js
  • 50. 50 const { Given, When, Then } = require('cucumber'); const assert = require('assert'); //Realização de uma soma simples Given('que eu tenho uma variável com o valor numérico {int}', (firstNumber) => { this.number = firstNumber; }) When('eu incremento o valor desta variável com mais {int}', (newNumber) => { this.number = (this.number) + newNumber }) Then('o valor da variável passa a ser {int}', (result) => { assert(this.number,result); }) //Realização de uma expressão simples When('eu multiplico o valor desta variável com pelo valor numérico {int}', (newNumber) => { this.number = (this.number) * newNumber }) Given('adiciono o número {int}', function and(numberC) { this.number += numberC; }); Then('o valor da variável multiplicada passa a ser {int}', (result) => { assert(this.number,result); }) #Esse é um cenário de exemplo. @Tag_cenario_exemplo Feature: Cenário de Teste Matemático Esse cenário de teste tem como objetivo realizar as validações de uma soma e de multiplicações. Scenario: Realização de uma soma simples Given que eu tenho uma variável com o valor numérico 1 When eu incremento o valor desta variável com mais 1 Then o valor da variável passa a ser 2 Scenario Outline: Realização de uma expressão simples Given que eu tenho uma variável com o valor numérico <numeroA> When eu multiplico o valor desta variável com pelo valor numérico <numeroB> And adiciono o número <numeroC> Then o valor da variável multiplicada passa a ser <resultado> Examples: | numeroA | numeroB | numeroC | resultado | | 1 | 2 | 2 | 4 | | 3 | 4 | 5 | 17 | cenario-teste-matematico.feature cenario-teste-matematico.js
  • 51. 51 const { Given, When, Then } = require('cucumber'); const assert = require('assert'); //Realização de uma soma simples Given('que eu tenho uma variável com o valor numérico {int}', (firstNumber) => { this.number = firstNumber; }) When('eu incremento o valor desta variável com mais {int}', (newNumber) => { this.number = (this.number) + newNumber }) Then('o valor da variável passa a ser {int}', (result) => { assert(this.number,result); }) //Realização de uma expressão simples When('eu multiplico o valor desta variável com pelo valor numérico {int}', (newNumber) => { this.number = (this.number) * newNumber }) Given('adiciono o número {int}', function and(numberC) { this.number += numberC; }); Then('o valor da variável multiplicada passa a ser {int}', (result) => { assert(this.number,result); }) #Esse é um cenário de exemplo. @Tag_cenario_exemplo Feature: Cenário de Teste Matemático Esse cenário de teste tem como objetivo realizar as validações de uma soma e de multiplicações. Scenario: Realização de uma soma simples Given que eu tenho uma variável com o valor numérico 1 When eu incremento o valor desta variável com mais 1 Then o valor da variável passa a ser 2 Scenario Outline: Realização de uma expressão simples Given que eu tenho uma variável com o valor numérico <numeroA> When eu multiplico o valor desta variável com pelo valor numérico <numeroB> And adiciono o número <numeroC> Then o valor da variável multiplicada passa a ser <resultado> Examples: | numeroA | numeroB | numeroC | resultado | | 1 | 2 | 2 | 4 | | 3 | 4 | 5 | 17 | cenario-teste-matematico.feature cenario-teste-matematico.js
  • 52. 52 const { Given, When, Then } = require('cucumber'); const assert = require('assert'); //Realização de uma soma simples Given('que eu tenho uma variável com o valor numérico {int}', (firstNumber) => { this.number = firstNumber; }) When('eu incremento o valor desta variável com mais {int}', (newNumber) => { this.number = (this.number) + newNumber }) Then('o valor da variável passa a ser {int}', (result) => { assert(this.number,result); }) //Realização de uma expressão simples When('eu multiplico o valor desta variável com pelo valor numérico {int}', (newNumber) => { this.number = (this.number) * newNumber }) Given('adiciono o número {int}', function and(numberC) { this.number += numberC; }); Then('o valor da variável multiplicada passa a ser {int}', (result) => { assert(this.number,result); }) #Esse é um cenário de exemplo. @Tag_cenario_exemplo Feature: Cenário de Teste Matemático Esse cenário de teste tem como objetivo realizar as validações de uma soma e de multiplicações. Scenario: Realização de uma soma simples Given que eu tenho uma variável com o valor numérico 1 When eu incremento o valor desta variável com mais 1 Then o valor da variável passa a ser 2 Scenario Outline: Realização de uma expressão simples Given que eu tenho uma variável com o valor numérico <numeroA> When eu multiplico o valor desta variável com pelo valor numérico <numeroB> And adiciono o número <numeroC> Then o valor da variável multiplicada passa a ser <resultado> Examples: | numeroA | numeroB | numeroC | resultado | | 1 | 2 | 2 | 4 | | 3 | 4 | 5 | 17 | cenario-teste-matematico.feature cenario-teste-matematico.js
  • 53. 53 const { Given, When, Then } = require('cucumber'); const assert = require('assert'); //Realização de uma soma simples Given('que eu tenho uma variável com o valor numérico {int}', (firstNumber) => { this.number = firstNumber; }) When('eu incremento o valor desta variável com mais {int}', (newNumber) => { this.number = (this.number) + newNumber }) Then('o valor da variável passa a ser {int}', (result) => { assert(this.number,result); }) //Realização de uma expressão simples When('eu multiplico o valor desta variável com pelo valor numérico {int}', (newNumber) => { this.number = (this.number) * newNumber }) Given('adiciono o número {int}', function and(numberC) { this.number += numberC; }); Then('o valor da variável multiplicada passa a ser {int}', (result) => { assert(this.number,result); }) #Esse é um cenário de exemplo. @Tag_cenario_exemplo Feature: Cenário de Teste Matemático Esse cenário de teste tem como objetivo realizar as validações de uma soma e de multiplicações. Scenario: Realização de uma soma simples Given que eu tenho uma variável com o valor numérico 1 When eu incremento o valor desta variável com mais 1 Then o valor da variável passa a ser 2 Scenario Outline: Realização de uma expressão simples Given que eu tenho uma variável com o valor numérico <numeroA> When eu multiplico o valor desta variável com pelo valor numérico <numeroB> And adiciono o número <numeroC> Then o valor da variável multiplicada passa a ser <resultado> Examples: | numeroA | numeroB | numeroC | resultado | | 1 | 2 | 2 | 4 | | 3 | 4 | 5 | 17 | cenario-teste-matematico.feature cenario-teste-matematico.js
  • 54. 54 const { Given, When, Then } = require('cucumber'); const assert = require('assert'); //Realização de uma soma simples Given('que eu tenho uma variável com o valor numérico {int}', (firstNumber) => { this.number = firstNumber; }) When('eu incremento o valor desta variável com mais {int}', (newNumber) => { this.number = (this.number) + newNumber }) Then('o valor da variável passa a ser {int}', (result) => { assert(this.number,result); }) //Realização de uma expressão simples When('eu multiplico o valor desta variável com pelo valor numérico {int}', (newNumber) => { this.number = (this.number) * newNumber }) Given('adiciono o número {int}', function and(numberC) { this.number += numberC; }); Then('o valor da variável multiplicada passa a ser {int}', (result) => { assert(this.number,result); }) #Esse é um cenário de exemplo. @Tag_cenario_exemplo Feature: Cenário de Teste Matemático Esse cenário de teste tem como objetivo realizar as validações de uma soma e de multiplicações. Scenario: Realização de uma soma simples Given que eu tenho uma variável com o valor numérico 1 When eu incremento o valor desta variável com mais 1 Then o valor da variável passa a ser 2 Scenario Outline: Realização de uma expressão simples Given que eu tenho uma variável com o valor numérico <numeroA> When eu multiplico o valor desta variável com pelo valor numérico <numeroB> And adiciono o número <numeroC> Then o valor da variável multiplicada passa a ser <resultado> Examples: | numeroA | numeroB | numeroC | resultado | | 1 | 2 | 2 | 4 | | 3 | 4 | 5 | 17 | cenario-teste-matematico.feature cenario-teste-matematico.js
  • 55. 55 const { Given, When, Then } = require('cucumber'); const assert = require('assert'); //Realização de uma soma simples Given('que eu tenho uma variável com o valor numérico {int}', (firstNumber) => { this.number = firstNumber; }) When('eu incremento o valor desta variável com mais {int}', (newNumber) => { this.number = (this.number) + newNumber }) Then('o valor da variável passa a ser {int}', (result) => { assert(this.number,result); }) //Realização de uma expressão simples When('eu multiplico o valor desta variável com pelo valor numérico {int}', (newNumber) => { this.number = (this.number) * newNumber }) Given('adiciono o número {int}', function and(numberC) { this.number += numberC; }); Then('o valor da variável multiplicada passa a ser {int}', (result) => { assert(this.number,result); }) #Esse é um cenário de exemplo. @Tag_cenario_exemplo Feature: Cenário de Teste Matemático Esse cenário de teste tem como objetivo realizar as validações de uma soma e de multiplicações. Scenario: Realização de uma soma simples Given que eu tenho uma variável com o valor numérico 1 When eu incremento o valor desta variável com mais 1 Then o valor da variável passa a ser 2 Scenario Outline: Realização de uma expressão simples Given que eu tenho uma variável com o valor numérico <numeroA> When eu multiplico o valor desta variável com pelo valor numérico <numeroB> And adiciono o número <numeroC> Then o valor da variável multiplicada passa a ser <resultado> Examples: | numeroA | numeroB | numeroC | resultado | | 1 | 2 | 2 | 4 | | 3 | 4 | 5 | 17 | cenario-teste-matematico.feature cenario-teste-matematico.js
  • 56. Testes de criação de usuário ◆ Banco não-exclusivo pros testes ◆ Pré-requisito? Username não ter sido criado ainda ◆ Como garanto? Verificando no banco se o username já existe → todo teste precisa disso ◆ Faz parte do cenário de teste esse pré-requisito? Agora imaginem... 56
  • 57. Tem como se colocar passos antes e depois de todos os testes? 57
  • 59. 59 hooks.js Imports básicos ◆ Before ◆ BeforeAll ◆ After ◆ AfterAll var {After, Before, BeforeAll, AfterAll} = require('cucumber'); BeforeAll(function () { // Será realizado antes de todos os cenários }); Before({tags: "@foo"}, function () { // Será realizado antes de cenários com a tag @foo }); AfterAll(function () { // Será realizado depois de todos os cenários }); After({tags: "@foo"}, function () { // Será realizado depois de cenários com a tag @foo });
  • 60. E o que colocar no before e no after? 60 After/AfterAll ◆ Preparação de base (deleção/desassociação de registros) ◆ Pós-requisito que não faz parte do escopo do cenário de teste Before/BeforeAll ◆ Preparação de base ◆ Credenciais de acesso ◆ Pré-requisito que não faz parte do escopo do cenário de teste
  • 62. E é isso! Alguma dúvida? Algum questionamento? 62 (finjam que não dormiram )
  • 63. 63 Let’s Code! “Talk is cheap. Show me the code!”