2009-01-25 7 views
6

Wir arbeiten mit großen Datenmengen, die alle in UTC (in Java) getaggt sind. Zwischen dem Lesen dieser Daten, dem Speichern in einer Datenbank und dem erneuten Abrufen der Daten war es möglich, dass einige Daten während der Sommerzeit eine Stunde verließen. Da UTC kein Konzept der Sommerzeit hat, war dies eindeutig ein Fehler in der Software. Sobald es bekannt ist, ist es leicht zu beheben.Testen der korrekten Zeitzonenbehandlung

Es wäre jedoch nett, einige Einheits-/Integrationstests zu haben, die ungeachtet des aktuellen Zeitunterschieds funktionieren - z. Ich möchte die lokale Zeitzone ändern und einige Methoden innerhalb dieser verschiedenen Zeitzonen immer wieder ausführen, um sicherzustellen, dass UTC korrekt behandelt wird.

Da die Tests automatisch und - vorzugsweise - innerhalb einer Testsuite laufen sollten, frage ich mich, wie man am besten auf korrektes Verhalten testet. Es wäre leicht, beim Neustart der JVM lokale Einstellungen wie die Zeitzone zu ändern, aber das Ausführen in einer Testsuite ist nicht so einfach.

Kennt jemand eine Testumgebung, eine Bibliothek oder ein Muster, die dieses Szenario unterstützen? Wir arbeiten normalerweise mit JUnit, sind aber offen für das Hinzufügen einer anderen Umgebung/Technik, wenn es hilft, Probleme wie diese zu beseitigen. Ich nehme an, dass es eher ein Integration-als-Unit-Test ist.

bearbeiten: Es gibt bereits zwei sehr hilfreiche Antworten, aber ich denke, es muss da draußen mehr Techniken sein. Hat jemand maßgebliche Informationen darüber, wann/wie oft TimeZone.getDefault aufgerufen wird (siehe Kommentare zu Jon Skeets Antworten)?

Hinweis: Obwohl diese Frage eine akzeptierte Antwort hat, war ich nicht ganz sicher, welche Antwort zu akzeptieren. Auch mit dieser Akzeptanz würde ich gerne mehr Ideen und Techniken sehen.

Vielen Dank für Ihre Eingabe!

+1

Für weitere Ideen und Techniken, können Sie einen persönlichen Beitrag über Java Zeitzone Einschränkungen unter: http://tshikatshikaaa.blogspot.nl/2012/09/about-java-timezone-and-calendar-caveats.html. Um die aktuelle Zeit um die Welt pro Zeitzone zu erfahren, klicke auf: http://yourworldclocks.juplo.com/ Hoffe das hilft! – JVerstry

Antwort

6

Ich würde empfehlen, dass Sie JodaTime überprüfen, die etwas Zucker zur Verfügung stellt, um zu helfen, Datum/Zeit/TimeZone Art Probleme besser lesbar in Ihrem Code zu handhaben.

Wir verwenden diese während Test und Produktion, seit wie es die native Java-API für Datum/Uhrzeit Probleme beispiellos ist. Die Verwendung dieser in Tests funktioniert gut in JUnit

+0

Danke, wir werden uns das auf jeden Fall ansehen –

7

In Java können Sie die Standardzeitzone (java.util.TimeZone.setDefault) festlegen. Ich habe Tests geschrieben, um die Zeitzone auf verschiedene Optionen einzustellen und zu überprüfen, ob alles noch funktioniert. Seien Sie jedoch vorsichtig - wenn Sie die meisten Ihrer Komponententests parallelisieren, müssen Sie diese nacheinander erstellen.

Ich schlage vor, Sie testen in einigen Zeitzonen mit Sommerzeit gilt, und einige ohne. Die Verwendung einer australischen Zeitzone ist ebenfalls gut, da die Sommerzeit zur entgegengesetzten Jahreszeit auf die nördliche Hemisphäre angewendet wird.

+1

Danke. Ich weiß nicht, ob ich darauf vertrauen kann, den Standardwert immer wieder zu ändern oder wenn die Standardzeitzone während der Lebensdauer einer VM gelesen wird. Würdest du sagen, ich kann? Die Dokumente, die ich für die Zeitzone gefunden habe, enthalten nicht zu viele Informationen. Javadoc enthält fast keine Informationen in dieser Hinsicht ... –

+0

Es hängt davon ab, was die Standardzeitzone ergreift. Einige Dinge können cachen, aber ich vermute, dass die meisten getDefault jedes Mal aufrufen werden. –

+0

Danke - Ich vermute immer das Schlimmste, besonders wenn ich versuche, mich auf das Ergebnis automatischer Tests zu verlassen. Vielleicht sollte ich in diesem Fall optimistischer sein ... –

1

Was ist die Meinung über die Verbindung zu Zeitservern und erhalten Updates?

+0

Meinst du das Testen der Verbindung zu Zeitservern oder die Verwendung dieser Verbindungen? Das Testen von Zeitserververbindungen wäre eine andere Frage. Die Verwendung dieser Methoden hilft nicht beim Testen der korrekten Zeitzonenbehandlung einer Anwendung - es hilft nur, die korrekte aktuelle Zeit zu erhalten. –