Apresentação de apoio utilizada no minicurso "Testando RESTful web services", ministrado no OctoberTest 2015, em Florianópolis (www.octobertest.com.br). Neste curso abordamos web services RESTful (ou REST APIs), entendendo seu funcionamento e os desafios que eles trazem para nós testadores. Durante o curso foram apresentados os principais conceitos relacionados a esse tipo de serviço (verbos, response codes, cabeçalhos, payloads e autenticação) e como podemos testá-lo de maneira exploratória ou com testes automatizados, além de apontar insights de possíveis cenários de testes relacionados aos conceitos apresentados. Durante o curso, utilizamos a linguagem de programação Python e abordamos os testes automatizados sem nos preocupar com ferramentas específicas para esse tipo de teste, mantendo o foco nos conceitos base.
3. • 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
11. Verbos (métodos) HTTP
GET POST PUT DELETE
OPTIONS
HEADCONNECT TRACE
http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
12. Verbos (métodos) HTTP
GET POST PUT DELETE
OPTIONS
HEADCONNECT TRACE
http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
este curso
13. - Solicita uma representação do
recurso especificado.
- Apenas recupera dados!
verbo
GET
14. - Envia uma entidade a ser
processada.
- Dados da entidade e
informações adicionais
devem ser enviados no
corpo da requisição.
verbo
POST
15. - 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
54. 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?
55. 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)
56. msg = "Response payload did not match the request payload."
self.assertTrue(json_helper.compare(payload, r_payload), msg)
67. 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
68. 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/