Este conteúdo é uma tradução do blog post Authenticate faster in tests with the cy.session command, escrito pelo time do Cypress e publicado em 4 de Agosto de 2021.
Hoje ajudaremos você a reduzir o tempo que leva para fazer login antes de cada teste, com a introdução do comando experimental cy.session(), novo na versão 8.2.0 do Cypress.
Mas antes, vamos dar uma “refrescada” no conceito de login
Ao testar uma aplicação que requer autenticação, é comum criar um comando customizado cy.login() ou uma função auxiliar de login para fazer login na aplicação:
Cypress.Commands.add('login', (username, password) => {
cy.visit('/login')
cy.get('[data-test=username]').type(username)
cy.get('[data-test=password]').type(password)
cy.get('#login').click()
cy.url().should('contain', '/login-successful')
})
Para garantir que seus testes possam acessar a aplicação, você precisa chamar o comando cy.login() para fazer login antes de cada teste. Frequentemente, isso é feito em um hook beforeEach:
describe('User account page', () => {
beforeEach(() => {
cy.login('user1', 'p4ssw0rd123')
})
it('should actually be accessible', () => {
cy.visit('/account')
})
it('should have the correct page title', () => {
cy.visit('/account')
cy.title().should('eq', 'Account Details for User 1')
})
})
Embora fazer o login antes de cada teste seja uma prática recomendada, o processo de login pode ser lento, e às vezes, as pessoas tentam contorná-lo fazendo login apenas uma vez por arquivo de especificação em um hook before, ou usando a API Cypress.Cookies, para persistir os cookies através dos testes. No entanto, fazer com que os testes se baseiem no estado de testes anteriores não é uma prática recomendada e deve ser evitado.
Armazenando sessões no cache ao fazer login
O novo comando cy.session() resolve esse problema armazenando e restaurando do cache os cookies, localStorage e sessionStorage após um login bem-sucedido. As etapas que seu código de login executa para criar a sessão serão realizadas apenas uma vez, quando for chamado pela primeira vez em qualquer arquivo de especificação. As chamadas subsequentes irão restaurar a sessão do cache.
Você pode facilmente atualizar seu comando customizado cy.login() ou função auxiliar de login para usar o comando cy.session(), assim:
Cypress.Commands.add('login', (username, password) => {
cy.session([username, password], () => {
cy.visit('/login')
cy.get('[data-test=username]').type(username)
cy.get('[data-test=password]').type(password)
cy.get('#login').click()
cy.url().should('contain', '/login-successful')
})
})
Observe que, para garantir que as sessões sejam criadas de forma consistente, o Cypress limpa a página depois que o cy.session() é chamado, portanto, o cy.visit() sempre precisará ser chamado explicitamente depois.
Felizmente, chamar explicitamente o cy.visit() torna seus testes mais legíveis. E como o cy.session() armazena os dados da sessão em cache, seus testes não precisarão depender de serviços externos e interações de UI, o que os torna mais rápido.
Trocando usuários durante os testes
Quando você executa o comando cy.session(), ele limpa automaticamente a sessão ativa antes de executar seu código de login, de forma que além de acelerar o processo de login, alternar entre usuários em um único teste será mais rápido, pois você não precisará efetuar logout explicitamente antes de efetuar login com um usuário diferente.
it('should transfer money between users', () => {
cy.login('user', 's3cr3t')
cy.visit('/account')
cy.get('#amount').type('100.00')
cy.get('#send-money').click()
// you don't need to log out here!
cy.login('other-user', 'p4ssw0rd')
cy.visit('/account')
cy.get('#balance').should('eq', '100.00')
})
Como os usuários não precisam mais ser desconectados e porque a sessão ativa está sendo completamente apagada e restaurada, alternar entre os usuários em um teste pode se comportar mais como se vários usuários estivessem usando navegadores diferentes, em vez de vários usuários se revezando no mesmo navegador, o que permite que seus testes se assemelhem mais ao uso no mundo real.
É claro que você pode continuar fazendo logout a qualquer momento que precisar, pois o cy.session() irá detectar automaticamente as sessões inválidas, usando uma função de validação que você definir.
Usando o comando session
Depois de atualizar para a versão 8.2.0 do Cypress, você pode começar a usar esse recurso definindo a configuração experimentalSessionSupport como true.
Certifique-se de verificar a documentação do comando cy.session() para obter mais detalhes, o changelog para uma lista completa de correções e o guia de migração para ajudá-lo(a) com sua atualização.
Gostaríamos de ouví-lo(a)!
A equipe do Cypress tem trabalhado muito para oferecer essa experiência aprimorada. Estamos entusiasmados em trazer essas novas APIs para os(as) usuários(as) do Cypress e, como sempre, estamos ansiosos para ouvir seus comentários.
Você pode enviar uma issue no Github ou bater um papo conosco em nosso Discord. Especialmente enquanto esse recurso é experimental, os envios de problemas são essenciais. Obrigado pelo seu apoio e bons testes!
Time do Cypress
Atualização: A partir da versão 9.6.0 do Cypress, a configuração experimentalSessionSupport deixa de valer em favor da configuração experimentalSessionAndOrigin.
Para mais detalhes, leia o post Cypress 9.6.0: Teste facilmente fluxos de trabalho que percorrem diferentes domínios com o comando cy.origin.
Walmyr eu não sei se esse ajuste veio depois da versão que você criou este arquivo, mas para funcionar pra mim eu tive que adicionar essa linha de código no cypress.json:
“experimentalSessionSupport”: true
Assim como explicito na documentação https://docs.cypress.io/api/commands/session#Syntax
Felipe, é exatamente isso que está descrito aqui no conteúdo, na sessão ‘Usando o commando session’:
Depois de atualizar para a versão 8.2.0 do Cypress, você pode começar a usar esse recurso definindo a configuração experimentalSessionSupport como true.
Olá Walmyr, tenho acompanhado o seu blog e tem sido muito útil no cotidiano. Obrigada pelo conteúdo compartilhado.
Tenho um questionamento, você sabe se o cy.session substituiria o login via background? Tem casos de aplicações que o login via requisições pode ser bem complexo, dada as implementações de segurança que tem sido feitas..
Até li na documentação do Cypress exemplos de cy.session com login background. Mas ainda não ficou muito claro pra mim qual seria o ganho de utilizar o cy.session com login background.
Oi Vanessa, não substituiria 100%, visto que ao menos uma vez por arquivo de teste o login teria que ocorrer via interface gráfica, porém, melhor do que ter que passar pela interface gráfica várias vezes.
Portanto, recomendo o uso.