Voy a aprovechar éste, mi primer mensaje en la lista, para
comentaros/consultaros algo que llevo tiempo dándole vueltas y no
acabo de encontrar una solución que me convenza.
Se trata de cómo realizar tests (¿funcionales?) en desarrollos de
nodos de red. Es decir, orientado a eventos. Eventos que son
simplemente la recepción/envío de mensajes en un objeto.
Os pongo en un caso concreto y muy resumido:
* Tengo:
ObjetoCliente objCliente;
ObjetoServidor objServidor;
* Preparo un test:
void testEnvioRecepcionCliente(){
objCliente.enviarMensaje1();
Respuesta respuesta = objCliente.recibir();
assertEquals(respuesta, respuestaRecibida)
}
Con este simple test espero que entendáis mi problema. No puedo
llamar al método recibir(), sino que debería de alguna forma mi clase
test ser notificada cuando se reciba una nueva respuesta.
Por un lado, y como primera opción pensé en meter un Thread.sleep()
entre el envío y recepción. Pero claro, esto no es una solución para
nada válida ya que no puedes recibir más de una respuesta para cada
petición. Ni el test pasaría con varios clientes a la vez.
Otra opción es aplicar en esta clase el patrón obvervable y tener
un método update() donde actualizar el test consecuentemente. No se
hasta que punto esto sería un test válido ya que sólo podría tener un
test en esta clase.
Os cuento también la solución por la que he optado: Consiste en que
los clientes tengan un atributo donde almaceno un estado. Es decir,
lanzo las peticiones, espero un tiempo (Thread.sleep) y finalmente
consulto ese estado. Es similar a la primera de las aproximaciones
que usé, pero válido para probar varios clientes simultáneamente.
¿Alguno de vosotros está en desarrollos de este tipo y sabe cómo
usar de mejor forma los test?
Desde ya os agradezco cualquier comentario.
Un saludo,
César
Dejando de lado la separación de pruebas de unidad/funcionales, el problema es "¿como hacer pruebas funcionales con código asincrono en junit?"
En este blog dan algunas pautas: http://joe.truemesh.com/blog/000279.html
Otra opción es usar las clases Future y Callable de java.util.concurrent que precisamente sirven para automatizar la gestión de métodos que resuelven resultados de forma asincrona.
Echale un vistazo a estas cosas a ver si te sirven para tu problema, lo de esperar en un sleep en mi opinión es muy mala opción porque ralentizas si o si todos tus test, la ideal es:
- En cuanto se devuelva el resultado hacer el assert para ver que es correcto
- Tener un timeout y si se sobrepasa el timeout y no se ha devuelto nada considerar la prueba fallida.
De esta forma sitodo va bien no ralentizas N segundos por pueba tanto si va bien como si va mal.