2009-01-25 16 views
6

Estamos trabajando con grandes cantidades de datos, todos etiquetados en UTC (en Java). Entre la lectura de estos datos, el almacenamiento en una base de datos y su recuperación, sucedió que algunos datos se desactivaron durante una hora durante el horario de verano. Como UTC no tiene ningún concepto del horario de verano, este fue claramente un error dentro del software. Una vez conocido, es fácil de arreglar.Prueba del manejo correcto de la zona horaria

Sin embargo, sería bueno tener algunas pruebas de unidad/integración que funcionen independientemente de la diferencia horaria actual, p. Ej. Me gustaría cambiar la zona horaria local y ejecutar algunos métodos una y otra vez dentro de estas diferentes zonas horarias para asegurarme de que UTC se maneja correctamente.

Como las pruebas deben ejecutarse automáticamente y, preferiblemente, dentro de un Testsuite, me pregunto cuál es la mejor manera de comprobar el comportamiento correcto. Sería fácil cambiar la configuración local, como la zona horaria, al reiniciar la JVM, pero ejecutarla dentro de un banco de pruebas no es tan fácil.

¿Alguien sabe de un entorno de prueba, una biblioteca o un patrón compatible con este escenario? Usualmente estamos trabajando con JUnit, pero estamos abiertos a agregar otro entorno/técnica si ayuda a deshacerse de problemas como este. Supongo que es más bien una prueba de integración que de unidad.

Editar: Ya hay dos respuestas muy útiles, pero creo que debe haber más técnicas. ¿Alguien tiene información autorizada sobre cuándo/con qué frecuencia se llamará TimeZone.getDefault (ver los comentarios sobre las respuestas de Jon Skeets)?

Nota: Aunque esta pregunta tiene una respuesta aceptada, no estaba del todo seguro, qué respuesta aceptar. Incluso con esta aceptación, me gustaría ver más ideas y técnicas.

¡Gracias por su contribución!

+1

Para obtener más ideas y técnicas, puede consultar una publicación personal sobre las advertencias de zona horaria de Java en: http://tshikatshikaaa.blogspot.nl/2012/09/about-java-timezone-and-calendar-caveats.html. Para obtener la hora actual del mundo por zona horaria, consulte: http://yourworldclocks.juplo.com/ ¡Espero que esto ayude! – JVerstry

Respuesta

6

Yo recomendaría que revisa JodaTime, que proporciona algo de azúcar para ayudarlo a administrar el tipo de fecha/hora/hora. El tipo de problema es más legible en su código.

Utilizamos estos durante toda la prueba y producción, ya que la forma en que aumenta la API Java nativa para los problemas de fecha/hora no tiene paralelo. El uso de estos en las pruebas funciona bien dentro de JUnit

+0

Gracias, definitivamente vamos a echar un vistazo –

7

Java le permite configurar la zona horaria predeterminada (java.util.TimeZone.setDefault). He escrito pruebas antes para configurar la zona horaria en una variedad de opciones diferentes y verificar que todo siga funcionando. Sin embargo, ten cuidado: si comparas la mayoría de las pruebas de tu unidad, necesitarás que estas sean secuenciales.

Le sugiero que pruebe en algunas zonas horarias con el horario de verano aplicable, y algunas sin. Usar una zona horaria australiana también es bueno, ya que el DST se aplica en el momento opuesto del año al hemisferio norte.

+1

Gracias. No sé si puedo confiar en cambiar el valor predeterminado una y otra vez o cuando se lee la zona horaria predeterminada durante la vida útil de una máquina virtual. ¿Dirías que puedo? Los documentos que encontré para la zona horaria no contienen demasiada información. Javadoc casi no contiene información en este sentido ... –

+0

Depende de qué está agarrando la zona horaria predeterminada. Algunas cosas pueden caché, pero sospecho que la mayoría llamará getDefault cada vez. –

+0

Gracias - Siempre sospecho lo peor, especialmente cuando intento confiar en el resultado de las pruebas automáticas. Tal vez debería ser más optimista en este caso ... –

1

¿Cuál es la opinión sobre la conexión a servidores de tiempo y cómo obtener actualizaciones?

+0

¿Quiere decir probar la conexión a servidores de tiempo o usar estas conexiones? Probar las conexiones del servidor de tiempo sería una pregunta diferente, usarlas no ayuda a probar el correcto manejo de las zonas horarias de las aplicaciones, solo ayuda a obtener la hora actual correcta. –

Cuestiones relacionadas