Aprenda como testar APIs com Cypress, quando um access token é necessário
O Cypress é uma excelente ferramenta para os mais diversos tipos de testes automatizados.
Dentre esses tipos de testes, facilmente é possível criar e executar testes de API com Cypress.
Para tais testes, o Cypress oferece a funcionalidade cy.request().
Mas e o que fazer quando a API que preciso testar necessita de um token de acesso? 🔐
Que bom que perguntou.
Aí vai um exemplo, utilizando a API do Typeform, a qual exige tal token.
Para este exemplo, irei mostrar um requisição do tipo GET, para buscar minhas informações, porém, o mesmo se aplica para outros tipos de requisições, tais como POST, PUT, ou DELETE.
// cypress/integration/typeformAPI.spec.js const API_URL = Cypress.env('API_BASE_URL') const authorization = `Bearer ${Cypress.env('ACCESS_TOKEN')}` it('retrieves my user information', () => { cy.request({ method: 'GET', url: `${API_URL}/me`, headers: { authorization } }).should(({ status, body }) => { const { alias, email, language } = body expect(status).to.eq(200) expect(alias).to.eq('Walmyr Filho') expect(email).to.eq('walmyr@example.com') expect(language).to.eq('en') }) })
No teste acima, primeiro defino duas variáveis (API_URL e authorization), ambas vindo de variáveis, sendo a primeira definida no arquivo cypress.json (ver mais abaixo) e a outra no arquivo cypress.env.json (arquivo não versionado, visto que é onde armazeno dados sensíveis, tais como o ACCESS_TOKEN).
Note que para a variável authorization, à estou interpolando com a string Bearer, visto que é esse tipo de token que a API do Typeform utiliza.
Logo após, defino o teste que obtém as informações do meu usuário, em um bloco it (meu caso de teste).
Na função de callback do bloco it, executo o comando cy.request(), o qual, neste caso, recebe como argumento um objeto, com as propriedades method, url e headers, com seus respectivos valores, onde no caso dos cabeçalhos (headers) passo a variável que define o token de acesso.
Com a requisição realizada, encadeio o comando .should(), o qual recebe uma função de callback como argumento, e para tal função de callback, passo como argumento as propriedades status e body a partir do objeto de resposta da requisição, por meio de desestruturação de objetos.
No corpo da função de callback, desestruturo as propriedades alias, email e language a partir da propiedade body, visto que estes são os valores os quais usarei para minhas verificações de resultado esperado (além do status).
Por fim, verifico que o status da requisição é de sucesso (200), além de verificar que os valores das variáveis alias, email e language são iguais aos valores esperados (Walmyr Filho, walmyr@example.com e en, respectivamente).
Veja também a definição dos arquivos cypress.json e cypress.env.json (este com um token de acesso exemplo, visto que é um dado sensível).
// cypress.json { "env": { "API_BASE_URL": "https://api.typeform.com" } }
// cypress.env.json { "ACCESS_TOKEN": "token-de-acesso-aqui" }
É assim que passo o token de acesso nos headers da requisição, para ter as permissões necessárias para fazer as chamadas à API.
Gostou dessa “pitada de Cypress”?
Deixa um comentário.
Ficou curioso(a) e quer aprender mais sobre automação de testes com Cypress? Conheça meus cursos no Udemy.
- Cypress básico
- Cypress intermediário
- Cypress avançado
- Boas práticas em automação de testes com Cypress
- Testes end-to-end com Cypress
- Testes de regressão visual com Cypress e Percy (básico)
👋 Até a próxima e bons testes!
Achei interessante que você busca variáveis de ambiente em dois arquivos diferentes (cypress.json e cypress.env.json) usando o mesmo método (Cypress.env()) e o Cypress retorna sem problema algum. =)
Sim Eduardo, é isso mesmo.
Para mais detalhes, recomendo ler a documentação oficial https://docs.cypress.io/api/cypress-api/env
Ótimo conteúdo, preciso me aprofundar em testes de API, por isso tenho uma dúvida, quanto ao token de acesso, da forma que colocou ele é único, certo? E no caso da necessidade de gerar um novo token a cada longIn, por exemplo, há a possibilidade de fazer essa alteração na variável que armazena o token?
Oi Pedro, obrigado pelo feedback!
Sobre sua dúvida, recomendo assistir aos vídeos da playlist API Testing no Canal TAT no YouTube.
Já demonstrei isso em alguns vídeos.
Segue o link: https://youtube.com/playlist?list=PL-eblSNRj0QGkMqsqxUvy7VI4VfXEUp-G
Neste caso, recomendo fazer uma requisição que gera o token e à ela encadeie um .then que recebe uma função de callback. Daí, nesta função de callback vice faz a próxima requisição, usando o token recém gerado.