Pregunta

Este post comenzó como "¿Cuáles son algunos patrones comunes en la Unidad de Pruebas código multihilo?", Pero he encontrado algunos href="https://stackoverflow.com/questions/352695/best-way-to-run-multi-threaded-nunit-tests"> discusiones encendido de modo que por lo general de acuerdo en que "es difícil (TM)" y "Depende (TM)". Así que pensé que la reducción del alcance de la cuestión sería más útil.

Fondo : Estamos implementando un planificador simple que le da una forma de registrar las devoluciones de llamada al iniciar y detener puestos de trabajo y, por supuesto, configurar la frecuencia de la programación. Actualmente, estamos haciendo una envoltura ligera alrededor java.util.Timer.

Aspectos

  • No he encontrado una manera de probar este planificador apoyándose únicamente en las interfaces públicas (algo así como addJob(jobSchedule, jobArgs,jobListener), removeJob(jobId)).

  • ¿Cómo momento en que el hecho de que el trabajo fue llamado de acuerdo con el programa especificado?

¿Fue útil?

Solución

se puede utilizar un grabador objeto que graban el orden, los tiempos y otras cosas útiles en cada unidad de prueba de su programador. La prueba es simple:

  1. crear un objeto grabador
  2. configurar la programación
  3. ejecutar una prueba de unidad
  4. objeto comprobar que la grabadora es "compatible" con el calendario

Otros consejos

Una cosa también para recordar es que usted no necesita probar que el temporizador funciona. Puede escribir una versión simulada del Timer (extendiendo la clase o el uso de EasyMock ) que simplemente comprueba que están llamando correctamente, posiblemente, incluso la sustitución suficiente como para que usted no necesita hilos en absoluto. En este caso, que podría ser más trabajo que necesita si su oyente trabajo tiene suficientes devoluciones de llamada para rastrear el planificador.

La otra cosa importante para recordar es que cuando se prueba el planificador, utilice trabajos personalizados que hacen un seguimiento de cómo el planificador está trabajando; cuando se prueban los trabajos programados, llamar a las devoluciones de llamada directa y no a través del planificador. Es posible que tenga una prueba de integración más alto nivel que controla los dos juntos, dependiendo del sistema.

Hay muchos modos de falla que un programador podría exhibir tales, y cada uno lo más probable requerirá su propio caso de prueba. Estos casos de prueba es probable que sean muy diferentes, por lo que "depende".

Para las pruebas de software concurrente en Java, en general, recomiendo esta presentación de JavaOne 2007: Pruebas de Software concurrente .

Para la prueba de que un programador debe ejecutar trabajos de acuerdo a su horario exacto, que crearía una abstracción del tiempo mismo. He hecho algo similar en uno de mis proyectos, en los que tengo un tiempo o una interfaz de reloj. La implementación por defecto será MillisecondTime, pero durante las pruebas que cambiará hacia fuera con un TickTime. Esta aplicación permitirá a mi prueba de la unidad de controlar cuando avanza el tiempo y en qué medida.

De esta manera, se podría escribir un ensayo en el que está previsto un puesto de trabajo a ejecutar una vez cada 10 garrapata. A continuación, la prueba solo avanza el contador de paso y los controles para asegurarse de que los trabajos se ejecutan en las garrapatas correctos.

Un par de maneras de probar el código concurrente.

  • ejecutar el mismo código varias veces bajo carga, algunos errores aparecen sólo de vez en cuando, pero puede aparecer constantemente si se realiza en varias ocasiones.
  • almacenar los resultados de diferentes hilos / puestos de trabajo en una colección como un BlockingQueue. Esto le permitirá comprobar los resultados en el hilo actual y el acabado en el momento oportuno (sin declaraciones del sueño arbitraria feos)

Si les resulta difícil considerar las pruebas de concurrencia refactorización sus objetos / componentes para que sean más fáciles de prueba.

Si los delegados a un planificador Executor o ExecutorService para ejecutar las tareas, se puede usar la inyección de dependencias para eliminar una dependencia directa del tipo de Executor, y utilizar una única y simple Executor roscado para probar la mayor parte de la funcionalidad de su planificador sin la complicación de verdaderamente multi-hilo código. Una vez que había conseguido depurado esas pruebas, se puede mover en la más difícil, pero ahora reducido considerablemente en magnitud, tarea de prueba de hilo de seguridad.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top