Python Requests & Spotify Web API

Fazendo requests para a API do Spotify via Python Requests

Ketlin Pedron
8 min readSep 19, 2020

Este é o Terceiro Post da série: Testes de Contrato utilizando Python

Photo by Chris Ried on Unsplash

Caso você ainda não conheça sobre a API do Spotify, recomendo que você leia primeiro e execute os passos da parte 1 do artigo, onde eu mostro como realizar autenticação no Spotify e como utilizar 2 endpoints, tudo isso utilizando Postman.

Neste artigo, vou partir do pressuposto que você sabe o que são Requests HTTP e apenas deseja um exemplo de como fazer requests utilizando Python. Além de mostrar como executar, vou fornecer um exemplo de estrutura de projeto, onde todos os elementos do projeto são definidos de forma clara e você poderá usar como base para futuros projetos. 😃

1. Python Requests

Requests permitem que você envie HTTP requests (GET, POST, PUT, DEL), podendo utilizar opções de autenticação, criar headers, params, etc. Tudo isso de forma muito fácil. O Python possui um pacote para utilizar requests, maiores informações você pode encontrar aqui.

2. Estruturando o Projeto

Eu vou utilizar o Pycharm como IDE para manipular meu projeto Python. Gostaria de lembrar que meu papel neste artigo não é ensinar conceitos do Python, o grande objetivo é fazer com que você entenda como utilizar Python Request e ainda poder utilizar o que vimos do Spotify no artigo anterior.

Após criar o projeto no Pycharm, minha sugestão de estrutura de projeto é a seguinte:

  • Requests é onde iremos concentrar nossos métodos para realizar requisições HTTP.
  • Resources é onde teremos métodos auxiliares e nosso arquivo data. O data armazena configurações e informações para serem utilizadas no decorrer do teste.
  • Tests é a pasta onde permanecerá todos os nossos testes.

Gostaria de enfatizar que é uma boa prática de desenvolvimento, criar um ambiente virtual dentro do seu projeto (venv). Utilizando um venv, você estará isolando seu projeto do seu sistema operacional, desta forma, a instalação dos pacotes deve ser efeita obrigatoriamente dentro do projeto. Neste link é possível ler sobre como criar um venv dentro do seu projeto no Pycharm.

3. Criando a request de autenticação

Vamos começar com a parte de autenticação, a final, a partir dela é que conseguimos utilizar todo o resto. Eu criei um arquivo de request separado para OAuth2 porque é um assunto que exige bastante atenção e, por consequência, um detalhamento melhor. Comece instalando o pacote requests oauthlib, no qual é responsável por realizar autenticação OAuth via python requests:

pip install requests_oauthlib

Obs.: Não irei explicar os conceitos de OAuth2 porque é um assunto que por sí só dá um post. Ficará para um artigo futuro 😉

Em request_oauth2.py adicione uma classe com as seguintes funções:

A função access_token_get é responsável por obter o primeiro token, porém se ele já existir e estiver expirado o tempo de uso, será chamada uma função para atualizar o token (token_refresh). Em ambos os casos, será retornado para o caso de teste um token pronto para uso.

4. Criando o Utils

Agora vamos criar nosso utils.py dentro da pasta Resources:

  • load_json_file será utilizada para procurar e abrir nosso arquivo data.json.
  • update_json_file será utilizada para abrir nosso data.json e atualizar as informações que estiverem nele (Exemplo: atualizar o token de acesso).
  • check_timestamp_is_old será utilizada para validar se o token de acesso já expirou, comparando o timestamp atual do sistema com o timestamp que está salvo em data.json.

5. Criando o Data

Como já falamos acima sobre o data.json, vamos configurá-lo. Crie o data.json dentro da pasta Resources:

  • client_id: Lembra das credenciais que utilizamos no artigo anterior? Então, agora você vai colar no data.json o client_id e o seu client_secret
  • callback_uri: Aqui você também irá colar a callback_uri que utilizamos no artigo anterior.
  • scope: Vamos utilizar os scopes necessários para editar as playlists, da mesma forma que fizemos no artigo anterior. 😃
  • token: Vamos apenas deixar este campo previamente criado no data.json. Na primeira interação de autenticação, nosso algoritmo presente em request_oauth2.py, irá verificar se existe alguma informação em token, como não existe ele irá criar um, e vai atualizar o data.json com esta nova informação.

Recapitulando o que fizemos até agora

✔️ Criamos nossa classe para realizar autenticação

✔️ Criamos o utils para poder realizar algumas operações

✔️ Configuramos o data.json

6. Criando as Requests

É provável que ao instalar o OAuth no item 3 ele já tenha instalado o python requests, porém para garantir, execute:

pip install requests

Agora, dentro da pasta Requests, crie o arquivo requests.py com a seguinte classe e funções:

  • playlists_get: É a função que chamaremos para listar todas as playlists do nosso user id. No meu exemplo estou solicitando a visualização de apenas 1 playlist (limit). Observe que é utilizado o método GET do requests.
  • playlist_create: É a função que chamaremos para criar uma nova playlist para nosso user id. As informações da playlist (campo body) deverão ser criadas durante o caso de teste. A função recebe os parâmetros, formata e realiza uma request do tipo POST.

Você poderá criar quantas funções de request que precisar. O legal de mantermos separadas do caso de teste é que fica de fácil visualização e manutenção.

7. Criando os casos de teste

Na pasta tests, crie o arquivo test_playlists.py. Neste arquivo de teste manteremos apenas testes relacionados à configuração de playlist. Se você desejar, por exemplo, realizar testes sobre seguidores, conta do usuário, busca, etc, recomendo que você crie outros arquivos de teste. Exemplo: test_user.py, test_search.py (…)

Para o nosso exemplo, teremos por enquanto o seguinte (separei em 3 partes):

  • setUp: é o método que permite definir instruções que serão executadas antes de cada caso de teste. Nesse exemplo, estou realizando 3 coisas: Primeiro estou carregando as informações presente em data.json; Segundo estou obtendo meu access_token e disponibilizando em uma variável para ser utilizada no caso de teste; Em terceiro estou instanciando minha classe Requests (que foi criado no item 6) em uma variável que também será utilizada durante o caso de teste.
  • test_get_playlists: É um caso de teste responsável por testar se é possível obter uma lista de playlists do nosso user id. Repare que aqui é utilizado o access_token (agora as coisas estão fazendo sentido, né my friend?) e estou mandando meu user id (kpedron). Neste caso de teste estou apenas avaliando se o status code é 200, no próximo artigo sobre “testes de contrato” irei aprofundar um pouco mais, detalhando por exemplo, como validar os campos que são retornados na response.
  • test_create_new_playlist: Este caso de teste valida a criação de uma nova playlist para o nosso user id. No body, vamos escrever algumas informações básicas da nossa playlist a ser criada. Neste caso de teste, o status code esperado é o 201, ou seja, foi possível realizar o create.

Se você quiser saber um pouco mais sobre os status code, vá aqui.

Para finalizar nosso arquivo test_playlists.py, criamos o tearDown, que é um método que permite definir instruções que serão executadas ao final de cada caso de teste. Nesse caso, estamos dizendo para o tearDown atualizar no data.json o token que foi obtido lá no setUp 😉

Recapitulando novamente o que fizemos

✔️ Criamos nossa classe para realizar autenticação

✔️ Criamos o utils para poder realizar algumas operações

✔️ Configuramos o data.json

✔️ Criamos as nossas requests

✔️ Criamos os casos de teste

Executando o teste

A hora da verdade chegou, vamos executar o teste utilizando o pytest. Primeiro é necessário instalar:

pip install pytest

Navegue até a pasta tests, dentro do projeto, e execute:

A opção -s habilita a interação do usuário durante a execução do teste. Quando ainda não existe token salvo no data.json (lembra?) o algoritmo irá solicitar ajuda do usuário para obter o primeiro token. Será necessário: copiar o authorization URL → colar no navegador → enter → a URL com o callback irá retornar → copiar esta URL → colar a URL no terminal.

Como parece ser meio complicado explicar escrevendo, observe o gif abaixo:

Durante o procedimento acima, é possível que o Spotify solicite que você faça um login, caso ainda não o tenha feito no seu navegador. Caso isso aconteça, uma tela parecida com essa irá aparecer para você:

Se esta tela aparecer, faça o login normalmente e, em seguida, você será redirecionado para a URL Callback, copie ela. Enfim, o passo será o mesmo, a única diferença é que apareceu uma tela de login no meio.

Após a execução do teste, você poderá abrir o data.json e visualizar o seguinte:

Executando o teste novamente

Agora vou mostrar um exemplo quando a autenticação já foi feita e o data.json possui o access_token e o refresh_token. Nesta situação, não será mais necessário o usuário interagir com o terminal, porque o algoritmo irá fazer a validação e refresh do token sozinho.

Conclusão

Neste artigo, você pôde ver detalhadamente um exemplo de teste de web API utilizando Python Requests. O Requests em sí não é algo muito complicado, as grandes dificuldades estão em:

  • Saber como estruturar um projeto de testes de forma modular e, que fique claro para outros membros da equipe de teste.
  • A dificuldade em realizar autenticação OAuth2 durante a execução de testes automatizados.

No exemplo que mostrei, foi possível ver na prática como estruturar um projeto de testes de API e como automatizar o processo de OAuth2. Também vimos exemplos simples de python requests para executar GET e POST. A partir disso tudo que você viu, você poderá criar novos testes e novos métodos!

Agora que você já possui uma base de conhecimento, o próximo artigo (e final) dessa série, irá apresentar um exemplo mais profundo para explicar o funcionamento de Testes de Contrato utilizando python. 😄

Lembrando que, caso você tenha qualquer dúvida sobre este artigo ou os anteriores, fique à vontade para me enviar uma mensagem. Caso contrário, te vejo no próximo post 😉

Ahhh, e se você quiser fazer o download do código apresentado, você pode conferir no meu GitHub. 💙

--

--

Ketlin Pedron

Tendo experiência como developer e QA, tem a missão de contribuir nos times para que a Qualidade esteja presente, desde o início até a última entrega.