[Cypress] Melhorando suas esperas para diminuir aqueles flaky tests.
Published: 2024-05-02 13:48:16

Todos nós já passamos por momentos que testes ficam falhando, rodamos em nossas máquinas locais e tudo parace funcionar como deveria, mas quando começamos executá-los em uma pipeline, alguns testes começam a quebrar e pensamos: por que meu pai? por que está quebrando? Affs!

Existem motivos para que seus testes estejam quebrando quando não deveriam, ou seja, as regras de negócio estão corretas, nada de estranho para estar na aplicação que está sendo testada. Costumamos chamar essas intermitências de Flaky Tests. Afinal, nesse primeiro momento, não sabemos porque estão falhando, mas se rodarmos novamente, "misteriosamente" eles passam, ai ficam nessa indecisão de passar e falhar.

Quero hoje te ajudar com um dos motivos que podem estar causando esses Flaky Tests, um deles acontece porque hora os elementos são carregados mais rápidos e outra hora não, e como não estamos controlando isso, acabam que podem passar ou não dependendo da estabilidade da internet ou até mesmo da performance da sua aplicação.

Isso pode ser tratado de duas maneiras, sem se utilizar da má prática de se ter **Implicit Waits**, ou seja, sabe quando forçamos nossos testes esperarem um tempo definido, como: `cy.wait(5000)`? Seria isso. Não importa o que aconteceça, a automação terá que esperar esse tempo, mas não queremos isso.

A primeira opção que podemos aplicar para tentar corrigir esse Flaky Test que pode estar sendo causado por um elemento que ainda não apareceu, é aumentar o timeout do elemento que estamos procurando. O cypress automaticamente já possui um **Explicit Wait**, ou seja, ele sempre fica esperando que o elemento esteja visível e que consigamos interagir com o mesmo, mas o timeout default é de 4 segundos e pode ser pouco dependendo do nosso cenário, então, caso precise aumentar o timeout, basta adicionar o parâmetro de timeout quando buscar o seu elmento que está caausando o Flaky Test, dessa forma:

![waits](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bd7wlmrmr9v6qcnnpgz7.png)

Assim, você não precisará colocar um _cy.wait()_ e fica melhor a solução.

Mas pode ser que esse timeout ainda não esteja sendo suficiente porque afinal os elementos na tela só vão ser renderizados quando determinada request terminar.
Se esse for o caso, temos uma segunda solução, se você perceber que uma request ainda está em processamento e seu script de automação está prosseguir, sem esperar a resposta, e que isto está causando seu Flaky Test, você pode esperar até que a request finalize, dessa forma: 

![waits](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zkaza77diagbzypp8ta8.png)

Mas lembre de aumentar o **responseTimeout** na configuração do cypress se quiser de forma global:


![waits](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/201ykbchyvg6z9f51k0f.png)

Ou se preferir, podes especificar o timeout direto no seu comando:

```
cy.wait('@getModules', { responseTimeout: 60000 });
```

Com essas duas soluções você pode diminuir mais seus Flaky Tests, caso sejam por problemas de que elementos não estão visíveis, aplicando assim melhores esperas seja pelo próprio elemento ou pela espera da finalização de alguma request.

Faz sentido para você? Tem sofrido com Flaky Test?
Espero que esse post possa te ajudar pelo menos com alguns deles!
Lembre-se, o exemplo pode ser em Cypress, mas se você entender o princípio disso, perceberá que vale para outros frameworks de automação também! Guarde isso!