SlideShare uma empresa Scribd logo
1 de 24
Baixar para ler offline
uma história sobre
testes de API
Samuel Lourenço & Adelino Mazuti
Antes… swagger…
Antes… postman...
Antes… massa de dados no excel…
então...
Será que você consegue automatizar uns testes de API?
opa!
Consigo sim!
voltando aos conceitos...
REST API
arquitetura para serviços web
abstração em cima do protocolo HTTP
operações definidas com base no HTTP
HTTP
protocolo de comunicação das internetes
voltando aos conceitos...
Protocolo HTTP:
URL (Universal Resource Location)
host, path, query string
Requisição HTTP
verb, URL, header, body
Resposta HTTP
status code, header, body
o que vou precisar?
Um “executor” de testes (ex: rspec)
Uma biblioteca de assertions (ex: rspec-expectations)
Client HTTP (ex: Net::Http nativo do ruby)
Parser de JSON (ex: json nativo do ruby)
Validador de JSON (ex: json-schema, hash_validator)
Validar respostas (objeto com a resposta completa)
como quero escrever os testes?
priorizar legibilidade e simplicidade
menos DRY (don’t repeat yourself)
mais verboso
menos mágica
separar código de acesso à API do código de teste
como quero escrever os testes?
estilo specification:
describe ‘thing’
it ‘do something’ { expect(thing).to do_something }
it ‘does not do this’ { expect(thing).not_to do_this }
it ‘has some of that’ { expect(thing).to have_that }
como quero escrever os testes?
Padrão AAA (3A)
Arrange (ou Setup)
Act (ou Exercise)
Assert (ou Verify)
como quero escrever os testes?
seguir um roteiro:
Arrange: Montar a requisição (verb, URL, header, body)
Act: Enviar a requisição / receber resposta
Assert: Validar resposta (status code, header, body)
misturando tudo
Entidades e operações (separação de responsabilidades)
class User < Entity
attr_accessor :username
resource post: '/user', operation: 'create'
resource post: '/user/createWithArray', operation: 'create_with_array'
resource post: '/user/createWithList', operation: 'create_with_list'
resource get: '/user/login', operation: 'login'
resource get: '/user/logout', operation: 'logout'
resource put: '/user/:username:', operation: 'update'
resource delete: '/user/:username:', operation: 'delete'
end
misturando tudo
Expectations
definição das estruturas de retorno esperadas
campos retornados na resposta e seus tipos de dados
testes de contrato
ex:
{ nome: ‘string’, idade: ‘integer’, nascimento: ‘date’ }
misturando tudo
Testes
subject é a entidade (foco do teste)
um ‘describe’ por entidade
um ‘context’ por operação
before/after cria/deleta dependências
isolamento!
misturando tudo
describe ‘User API’
context ‘POST /user (create user)’
context ‘GET /user/login’
before(:context) { create_user }
after(:context) { delete_user }
context ‘DELETE /user/:username:’
before(:context) { create_user }
exemplo
POST http://myapp.com/user
POST http://myapp.com/user/createWithArray
POST http://myapp.com/user/createWithList
GET http://myapp.com/user/login
GET http://myapp.com/user/logout
GET http://myapp.com/user/{username}
PUT http://myapp.com/user/{username}
DELETE http://myapp.com/user/{username}
exemplo
entidade
class User < Entity
HOST = 'http://myapp.com'
attr_accessor :username
resource post: '/user', operation: 'create'
resource post: '/user/createWithArray', operation: 'create_with_array'
resource post: '/user/createWithList', operation: 'create_with_list'
resource get: '/user/login', operation: 'login'
resource get: '/user/logout', operation: 'logout'
resource put: '/user/:username:', operation: 'update'
resource delete: '/user/:username:', operation: 'delete'
end
exemplo
expectations
module UserExpectations
def expected_create
{ message: 'string', id: 'integer', name: 'string', email: 'email' }
end
def expected_login
{ message: 'string', session: 'string', id: 'integer', name: 'string' }
end
def expected_create_with_list
{ message: 'string', users: many({ id: 'integer', name: 'string', email: 'email' })
end
end
exemplo
Teste (spec)
describe 'User API' do
subject(:user) { User.new }
context 'POST /user (create user)' do
it 'creates a new user' do
# arrange
user.body = { name: 'João', email: 'joao@mail.com' }
# act
response = user.create
# assert
expect(response.status_code).to eq '201 Created'
expect(response.body).to have_structure_like user.expected_create
expect(response.body[:message]).to eq 'Usuário criado com sucesso!'
expect(response.body[:name]).to eq 'João'
expect(response.body[:email]).to eq 'joao@mail.com'
end
exemplo
outro teste
it 'does not create user when email is invalid' do
# arrange
user.body = { name: 'João', email: 'invalidmail' }
# act
response = user.create
# assert
expect(response.status_code).to eq '400 Bad Request'
expect(response.body[:error]).to eq 'e-mail inválido'
end
end # end context
exemplo
context 'GET /user/login' do
before(:context) { create_user }
after(:context) { delete_user }
it 'do user login' do
# arrange
user.body = { email: 'joao@mail.com', password: 'senha123' }
# act
response = user.login
# assert
expect(response.status_code).to eq '200 OK'
expect(response.body).to have_structure_like user.expected_login
expect(response.body[:message]).to eq 'Bem vindo João!'
expect(response.body[:name]).to eq 'João'
expect(response.body[:session]).not_to be_empty
end
end
end # end describe
fim!
obrigado!

Mais conteúdo relacionado

Mais procurados

Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1Eduardo Mendes
 
Java Web 5 - JSP, Expression Language e Taglibs
Java Web 5 - JSP, Expression Language e TaglibsJava Web 5 - JSP, Expression Language e Taglibs
Java Web 5 - JSP, Expression Language e TaglibsEduardo Mendes
 
Desenvolvendo Extensões PECL
Desenvolvendo Extensões PECLDesenvolvendo Extensões PECL
Desenvolvendo Extensões PECLW3P Projetos Web
 

Mais procurados (6)

Rest Beer v2
Rest Beer v2Rest Beer v2
Rest Beer v2
 
Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1Java Web 3 - Servlets e JSP 1
Java Web 3 - Servlets e JSP 1
 
Java Web 5 - JSP, Expression Language e Taglibs
Java Web 5 - JSP, Expression Language e TaglibsJava Web 5 - JSP, Expression Language e Taglibs
Java Web 5 - JSP, Expression Language e Taglibs
 
RMI em Java
RMI em JavaRMI em Java
RMI em Java
 
Desenvolvendo Extensões PECL
Desenvolvendo Extensões PECLDesenvolvendo Extensões PECL
Desenvolvendo Extensões PECL
 
Api usando Silex
Api usando SilexApi usando Silex
Api usando Silex
 

Semelhante a Automatizar testes de API

Construindo APIs RESTful com Spring
Construindo APIs RESTful com SpringConstruindo APIs RESTful com Spring
Construindo APIs RESTful com SpringMateus Malaquias
 
Desenvolvimento de web sites com php
Desenvolvimento de web sites com phpDesenvolvimento de web sites com php
Desenvolvimento de web sites com phpbrenod123
 
De Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupDe Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupWagner Roberto dos Santos
 
De a máxima cobertura nos seus testes de API
De a máxima cobertura nos seus testes de APIDe a máxima cobertura nos seus testes de API
De a máxima cobertura nos seus testes de APIElias Nogueira
 
Combinando OO e Funcional em javascript de forma prática
Combinando OO e Funcional em javascript de forma práticaCombinando OO e Funcional em javascript de forma prática
Combinando OO e Funcional em javascript de forma práticaMilfont Consulting
 
Conhecendo os recursos do ASP.NET Web API
Conhecendo os recursos do ASP.NET Web APIConhecendo os recursos do ASP.NET Web API
Conhecendo os recursos do ASP.NET Web APIIvan Paulovich
 
Criando aplicativos para Windows 8 usando apenas HTML5 e Javascript
Criando aplicativos para Windows 8 usando apenas HTML5 e JavascriptCriando aplicativos para Windows 8 usando apenas HTML5 e Javascript
Criando aplicativos para Windows 8 usando apenas HTML5 e JavascriptIvan Paulovich
 
Desenvolvendo para WEB com JAVA
Desenvolvendo para WEB com JAVADesenvolvendo para WEB com JAVA
Desenvolvendo para WEB com JAVAWillian Magalhães
 
Automação de testes de API utilizando Postman
Automação de testes de API utilizando PostmanAutomação de testes de API utilizando Postman
Automação de testes de API utilizando PostmanLucas Amaral
 
Golang para desenvolvedores pragmáticos parte 2
Golang para desenvolvedores pragmáticos  parte 2Golang para desenvolvedores pragmáticos  parte 2
Golang para desenvolvedores pragmáticos parte 2Wilson Júnior
 
Rest Java One
Rest Java OneRest Java One
Rest Java OneDextra
 
Asp tutorial asp
Asp   tutorial aspAsp   tutorial asp
Asp tutorial asprobinhoct
 
Web 2.0 e AJAX - Parte 2 / 3
Web 2.0 e AJAX - Parte 2 / 3Web 2.0 e AJAX - Parte 2 / 3
Web 2.0 e AJAX - Parte 2 / 3David Ruiz
 

Semelhante a Automatizar testes de API (20)

Construindo APIs RESTful com Spring
Construindo APIs RESTful com SpringConstruindo APIs RESTful com Spring
Construindo APIs RESTful com Spring
 
Desenvolvimento de web sites com php
Desenvolvimento de web sites com phpDesenvolvimento de web sites com php
Desenvolvimento de web sites com php
 
De Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações MashupDe Web Services RESTful a Aplicações Mashup
De Web Services RESTful a Aplicações Mashup
 
Beagajs
BeagajsBeagajs
Beagajs
 
De a máxima cobertura nos seus testes de API
De a máxima cobertura nos seus testes de APIDe a máxima cobertura nos seus testes de API
De a máxima cobertura nos seus testes de API
 
Combinando OO e Funcional em javascript de forma prática
Combinando OO e Funcional em javascript de forma práticaCombinando OO e Funcional em javascript de forma prática
Combinando OO e Funcional em javascript de forma prática
 
Realtime com node.js e socket.io
Realtime com node.js e socket.ioRealtime com node.js e socket.io
Realtime com node.js e socket.io
 
Http Servlet
Http ServletHttp Servlet
Http Servlet
 
Conhecendo os recursos do ASP.NET Web API
Conhecendo os recursos do ASP.NET Web APIConhecendo os recursos do ASP.NET Web API
Conhecendo os recursos do ASP.NET Web API
 
Criando aplicativos para Windows 8 usando apenas HTML5 e Javascript
Criando aplicativos para Windows 8 usando apenas HTML5 e JavascriptCriando aplicativos para Windows 8 usando apenas HTML5 e Javascript
Criando aplicativos para Windows 8 usando apenas HTML5 e Javascript
 
servlet-requisicoes
servlet-requisicoesservlet-requisicoes
servlet-requisicoes
 
Desenvolvendo para WEB com JAVA
Desenvolvendo para WEB com JAVADesenvolvendo para WEB com JAVA
Desenvolvendo para WEB com JAVA
 
Web Services Rest
Web Services RestWeb Services Rest
Web Services Rest
 
Automação de testes de API utilizando Postman
Automação de testes de API utilizando PostmanAutomação de testes de API utilizando Postman
Automação de testes de API utilizando Postman
 
Golang para desenvolvedores pragmáticos parte 2
Golang para desenvolvedores pragmáticos  parte 2Golang para desenvolvedores pragmáticos  parte 2
Golang para desenvolvedores pragmáticos parte 2
 
Owasp web app_flaws
Owasp web app_flawsOwasp web app_flaws
Owasp web app_flaws
 
Ajax como comecar
Ajax como comecarAjax como comecar
Ajax como comecar
 
Rest Java One
Rest Java OneRest Java One
Rest Java One
 
Asp tutorial asp
Asp   tutorial aspAsp   tutorial asp
Asp tutorial asp
 
Web 2.0 e AJAX - Parte 2 / 3
Web 2.0 e AJAX - Parte 2 / 3Web 2.0 e AJAX - Parte 2 / 3
Web 2.0 e AJAX - Parte 2 / 3
 

Automatizar testes de API

  • 1. uma história sobre testes de API Samuel Lourenço & Adelino Mazuti
  • 4. Antes… massa de dados no excel…
  • 5. então... Será que você consegue automatizar uns testes de API?
  • 7. voltando aos conceitos... REST API arquitetura para serviços web abstração em cima do protocolo HTTP operações definidas com base no HTTP HTTP protocolo de comunicação das internetes
  • 8. voltando aos conceitos... Protocolo HTTP: URL (Universal Resource Location) host, path, query string Requisição HTTP verb, URL, header, body Resposta HTTP status code, header, body
  • 9. o que vou precisar? Um “executor” de testes (ex: rspec) Uma biblioteca de assertions (ex: rspec-expectations) Client HTTP (ex: Net::Http nativo do ruby) Parser de JSON (ex: json nativo do ruby) Validador de JSON (ex: json-schema, hash_validator) Validar respostas (objeto com a resposta completa)
  • 10. como quero escrever os testes? priorizar legibilidade e simplicidade menos DRY (don’t repeat yourself) mais verboso menos mágica separar código de acesso à API do código de teste
  • 11. como quero escrever os testes? estilo specification: describe ‘thing’ it ‘do something’ { expect(thing).to do_something } it ‘does not do this’ { expect(thing).not_to do_this } it ‘has some of that’ { expect(thing).to have_that }
  • 12. como quero escrever os testes? Padrão AAA (3A) Arrange (ou Setup) Act (ou Exercise) Assert (ou Verify)
  • 13. como quero escrever os testes? seguir um roteiro: Arrange: Montar a requisição (verb, URL, header, body) Act: Enviar a requisição / receber resposta Assert: Validar resposta (status code, header, body)
  • 14. misturando tudo Entidades e operações (separação de responsabilidades) class User < Entity attr_accessor :username resource post: '/user', operation: 'create' resource post: '/user/createWithArray', operation: 'create_with_array' resource post: '/user/createWithList', operation: 'create_with_list' resource get: '/user/login', operation: 'login' resource get: '/user/logout', operation: 'logout' resource put: '/user/:username:', operation: 'update' resource delete: '/user/:username:', operation: 'delete' end
  • 15. misturando tudo Expectations definição das estruturas de retorno esperadas campos retornados na resposta e seus tipos de dados testes de contrato ex: { nome: ‘string’, idade: ‘integer’, nascimento: ‘date’ }
  • 16. misturando tudo Testes subject é a entidade (foco do teste) um ‘describe’ por entidade um ‘context’ por operação before/after cria/deleta dependências isolamento!
  • 17. misturando tudo describe ‘User API’ context ‘POST /user (create user)’ context ‘GET /user/login’ before(:context) { create_user } after(:context) { delete_user } context ‘DELETE /user/:username:’ before(:context) { create_user }
  • 18. exemplo POST http://myapp.com/user POST http://myapp.com/user/createWithArray POST http://myapp.com/user/createWithList GET http://myapp.com/user/login GET http://myapp.com/user/logout GET http://myapp.com/user/{username} PUT http://myapp.com/user/{username} DELETE http://myapp.com/user/{username}
  • 19. exemplo entidade class User < Entity HOST = 'http://myapp.com' attr_accessor :username resource post: '/user', operation: 'create' resource post: '/user/createWithArray', operation: 'create_with_array' resource post: '/user/createWithList', operation: 'create_with_list' resource get: '/user/login', operation: 'login' resource get: '/user/logout', operation: 'logout' resource put: '/user/:username:', operation: 'update' resource delete: '/user/:username:', operation: 'delete' end
  • 20. exemplo expectations module UserExpectations def expected_create { message: 'string', id: 'integer', name: 'string', email: 'email' } end def expected_login { message: 'string', session: 'string', id: 'integer', name: 'string' } end def expected_create_with_list { message: 'string', users: many({ id: 'integer', name: 'string', email: 'email' }) end end
  • 21. exemplo Teste (spec) describe 'User API' do subject(:user) { User.new } context 'POST /user (create user)' do it 'creates a new user' do # arrange user.body = { name: 'João', email: 'joao@mail.com' } # act response = user.create # assert expect(response.status_code).to eq '201 Created' expect(response.body).to have_structure_like user.expected_create expect(response.body[:message]).to eq 'Usuário criado com sucesso!' expect(response.body[:name]).to eq 'João' expect(response.body[:email]).to eq 'joao@mail.com' end
  • 22. exemplo outro teste it 'does not create user when email is invalid' do # arrange user.body = { name: 'João', email: 'invalidmail' } # act response = user.create # assert expect(response.status_code).to eq '400 Bad Request' expect(response.body[:error]).to eq 'e-mail inválido' end end # end context
  • 23. exemplo context 'GET /user/login' do before(:context) { create_user } after(:context) { delete_user } it 'do user login' do # arrange user.body = { email: 'joao@mail.com', password: 'senha123' } # act response = user.login # assert expect(response.status_code).to eq '200 OK' expect(response.body).to have_structure_like user.expected_login expect(response.body[:message]).to eq 'Bem vindo João!' expect(response.body[:name]).to eq 'João' expect(response.body[:session]).not_to be_empty end end end # end describe