Tengo un servicio de Java que ahora se ejecutará en modo de proceso por lotes. El servicio admite múltiples subprocesos, por lo que para cada solicitud por lotes se dedicará un grupo de subprocesos para ejecutar el lote. La pregunta es ¿cómo pruebo esto? Tengo pruebas funcionales que pasan bajo la versión enhebrada del servicio, pero, de alguna manera, creo que debe haber una expresión idiomática para probar esto.¿Cómo se agregan las pruebas para soporte multihilo?
Respuesta
Realmente no hay una "buena" manera de hacer esto. Lo mejor que puedo sugerir es TestNG, que le permite anotar sus métodos de prueba y hacer que se ejecuten en n hilos al mismo tiempo. Por ejemplo:
@Test(invocationCount=10, threadPool=10)
public void testSomethingConcurrently() {
...
}
Mi conocimiento TestNG está oxidado en el mejor, pero que yo sepa que debe invocar el método testSomethingConcurrently
10 veces al mismo tiempo. Esta es una manera agradable y declarativa de ejecutar pruebas de subprocesos múltiples contra su código.
Por supuesto, puede hacer algo similar en JUnit al engendrar hilos manualmente en un bucle, pero eso es increíblemente feo y difícil de trabajar. Tuve que hacer esto una vez para un proyecto en el que estaba trabajando; Esas pruebas fueron una pesadilla para tratar, ya que sus fallas no siempre eran repetibles.
La prueba de concurrencia es difícil y propensa a la frustración, debido a su naturaleza no determinista. Esto es parte de por qué hay un gran impulso en estos días para utilizar mejores abstracciones de concurrencia, que son más fáciles de "razonar" y convencerse a uno mismo de lo correcto.
Estoy de acuerdo con Daniel, las pruebas de concurrencia son de hecho muy difíciles.
No tengo una solución para las pruebas de simultaneidad, pero le diré lo que hago cuando deseo probar el código que involucra el multi-threading. La mayoría de mis pruebas se realizan usando JUnit y JMock. Como JMock no funciona bien con varios hilos, utilizo una extensión para JMock que proporciona versiones sincrónicas de Executor y ScheduledExecutorService. Estos me permiten probar el código dirigido a ser ejecutado por múltiples hilos en un solo hilo, donde también puedo controlar el flujo de ejecución. Como dije antes, esto no prueba la concurrencia. Solo verifica el comportamiento de mi código de una sola vez, pero reduce la cantidad de errores que obtengo cuando cambio a los ejecutores de hilos múltiples.
De todos modos, recomiendo el uso de la nueva API de concurrencia de Java. Hace las cosas mucho más fáciles.
Por lo general, las cosas que reducen las aplicaciones multiproceso son cuestiones de tiempo. Sospecho que para poder realizar pruebas unitarias en todo el entorno multiproceso se necesitarían grandes cambios en la base del código para hacerlo.
Lo que bien puede hacer, sin embargo, es probar la implementación del grupo de subprocesos de forma aislada.
Al sustituir el cuerpo de los hilos con el código de prueba, debería ser capaz de construir sus condiciones patológicas de bloqueo y uso de recursos.
Luego, pruebe los elementos funcionales en un solo entorno con rosca, donde puede ignorar el tiempo.
Si bien esto no es perfecto, garantiza la repetibilidad, que es de gran importancia para las pruebas de su unidad.(Como se alude en la respuesta de Daniel Spiewak)
I utilizarse
@Test(threadPoolSize = 100, invocationCount = 100)
@DataProvider(parallel = true)
ejecutados 100 hilos en paralelo 100 veces.
- 1. ¿Cómo es que las consultas no se agregan a Db.connection.queries de Django en las pruebas?
- 2. Obtener ID para las vistas que se agregan dinámicamente
- 3. Cómo se agregan las bibliotecas de impulso en CMakeLists.txt
- 4. ¿Cómo se ejecutan las pruebas de meteoritos?
- 5. ¿Cómo se escriben las pruebas QTP?
- 6. ¿Cómo se agregan las bibliotecas externas para la compilación en VC++?
- 7. ¿Cómo se hacen las pruebas en Sinatra?
- 8. ¿Cómo se burla de las pruebas en Haskell?
- 9. ¿Cómo se separan las pruebas unitarias de las pruebas de integración en Visual Studio?
- 10. pruebas unitarias con las dependencias entre las pruebas
- 11. ¿Se recomienda establecer Ember.testing = true para las pruebas unitarias?
- 12. ¿Cómo se agregan las suscripciones de calendario por programación en iOS?
- 13. Cómo se agregan funciones de prototipo al contexto de lienzo
- 14. ¿Cómo se agregan las cláusulas dinámicas 'where' a una consulta linq?
- 15. gdb: multihilo
- 16. Visual Studio 2010 - no se realizaron pruebas porque no se cargaron las pruebas o las pruebas seleccionadas están deshabilitadas
- 17. ¿Cómo se agregan programáticamente ListItems a DropDownList en ASP.NET?
- 18. ¿Cómo se agregan diferentes opacidades a los elementos anidados?
- 19. ¿Se vuelven más lentas las operaciones atómicas a medida que se agregan más CPU?
- 20. ¿Java 7 SE tiene soporte para EJB?
- 21. ¿Cómo se realizan las pruebas "limpias" en Macintosh sin virtualización?
- 22. No se pueden ejecutar las pruebas arquillian
- 23. ¿Cómo se manejan las pruebas unitarias en F #?
- 24. ¿Cómo se ejecutan las pruebas unitarias en modo STAThread?
- 25. ¿Cómo se hacen las pruebas de rendimiento en Ruby webapps?
- 26. Prueba de cerraduras multihilo
- 27. ¿Cómo se hacen las pruebas de rendimiento de la página?
- 28. Cómo determinar si las pruebas PHPUnit se están ejecutando?
- 29. ASP.NET MVC multihilo
- 30. Python: pruebas para Ninguno, las pruebas de valor booleano