miércoles, 16 de abril de 2025

Como mejorar tu Thread.sleep en java y así evitar deuda técnica

Buenas lectores.

Vamos a dividir la espera de tiempo según la patron que estemos manejando: 


SIN PATRONES:

Podemos encontrar frecuentemente la línea

Thread.sleep(2000);

Esto hace que el robot espere 2 segundos. Es muy util cuando no tenemos objetos referencias como por ejemplo, esperar una carga de archivos que no tiene mensaje de confirmación, un refresco de un iframe para evitar que arroje errores de estados entre otros. Sin embargo, cuando pasamos el sonar nos arroja la siguiente deuda técnica:

"Thread.sleep" should not be used in tests

Si eres de las personas que no les gusta la deuda técnica o simplemente estas por mejorar tu código, aquí te mostraré como lo puedes hacer




POM (Page Object Model):

En POM es facil implementar una espera sin deuda técnica, en este caso vamos a usar Awaitility


import org.awaitility.Awaitility;

import org.awaitility.Durations;


Awaitility.await().pollDelay(Durations.TWO_SECONDS).until(() -> true);

Con esto hemos logrado mejorar el código y evitar la deuda técnica.


Cabe anotar que el pull máximo es de 1 minuto, si queremos superar ese tiempo la sentencia cambia a la siguiente forma:

Awaitility.await().atMost(2, TimeUnit.MINUTES).pollDelay(1, TimeUnit.MINUTES).until(() -> true);



Para tiempos mayores a 5 minutos se debe usar:

 Awaitility.await().with().pollInterval(Durations.ONE_SECOND).await().atMost(Durations.TEN_SECONDS).until(myFunction());


Screenplay:

En Screenplay debemos mantener el patron usando task para nuestro actor, para convertir la línea anterior a una task se hace lo siguiente:

actor.attemptsTo(Task.where("waiting for route destine selector",

a -> Awaitility.await().pollDelay(Durations.ONE_SECOND)

.until(() -> true))

);


Cabe anotar que si necesitas reutilizarla mejor la creas como una task independiente y la invocas.



Cordial saludo



Fuentes:
https://automatizaciondefuncionales.blogspot.com/2023/03/cambiar-el-threadsleep-para-no-tener.html

No hay comentarios:

Publicar un comentario