Laços de repetição com funções recursivas e comandos do Cypress

4549 단어
Latestemente me deparei com um problema, onde utilizava 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:
  • No primeiro 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;
  • Na segunda, caso o contador chegue a 0, significa que o número total de requisições que defini foi executado e as respostas das requisições continuaram não dando 200, assim thinko que os dados não foram refletidos e posso acabar também a execução das ;
  • E por último, é caso a requisição não deu 200 e o número de requisições não foram finalizadas, assim decremento um na variável 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:

    메우 링크딘:

    좋은 웹페이지 즐겨찾기