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/e2e/typeformAPI.cy.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.config.js (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 methodurlheaders, 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.config.js e cypress.env.json (este com um token de acesso exemplo, visto que é um dado sensível).

// cypress.config.js

const { defineConfig } = require('cypress')

module.exports = defineConfig({
  e2e: {
    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 os cursos da Escola TAT.


👋  Até a próxima e bons testes!

10 comentários em “Como testar APIs que necessitam um token de acesso com Cypress

  1. 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. =)

  2. Ó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?

    1. 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.

      1. Isto sempre me gera uma duvida, ja tentei abordar isto de diversas formas. Até hoje nunca achei uma que me atendesse.

        Tenho uma API de autorização, num cenario onde uso o Cypress para fazer testes de API, tenho algumas API’s que precisam de autoização. Sempre fico em duvida qual seria o correto se em todos os testes eu teria que chamar a autenticação antes, ou se seria reaproveitar o token gerado pelo teste na API de login e usar este token previamente gerado nos demais testes.

        Na primeira alternativa que seria chamar a API de Autorização antes de cada teste não me atende pois num cenario onde tenho mais 100 rotas para chamar eu precisaria fazer 200 request.

        Usando o cy.task para salvar numa variavel o token e poder reaproveitar ele também não deu muito bom, em alguns momentos a variavel acaba vinda como Undefined e ainda não consegui entender o que fiz de errado na implementação.

        Estou cojitando agora incluir uma logica que no primeiro teste da API de autorização eu gravo o token e a data de expiração num arquivo, e nos demais testes chamar uma função que faz a leitura deste arquivo verifica a data de expiração e faz o teste e caso o arquivo esteja vazio ou com a data vencida ele chama a api de autorização.

Deixe um comentário