No nosso anterior artigo, vimos as configurações no Cypress e várias opções que podem ser configuradas em arquivos JSON. Este artigo vai entender Promessa de Cipreste e Cipreste Assíncrono comportamento com implementação prática e exemplos em nosso projeto. Também discutiremos como incorporar awaits em nosso código assíncrono e algumas funções essenciais, como wrap()
e task()
. Vamos começar!
Cypress Promise e Cypress Asynchronous:
Promessa de Cipreste e Cipreste Assíncrono natureza são alguns dos conceitos essenciais. Como qualquer outro framework Javascript, Cypress também gira em torno de Assíncrono e Promessas. Cypress lida com todo o comportamento assíncrono internamente e é escondido do usuário. Nós vamos usar .then()
para lidar com promessas manualmente em nosso código. Existem pacotes externos como o Cypress-promessa no npm, onde podemos manipular o comportamento assíncrono do Cypress. Discutiremos cada um desses tópicos em detalhes.
Conteúdo
Cipreste Assíncrono
Como sabemos, o Cypress é baseado em Nó JS. Qualquer estrutura escrita a partir de Node.js é assíncrono. Antes de entender o comportamento assíncrono do Cypress, devemos saber a diferença entre a natureza síncrona e assíncrona.
Natureza síncrona
Em um programa síncrono, durante a execução de um código, somente se a primeira linha for executada com sucesso, a segunda linha será executada. Ele espera até que a primeira linha seja executada. Ele é executado sequencialmente.
Natureza assíncrona
O código é executado simultaneamente, espera que cada etapa seja executada sem incomodar o estado do comando anterior. Embora tenhamos escrito nosso código sequencialmente, o código assíncrono é executado sem esperar a conclusão de qualquer etapa e é completamente independente do comando / código anterior.
O que é assíncrono no Cypress?
Todos os comandos do Cypress são assíncronos por natureza. O Cypress tem um invólucro que entende o código sequencial que escrevemos, os enfileira no invólucro e é executado posteriormente quando executamos o código. Então, Cypress faz todo o nosso trabalho que está relacionado à natureza assíncrona e promessas!
Vamos entender um exemplo disso.
it('clique na opção de tecnologia para navegar até a URL da tecnologia', function () { cy.visit('https://techiescience.com/') // Nenhum comando é executado //clique na opção de tecnologia cy. get('.fl-node-5f05604c3188e > .fl-col-content > .fl-module > .fl-module-content > .fl-photo > .fl-photo-content > a > .fl-photo-img' ) // Nada é executado aqui também .click() // Nada acontece ainda cy.url() // Nenhum comando é executado aqui também .should('include', '/technology') // Não, nada. }); // Agora, todas as funções de teste foram executadas // Cypress colocou todos os comandos na fila e agora eles serão executados em sequência
Isso foi muito simples e divertido. Agora entendemos como os comandos Cypress Asynchronous funcionam. Vamos mergulhar mais fundo em onde estamos tentando misturar código de sincronização e código assíncrono.
Combinando comandos Cypress Synchronous e Asynchronous
Como vimos, os comandos do Cypress são assíncronos. Ao injetar qualquer código síncrono, o Cypress não espera que o código de sincronização seja executado; portanto, os comandos de sincronização são executados primeiro, mesmo sem esperar por nenhum comando Cypress anterior. Vejamos um pequeno exemplo para entender melhor.
it('clique na opção de tecnologia para navegar até o URL da tecnologia', function () { cy.visit('https://techiescience.com/') //clique na opção de tecnologia cy.get('.fl- node-5f05604c3188e > .fl-col-content > .fl-module > .fl-module-content > .fl-photo > .fl-photo-content > a > .fl-photo-img') .click() cy .url() // Nenhum comando executado aqui também .should('include', '/technology') // Não, nada. console.log("Isso é para verificar o log") // Log para verificar o comportamento assíncrono }); });
O log é adicionado ao final do código, que é um comando de sincronização. Quando executamos o teste, você pode ver que o log foi impresso antes mesmo de a página ser carregada. Desta forma, o Cypress não espera pelo comando síncrono e o executa antes mesmo de executar seus comandos.
Se quisermos que eles sejam executados conforme o esperado, devemos envolvê-los dentro do .then()
função. Vamos entender com um exemplo.
it('clique na opção de tecnologia para navegar até o URL da tecnologia', function () { cy.visit('https://techiescience.com/') //clique na opção de tecnologia cy.get('.fl- node-5f05604c3188e > .fl-col-content > .fl-module > .fl-module-content > .fl-photo > .fl-photo-content > a > .fl-photo-img') .click() cy .url() // Nenhum comando executado aqui também .should('include', '/technology') // Não, nada. .then(() => { console.log("Isso é para verificar o log") // Log para verificar o comportamento assíncrono }); });
O que é Cypress Promise?
Como vimos acima, o Cypress enfileira todos os comandos antes da execução. Para reformular em detalhes, podemos dizer que Cypress adiciona promessas (comandos) em uma cadeia de promessas. Cypress soma todos os comandos como uma promessa em uma cadeia.
Para entender as promessas, compare-as com um cenário da vida real. A explicação também define a Promessa em natureza assíncrona. Se alguém te promete, eles também rejeitar or cumprir a declaração que eles fizeram. Da mesma forma, no modo assíncrono, promete rejeitar or cumprir o código que envolvemos em uma promessa.
No entanto, o Cypress cuida de todas as promessas e não é necessário manipulá-las com nosso código personalizado. Como programadores de Javascript, ficamos curiosos sobre como usar aguarda em nossos comandos. As APIs do Cypress são completamente diferentes do que estamos acostumados em geral. Veremos isso em uma parte posterior deste tutorial em profundidade.
Estados das promessas de cipreste
As promessas têm três estados diferentes com base nos comandos Cypress. Eles estão
- Resolvido - Ocorre quando o passo / comando é executado com sucesso.
- Pendente - Indique onde a execução foi iniciada, mas o resultado é incerto.
- Rejeição - Ocorre quando a etapa falha.
Como um programador Javascript, temos a tendência de escrever promessas em nosso código e devolvê-las. Por exemplo,
//Este código é apenas para demonstração description('Exemplo Cypress ', function () { it('clique na opção de tecnologia para navegar até o URL da tecnologia', function () { cy.visit('https://techiescience. com/') //clique na opção de tecnologia cy.get('.fl-node-5f05604c3188e > .fl-col-content > .fl-module > .fl-module-content > .fl-photo > .fl- conteúdo da foto > a > .fl-photo-img') .then(() => { return cy.click(); }) cy.url() .then(() => { return cy.should(' include', '/tecnologia') }) }); });
Aqui, estamos retornando promessas a cada um dos comandos. Isso não é necessário no Cypress. Felizmente, o Cypress cuida de todas as promessas internamente e não precisamos adicionar promessas a cada etapa. Cypress tem o capacidade de repetição opção, onde ele tenta novamente por um determinado período de tempo para executar o comando. Veremos um exemplo de código sem incluir promessas manualmente.
it('clique na opção de tecnologia para navegar até o URL da tecnologia', function () { cy.visit('https://techiescience.com/') //clique na opção de tecnologia cy.get('.fl- node-5f05604c3188e > .fl-col-content > .fl-module > .fl-module-content > .fl-photo > .fl-photo-content > a > .fl-photo-img') .click() cy .url() .should('incluir', '/tecnologia') }); });
O código acima não é desajeitado e é fácil de ler e entender. Cypress lida com todo o trabalho de promessa, e é escondido do usuário. Portanto, não precisamos nos preocupar em lidar ou devolver as promessas em lugar algum!
Como você usa o await no Cypress?
Conforme discutido acima, o Cypress tem sua maneira de lidar com código assíncrono criando uma fila de comandos e os executando em sequência. Adicionando awaits
aos comandos não funcionará conforme o esperado. Uma vez que Cypress está lidando com tudo internamente, eu recomendo não adicionar awaits
ao código.
Se você precisar adicionar awaits, pode usar uma biblioteca de terceiros como Promessa cipreste isso muda a forma como o Cypress funciona. Esta biblioteca permitirá que você use promessas nos comandos e use aguardam no código
Vamos entender as maneiras de usar o Wait e como não usá-lo.
Você não deve usar o Wait assim
//Não use await desta forma description('Visite a página', () => { (async () => { cy.visit('https://techiescience.com/') await cy.url(). deveria('incluir', '/tecnologia'); })() })
Em vez disso, você pode usar assim
descreva('Visite a página', () => { cy.visit('https://techiescience.com/').then(async () => aguarde cy.url().should('include', ' /tecnologia') ()) })
Isso funcionará para qualquer comando Cypress.
Envoltório de Cipreste
wrap()
é uma função no Cypress que produz qualquer objeto que seja passado como um argumento.
Sintaxe
cy.wrap(subject)
cy.wrap(subject, options)
Vejamos um exemplo de como acessar wrap()
em nosso código.
const getName = () => { return 'Cavalo' } cy.wrap({ nome: getNome }).invoke('nome').should('eq', 'Cavalo') // true
No exemplo, estamos envolvendo o getName
e invoque o nome para ele.
Promessa de Cipreste
Podemos quebrar as promessas que são retornadas pelo código. Os comandos irão esperar que a promessa seja resolvida antes de acessar o valor gerado e. em seguida, prossiga para o próximo comando ou asserção.
const customPromise = new Promise((resolve, rejeitar) => { // usamos a função setTimeout() para acessar o código assíncrono. setTimeout(() => { resolve({ type: 'success', message: 'Apples and Oranges' , }) }, 2500) }) it('deve esperar que as promessas sejam resolvidas', () => { cy.wrap(customPromise).its('message').should('eq', 'Apples and Oranges' ) });
Quando o argumento em cy.wrap()
é uma promessa, vai esperar que a promessa seja resolvida. Se a promessa for rejeitada, o teste falhará.
Cypress-promessa npm
Se quisermos manipular as promessas do Cypress, podemos usar adicionalmente uma biblioteca ou pacote chamado Promessa cipreste e incorporá-lo em nosso código. Este pacote permitirá que você converta um Comando Cypress em uma promessa e permite que você aguarde ou assíncrona no código. No entanto, essas condições não funcionarão before
or beforeEach
os blocos. Inicialmente, devemos instalar o pacote em nosso projeto passando o seguinte comando no terminal.
npm i cypress-promise
Depois de instalado, o terminal se parecerá com isto.
Após a instalação, devemos importar a biblioteca para nosso arquivo de teste.
import promisify from 'cypress-promise'
Com essa biblioteca, você pode criar e substituir a promessa nativa do Cypress e usar awaits e async no código. Você deve acessar a promessa com o promisify
palavra-chave. Vejamos um exemplo para o mesmo.
import promisify from 'cypress-promise' it('should run tests with async/await', async () => { const apple = await promisify(cy.wrap('apple')) const oranges = await promisify(cy.wrap ('laranjas')) expect(maçã).to.equal('maçã') expect(laranjas).to.equal('laranjas') });
Isso foi muito simples e divertido de aprender! Dessa forma, você pode atribuir código assíncrono no Cypress.
Tarefa Cypress Async
task()
é uma função no Cypress que executa o código no Node. Este comando permite que você alterne do navegador para o nó e execute comandos no nó antes de retornar o resultado para o código.
Sintaxe
cy.task(event)
cy.task(event, arg)
cy.task(event, arg, options)
task()
retorna um valor ou promessa. task()
irá falhar se a promessa for devolvida como undefined
. Dessa forma, ajuda o usuário a capturar erros de digitação em que o evento não é tratado em alguns cenários. Se você não precisa retornar nenhum valor, então passe null
valor.
Perguntas Frequentes
O Cypress é síncrono ou assíncrono?
Cypress é Assíncrono retornando os comandos enfileirados em vez de esperar pela conclusão da execução dos comandos. Embora seja assíncrono, ele ainda executa todas as etapas de teste sequencialmente. O Cypress Engine lida com todo esse comportamento.
É possível pegar a cadeia de promessa em Cypress?
O Cypress foi projetado de uma forma que não seremos capazes de cumprir as promessas. Esses comandos não são exatamente promessas, mas parecem uma promessa. Dessa forma, não podemos adicionar manipuladores explícitos como catch
.
Olá… eu sou Aishwarya Lakshmi, concluí meu B.Tech e tenho quase 2+ anos de experiência na área de testes. Sou um entusiasta de testes e apaixonado por testes e adoro explorar coisas novas em minha área e compartilhá-las com meus colegas. Gosto de escrever blogs durante meu tempo livre da maneira mais simples, mas eficaz. Como testador, gosto de ter as coisas perfeitas, por isso desejo que meus leitores tenham um entendimento perfeito da tecnologia. Eu me mantenho atualizado com as novas tecnologias relacionadas a testes e passo tempo entendendo-as. Fico feliz em ajudar os alunos a compreender os conceitos dos testes.
Olá caro leitor,
Somos uma equipe pequena na Techiescience, trabalhando duro entre os grandes players. Se você gostou do que viu, compartilhe nosso conteúdo nas redes sociais. Seu apoio faz uma grande diferença. Obrigado!