SlideShare uma empresa Scribd logo
1 de 70
Baixar para ler offline
Charles Kilesse
@chkile
Testando RESTful Web Services
• REST e RESTful web services
• URI
• Métodos
• Estrutura de mensagem HTTP
• Códigos de resposta
• Testes exploratórios com Postman
• Testes automatizados com Python
• Boas práticas em automação
• Autenticação
Agenda
O que é REST?
REST
“Representational state transfer”
Estilo arquitetural da World Wide Web
Trata de papéis e interações
Comunicação tipicamente por HTTP
REST
Cliente/Servidor
Sem estado
Interface uniforme
Tá, mas… onde
entram as APIs?
RESTful Web Services
Uniform Resource Identifier (URI)
Métodos (ou verbos) HTTP
Media type (JSON, XML…)
Sem estado
URI
http://chaordic.com.br/
http://chaordic.com.br:80/
http://user:password@chaordic.com.br/
http://chaordic.com.br/caminho/recurso
URI
http://chaordic.com.br/?chave=valor
http://chaordic.com.br/?c=v&c2=v2
http://chaordic.com.br/#fragmento
Verbos (métodos) HTTP
GET POST PUT DELETE
OPTIONS
HEADCONNECT TRACE
http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
Verbos (métodos) HTTP
GET POST PUT DELETE
OPTIONS
HEADCONNECT TRACE
http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
este curso
- Solicita uma representação do
recurso especificado.
- Apenas recupera dados!
verbo
GET
- Envia uma entidade a ser
processada.
- Dados da entidade e
informações adicionais
devem ser enviados no
corpo da requisição.
verbo
POST
- Envia uma entidade a ser
armazenada sob uma
determinada URI.
- Substitui a entidade, se já
existir. Se não existir, cria uma
na URI especificada.
verbo
PUT
- O recurso
especificado se fode
é deletado.
verbo
DELETE
Verbos (métodos) HTTP
GET POST PUT DELETE
seguro
idempot
ente
idempote
nte
idempotente
VERBO URI
CABEÇALHOS
CORPO
Mãos à obra!
http://www.google.com/chrome/
https://www.getpostman.com/
GET http://dummyimage.com/600x400
GET http://dummyimage.
com/600x400/ff0000/fff
GET http://dummyimage.
com/600x400/ff0000/fff&text=October
Test
GET http://dummyimage.com/640x400/%%%
WTF!?
HTTP Status Codes
Informação: 1xx
Sucesso: 2xx
Redirecionamento: 3xx
Erro do Cliente: 4xx
Erro do Servidor: 5xx
http://www.cheatography.com/kstep/cheat-sheets/http-status-codes/
GET http://jsonplaceholder.typicode.
com/posts/1
POST http://jsonplaceholder.typicode.
com/posts
Content-Type: application/json
{
"title": "Titulo 1",
"body": "Body 1",
"userID": 1
}
PUT http://jsonplaceholder.typicode.
com/posts/1
Content-Type: application/json
{
"id": 1,
"title": "Titulo 1",
"body": "Body 1",
"userID": 1
}
DELETE http://jsonplaceholder.typicode.
com/posts/1
#partiuautomação
https://www.jetbrains.com/pycharm/
http://www.python-requests.org/
https://www.python.org/
import unittest
import requests
class TestCases(unittest.TestCase):
pass
if __name__ == "__main__":
unittest.main()
class TestCases(unittest.TestCase):
def test_get_200(self):
msg="Test not implemented."
self.fail(msg)
def test_get_200(self):
uri = "http://apps.testinsane.com/rte/status/200"
r = requests.get(uri)
msg = "Incorrect status code: %d" % r.status_code
self.assertEqual(r.status_code, 200, msg)
def test_get_401(self):
uri = "http://apps.testinsane.com/rte/status/401"
r = requests.get(uri)
msg = "Incorrect status code: %d" % r.status_code
self.assertEqual(r.status_code, 401, msg)
POST
Enviar um payload
Header “content-type”
Validar conteúdo da resposta
import json
uri = "http://apps.testinsane.com/rte/status/200"
headers = {
"content-type": "application/json"
}
payload = {
"id": "1",
"name": "OctoberTest"
}
r = requests.post(uri,
data=json.dumps(payload),
headers=headers)
r_payload = r.json()
msg = "Incorrect status code: %d" % r.status_code
self.assertEqual(r.status_code, 200, msg)
msg = "Incorrect id: %s" % r_payload.get("id")
self.assertEqual(r_payload.get("id"),
payload.get("id"),
msg)
msg = "Incorrect name: %s" % r_payload.get
("name")
self.assertEqual(r_payload.get("name"),
"payload.get("name")",
msg)
def test_post_200(self):
uri = "http://apps.testinsane.com/rte/status/200"
headers = {
"content-type": "application/json"
}
payload = {
"id": "1",
"name": "OctoberTest"
}
r = requests.post(uri,
data=json.dumps(payload),
headers=headers)
r_payload = r.json()
msg = "Incorrect status code: %d" % r.status_code
self.assertEqual(r.status_code, 200, msg)
msg = "Incorrect id: %s" % r_payload.get("id")
self.assertEqual(r_payload.get("id"),
payload.get("id"),
msg)
msg = "Incorrect name: %s" % r_payload.get("name")
self.assertEqual(r_payload.get("name"),
"payload.get("name")",
msg)
E se o host mudar?
E se os endpoints mudarem?
E se a resposta tiver
234565639582 chaves?
MODULARIZAR!
api_helper.py
import requests
import json
HOST = "http://apps.testinsane.com/rte%s"
def get(endpoint):
uri = HOST % endpoint
return requests.get(uri)
def post(endpoint, headers, payload):
uri = HOST % endpoint
return requests.post(uri,
data=json.dumps(payload),
headers=headers)
json_helper.py
import logging
def compare(expected, actual):
all_match = True
for key, value in expected.
iteritems():
if not value==actual.get(key):
all_match = False
return all_match
* E se o valor de uma chave for uma lista ou objeto?
import api_helper
import json_helper
class TestCases(unittest.TestCase):
def test_get_200(self):
r = api_helper.get("/status/200")
msg = "Incorrect status code: %d" % r.status_code
self.assertEqual(r.status_code, 200, msg)
msg = "Response payload did not match the request payload."
self.assertTrue(json_helper.compare(payload, r_payload), msg)
BOAS PRÁTICAS!
Organizando os testes com o padrão “3 As”
def test_get_200(self):
# Arrange
endpoint = "/status/200"
# Act
r = api_helper.get(endpoint)
# Assert
msg = "Incorrect status code: %d" % r.status_code
self.assertEqual(r.status_code, 200, msg)
Funcional x Estrutural
login(username, password)
ou
login_as(user)
enter_name(username)
enter_password(password)
click_login()
Use “lint checkers”!
(PEP8: Style Guide for Python Code)
Código de teste entrega valor e deve ser
tratado como “código de produção”
YAGNI, DRY and KISS whenever you can!
AUTENTICAÇÃO
Basic Authentication
Autenticação simples (cabeçalhos
estáticos)
Encoding em Base64 durante a
trasnferência
Não criptografado
Digest Access
Authentication
Aplica hash MD5 nas credenciais
Mais seguro que Basic Auth
OAuth
Baseado na criação de “tokens” de
acesso para clientes terceiros
Aplicativos acessando sua conta do
Facebook ou CI SAAS acessando um
repositório no GitHub, por exemplo
from requests.auth import HTTPBasicAuth
basic_auth = HTTPBasicAuth('user', 'pass')
requests.get('https://api.github.com/user', auth=basic_auth)
from requests.auth import HTTPDigestAuth
digest_auth = HTTPDigestAuth('user', 'pass')
from requests_oauthlib import OAuth1
oauth = OAuth1('YOUR_APP_KEY', 'YOUR_APP_SECRET',
'USER_OAUTH_TOKEN',
'USER_OAUTH_TOKEN_SECRET')
http://docs.python-requests.org/en/latest/user/authentication/
Links e referências
https://github.com/chkile/minicurso-octobertest
http://www.w3.org/Protocols/
http://docs.python-requests.org/en/latest/
https://www.python.org/dev/peps/pep-0008/
charles@chaordic.com.br
charles.kilesse@outlook.com
@chkile

Mais conteúdo relacionado

Mais procurados

JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBLuciano Borges
 
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 controle de acesso com php e my sql
Criando controle de acesso com php e my sqlCriando controle de acesso com php e my sql
Criando controle de acesso com php e my sqlPaulo Damas
 
Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOLgrupoweblovers
 
modernizando a arquitertura de sua aplicação
modernizando a arquitertura  de sua aplicaçãomodernizando a arquitertura  de sua aplicação
modernizando a arquitertura de sua aplicaçãoAntonio Spinelli
 

Mais procurados (7)

Plugin zend acl
Plugin zend aclPlugin zend acl
Plugin zend acl
 
JQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEBJQuery Alagoinhas Dev Day - UNEB
JQuery Alagoinhas Dev Day - UNEB
 
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
 
PHP MySQL Aula 03
PHP MySQL Aula 03PHP MySQL Aula 03
PHP MySQL Aula 03
 
Criando controle de acesso com php e my sql
Criando controle de acesso com php e my sqlCriando controle de acesso com php e my sql
Criando controle de acesso com php e my sql
 
Play Framework - FLISOL
Play Framework - FLISOLPlay Framework - FLISOL
Play Framework - FLISOL
 
modernizando a arquitertura de sua aplicação
modernizando a arquitertura  de sua aplicaçãomodernizando a arquitertura  de sua aplicação
modernizando a arquitertura de sua aplicação
 

Semelhante a Restful Web Services Testes

uma história sobre testes de API
uma história sobre testes de APIuma história sobre testes de API
uma história sobre testes de APISamuel Lourenço
 
JavaOne LATAM 2016 - RESTful Services Simplificado com Spring Data REST
JavaOne LATAM 2016 - RESTful Services Simplificado com Spring Data RESTJavaOne LATAM 2016 - RESTful Services Simplificado com Spring Data REST
JavaOne LATAM 2016 - RESTful Services Simplificado com Spring Data RESTRodrigo Cândido da Silva
 
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
 
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1Thyago Maia
 
JavaOne LATAM 2016 - Combinando AngularJS com Java EE
JavaOne LATAM 2016 - Combinando AngularJS com Java EEJavaOne LATAM 2016 - Combinando AngularJS com Java EE
JavaOne LATAM 2016 - Combinando AngularJS com Java EERodrigo Cândido da Silva
 
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Helder da Rocha
 
Tony\'s Top 10 Computer Forensics Artifacts
Tony\'s Top 10 Computer Forensics ArtifactsTony\'s Top 10 Computer Forensics Artifacts
Tony\'s Top 10 Computer Forensics Artifactstonyrodrigues
 
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
 
Criando e consumindo webservice REST com PHP e JSON
Criando e consumindo webservice REST com PHP e JSONCriando e consumindo webservice REST com PHP e JSON
Criando e consumindo webservice REST com PHP e JSONAmbiente Livre
 
Criando e consumindo webservice REST com PHP e JSON
Criando e consumindo webservice REST com PHP e JSONCriando e consumindo webservice REST com PHP e JSON
Criando e consumindo webservice REST com PHP e JSONMarcio Junior Vieira
 
QCon 2015 - Combinando AngularJS com Java EE
QCon 2015 - Combinando AngularJS com Java EEQCon 2015 - Combinando AngularJS com Java EE
QCon 2015 - Combinando AngularJS com Java EERodrigo Cândido da Silva
 
Minicurso de PHP Com Ajax
Minicurso de PHP Com AjaxMinicurso de PHP Com Ajax
Minicurso de PHP Com AjaxAdler Medrado
 
JSP - Expression Language
JSP - Expression LanguageJSP - Expression Language
JSP - Expression LanguageAntonio Passos
 
Aula 5 PHP - Criação de sites II
Aula 5 PHP - Criação de sites IIAula 5 PHP - Criação de sites II
Aula 5 PHP - Criação de sites IIinfo_cimol
 
Do Rest Ao Restfull - Rio Jug
Do Rest Ao Restfull - Rio JugDo Rest Ao Restfull - Rio Jug
Do Rest Ao Restfull - Rio JugSergio Azevedo
 
Monitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com ZabbixMonitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com ZabbixAndré Déo
 

Semelhante a Restful Web Services Testes (20)

uma história sobre testes de API
uma história sobre testes de APIuma história sobre testes de API
uma história sobre testes de API
 
JavaOne LATAM 2016 - RESTful Services Simplificado com Spring Data REST
JavaOne LATAM 2016 - RESTful Services Simplificado com Spring Data RESTJavaOne LATAM 2016 - RESTful Services Simplificado com Spring Data REST
JavaOne LATAM 2016 - RESTful Services Simplificado com Spring Data REST
 
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
 
Web Services Rest
Web Services RestWeb Services Rest
Web Services Rest
 
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
Desenvolvimento de Sistemas Web com PHP Frameworks - 2019.1 - Aula 1
 
JavaOne LATAM 2016 - Combinando AngularJS com Java EE
JavaOne LATAM 2016 - Combinando AngularJS com Java EEJavaOne LATAM 2016 - Combinando AngularJS com Java EE
JavaOne LATAM 2016 - Combinando AngularJS com Java EE
 
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
Curso de RESTful WebServices em Java com JAX-RS (Java EE 7)
 
Tony\'s Top 10 Computer Forensics Artifacts
Tony\'s Top 10 Computer Forensics ArtifactsTony\'s Top 10 Computer Forensics Artifacts
Tony\'s Top 10 Computer Forensics Artifacts
 
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
 
Beagajs
BeagajsBeagajs
Beagajs
 
Wicket 2008
Wicket 2008Wicket 2008
Wicket 2008
 
Criando e consumindo webservice REST com PHP e JSON
Criando e consumindo webservice REST com PHP e JSONCriando e consumindo webservice REST com PHP e JSON
Criando e consumindo webservice REST com PHP e JSON
 
Criando e consumindo webservice REST com PHP e JSON
Criando e consumindo webservice REST com PHP e JSONCriando e consumindo webservice REST com PHP e JSON
Criando e consumindo webservice REST com PHP e JSON
 
QCon 2015 - Combinando AngularJS com Java EE
QCon 2015 - Combinando AngularJS com Java EEQCon 2015 - Combinando AngularJS com Java EE
QCon 2015 - Combinando AngularJS com Java EE
 
GUJavaSC - Combinando AngularJS com Java EE
GUJavaSC - Combinando AngularJS com Java EEGUJavaSC - Combinando AngularJS com Java EE
GUJavaSC - Combinando AngularJS com Java EE
 
Minicurso de PHP Com Ajax
Minicurso de PHP Com AjaxMinicurso de PHP Com Ajax
Minicurso de PHP Com Ajax
 
JSP - Expression Language
JSP - Expression LanguageJSP - Expression Language
JSP - Expression Language
 
Aula 5 PHP - Criação de sites II
Aula 5 PHP - Criação de sites IIAula 5 PHP - Criação de sites II
Aula 5 PHP - Criação de sites II
 
Do Rest Ao Restfull - Rio Jug
Do Rest Ao Restfull - Rio JugDo Rest Ao Restfull - Rio Jug
Do Rest Ao Restfull - Rio Jug
 
Monitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com ZabbixMonitoramento de Aplicações Web Modernas com Zabbix
Monitoramento de Aplicações Web Modernas com Zabbix
 

Restful Web Services Testes