2010-12-14 4 views
0

У меня модульный тест на Java, который записывает постоянную временную метку в строку в моей локальной тестовой базе данных, читает ее и сравнивает ее с тем, что я ожидал. Это отлично работает на моем локальном ноутбуке, который находится под часовой пояс GMT.Обработка локальных и удаленных баз данных TimeZone Различия в тестах

Когда я передаю код нашему серверу непрерывной интеграции, тест терпит неудачу с разным временем -5 часов. Это не удивительно, так как наш сервер интеграции размещен на AWS на восточном побережье США. Тем не менее, это вызывает проблему ...

Не меняя локальный сервер MySQL на тот же часовой пояс, что и удаленный сервер (и все разработчики в моей команде тоже так делают), может ли кто-нибудь показать мне, как исправить эту проблему в коде, не получив слишком хаки?

//Fetch actual table contents 
IDataSet databaseDataSet = databaseTester.getConnection().createDataSet(); 
ITable actualTable = databaseDataSet.getTable("batch"); 

// Load expected data from an XML dataset 
IDataSet expectedDataSet = new XmlDataSet(getClass().getResourceAsStream("/dbunit/expected_insert_batch.xml")); 
ITable expectedTable = expectedDataSet.getTable("batch"); 

// Assert actual database table match expected table 
Assertion.assertEquals(expectedTable, actualTable); 

Спасибо,

+0

Вы должны указать, как вы сравниваете временные метки, как целые числа? как строки? – Guillaume

+0

Да, показать подробную информацию об аппаратном тестировании, пожалуйста :) –

+0

Сравнение меток времени выполняется DBUnit – Scruffers

ответ

4

Вы можете set a timezone для сервера MySQL отдельно от часового пояса операционной системы, или даже для отдельных сессий БД. Первый предпочтительнее ИМО, так как используется UTC везде, за исключением пользовательского интерфейса и при импорте данных.

0

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

0

Если вы создаете метку времени в Java, я рекомендую использовать макет, чтобы он не зависел от системы.

См. Ответы на вопросы this question.

+0

Но мой модульный тест проверяет правильность записи DAO в базу данных. Я уже пишу постоянную метку времени из-за макета, но проблема в том, что она должна быть записана через БД для тестирования - и если часовой пояс отличается, как описано, это вызывает проблему ... – Scruffers

+0

Для этой проблемы я ' d, поскольку другие ответили, просто сохраняйте все времена базы данных в UTC и используйте часовой пояс только для отображения. –

1

ОК, это может быть не самый лучший вариант, но почему бы не создать еще один

"/dbunit/expected_insert_batch.xml" 

для сервера CI. Затем добавьте переключатель в свой модульный тест для часового пояса.

-1

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

+0

Тест DAO всегда будет зависеть от базы данных, на которой он работает, но я согласен, что в целом тесты должны быть агностическими для среды. – Scruffers

Смежные вопросы