Laços de repetição com funções recursivas e comandos do Cypress
cy.wait()
para esperar até que dados de um sistema passassem por alguns micro-serviços e fossem refletidos em outro sistema que era uma API, o problema é que utilizando cy.wait()
os dados poderiam já terem sido refletidos, mas o Cypress ainda iria continuar esperando o tempo pré-definido.Buscando então uma solução, pensei em criar uma forma onde o código iria ficar Consultando a requisição da Api, durante um certo tempo ou até que o dado fosse refletido.
Inicialmente pensei em utilizar laços de repetição tradicionais (do, while, do while), assim colocaria uma condição onde o loop iria parar caso o número de interações chegasse ao limite ou os dados fossem refletidos na Api. Mas com Cypress isso não é possível, pelo fato desses laços de repetição serem síncronos, mas o comando (
cy.request
) do Cypress ser assíncrono.Desta maneira, a outra forma que encontrei foi utilizar funções recursivas, que são funções que chamam a si mesmo até uma certa condição ser satisfeita, uma vez satisfeita a chamada das funções é encerrada.
Exemplo de função recursiva com código do Cypress
초기 조건은 API에 대한 문의 매개변수를 확인하고 번호를 잠정적으로 확인하는 것입니다.
function recursiva(contador = 60) {
Em seguida, inseri as informações para realizar a requisição no comando
cy.request
:cy
.request({
method: 'GET',
url: 'https://UrlDeExemplo.com.br',
log: false,
failOnStatusCode: false
})
Deixei a flag
log
desativada para não mostrar todas as requisições no console do Cypress, e também desativei a flag failOnStatusCode
para o Cypress não dar erro de execução caso a requisição falhe.Assim, uma vez o
cy.request
실행, eu obtenho a resposta da requisição utilizando o comando .then()
e salvando o valor na variável resposta
.Dentro
.then()
é onde coloco as condições para encerrar a chamada de função:if
verifico se o status da resposta foi 200, isso significa que o dado foi refletido na API, assim posso encerrar a chamada das funções; contador
e chamo a função novamente passando o novo valor do contador..then((resposta) => {
if (resposta.status === 200) return;
else if (contador === 0) {
cy.log('Os dados não foram refletidos');
return;
} else {
const DECREMENTA_CONTADOR = contador - 1;
recursiva(DECREMENTA_CONTADOR);
}
});
Juntando as partes do código, ele fica da seguinte maneira:
function recursiva(contador = 60) {
cy
.request({
method: 'GET',
url: 'https://UrlDeExemplo.com.br',
log: false,
failOnStatusCode: false
})
.then((resposta) => {
if (resposta.status === 200) return;
else if (contador === 0) {
cy.log('Os dados não foram refletidos');
return;
} else {
const DECREMENTA_CONTADOR = contador - 1;
recursiva(DECREMENTA_CONTADOR);
}
});
}
필요에 따라 적응해야 할 필요가 있을 때 가장 중요하고 실행에 필요한 상황에 처할 수 있습니다.
결론
재귀 함수를 활용하여 Cypress의 명령을 반복할 수 있는 현실화할 수 있습니다. O principal fato de ter optado por essa escolha foi evitar o uso de
cy.wait()
e assim diminuir o tempo de execução, mas ainda continuar garantido que se o dado não foi refletido para a API não foi por questão de espera de tempo.크레딧
Créditos para o Rodrigo Matola que deu idéia de utilizar funções recursivas para resolver o problema.
Linkdin do Rodrigo:
메우 링크딘:
Reference
이 문제에 관하여(Laços de repetição com funções recursivas e comandos do Cypress), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/joaocosti/lacos-de-repeticao-com-funcoes-recursiva-utilizando-cypress-5a21텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)