2010-07-15 14 views
15

Me gustaría saber si hay algunos marcos de pruebas de unidades que son capaces de escribir pruebas de subprocesos múltiples fácilmente?Cómo escribir pruebas de unidad de subprocesos múltiples?

Imagino algo así como: invocar un método de prueba especial por n hilos al mismo tiempo por m veces. Una vez finalizados todos los hilos de prueba, se invocará un método de aserción donde se deberían validar algunas restricciones.

Mi enfoque actual es crear objetos Thread dentro de un método de prueba junit, repetir manualmente los casos de prueba reales dentro de cada método run(), esperar todos los hilos y luego validar las afirmaciones. Pero al usar esto, tengo un gran bloque de código repetitivo para cada prueba.

¿Cuáles son sus experiencias?

+1

le pregunté a un relacionado (no duplicados) pregunta hace algún tiempo, y tengo algunas buenas respuestas de la gente: http://stackoverflow.com/questions/537014/using-tdd -to-drive-out-thread-safe-code –

+0

Ver también https://stackoverflow.com/questions/12159/how-should-i-unit-test-threaded-code – Raedwald

Respuesta

11

Hay ConTest, y también GroboUtils.

He usado GroboUtils hace muchos años, y funcionó. ConTest es más nuevo, y sería mi punto de partida preferido ahora, ya que en lugar de confiar solo en prueba y error, la instrumentación obliga a entrelazados específicos de los hilos, proporcionando una prueba determinista. Por el contrario, GroboUtils MultiThreadedTestRunner simplemente ejecuta las pruebas y espera que el planificador produzca un entrelazado que hace que aparezca el error de subproceso.

EDITAR: Véase también ConcuTest, que también fuerza intercalaciones y es libre.

+0

ConTest se ve bien, pero parece no ser disponible gratuitamente (solo puedo encontrar una versión de prueba). – MRalwasser

+0

También hay ConcuTest, que he agregado como edición. – mdma

4

También hay MultithreadedTC por Bill Pugh de FindBugs fame.

+0

+1: Lo he usado antes, y me pareció muy bueno para generar entrelazamientos específicos y afirmar las propiedades de su implementación. –

0

El solo uso de las bibliotecas de concurrencia simplificaría su código. Puede convertir el código de su placa de caldera en un método.

Algo así como

public static void runAll(int times, Runnable... tests) { 

} 
+0

Esto no responde la pregunta. Sí, el código sería más simple y se eliminarían algunos riesgos, pero aún así debería probarse de alguna manera. –

Cuestiones relacionadas