Тестирование правильной обработки часовых поясов

StackOverflow https://stackoverflow.com/questions/477965

  •  20-08-2019
  •  | 
  •  

Вопрос

Мы работаем с большими объемами данных, все помеченные в UTC (на Java).В промежутке между чтением этих данных, сохранением их в базе данных и повторным получением случилось так, что некоторые данные были отключены на один час во время перехода на летнее время.Поскольку UTC не имеет понятия о переходе на летнее время, это явно была ошибка в программном обеспечении.Однажды узнав, это легко исправить.

Однако было бы неплохо иметь некоторые модульные / интеграционные тесты, которые работают независимо от текущей разницы во времени - напримерЯ хотел бы изменить местный часовой пояс и запускать некоторые методы снова и снова в этих разных часовых поясах, чтобы убедиться, что UTC обрабатывается правильно.

Поскольку тесты должны выполняться автоматически и - предпочтительно - в рамках одного Testsuite, мне интересно, как наилучшим образом протестировать правильное поведение.Было бы легко изменить локальные настройки, такие как часовой пояс, при перезапуске JVM, но запустить это в наборе тестов не так просто.

Кто-нибудь знает о тестовой среде, библиотеке или шаблоне, поддерживающих этот сценарий?Обычно мы работаем с JUnit, но открыты для добавления другой среды / метода, если это поможет избавиться от подобных проблем.Я полагаю, что это скорее интеграционный, чем модульный тест.

Редактировать:Уже есть два очень полезных ответа, но я предполагаю, что должно быть больше техник.Есть ли у кого-нибудь достоверная информация о том, когда / как часто будет вызываться TimeZone.getDefault (см. Комментарии к ответам Джона Скитса)?

Примечание:Несмотря на то, что на этот вопрос есть общепринятый ответ, я не был полностью уверен, какой ответ принять.Даже при таком признании я хотел бы увидеть больше идей и техник.

Спасибо за ваш вклад!

Это было полезно?

Решение

Я бы порекомендовал вам проверить Джодатиме который предоставляет некоторый сахар, чтобы помочь более разборчиво управлять проблемами типа даты / времени / часового пояса в вашем коде.

Мы используем их во время тестирования и производства, поскольку то, как это улучшает собственный Java API для решения проблем с датой и временем, не имеет аналогов.Использование их в тестах отлично работает в JUnit

Другие советы

Java позволяет установить часовой пояс по умолчанию (java.util.TimeZone.setDefault).Я уже писал тесты, чтобы установить для часового пояса множество различных параметров и проверить, что все по-прежнему работает.Однако будьте осторожны - если вы распараллеливаете большинство своих модульных тестов, вам нужно будет сделать эти тесты последовательными.

Я предлагаю вам протестировать в некоторых часовых поясах с переходом на летнее время, а в некоторых без него.Использование австралийского часового пояса также хорошо, поскольку летнее время применяется в противоположное время года для северного полушария.

Каково мнение о подключении к серверам времени и получении обновлений ?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top