2010-12-14 15 views
0

ローカルテストデータベースの行に一定のタイムスタンプを書き込み、それを読み戻して予想したものと比較するJavaのunit testがあります。これは、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); 

OSのタイムゾーンとは別の、または個々のDBセッションのMySQLサーバーのおかげで、

+0

タイムスタンプを整数としてどのように比較すればよいでしょうか?文字列として? – Guillaume

+0

はい、単位テストの詳細を表示してください:) –

+0

タイムスタンプ比較はDBUnitによって行われています – Scruffers

答えて

4

することができますset a timezone。前者は、UIを除き、データをインポートするとき以外はすべてUTCを使用しているので、IMOが好ましいです。

0

すべてのシステムで同じタイムゾーンを使用することをお勧めします。 UTC/GMT + 0に設定し、ユーザーまたはレポートに表示するときにのみタイムゾーンを使用します。

0

タイムスタンプをJavaで作成している場合は、モックを使用してシステムに依存しないようにすることをお勧めします。

this questionの回答を参考にしてください。

+0

しかし、私の単体テストは、DAOがデータベースに正しく書き込むことをテストしています。私はすでに模擬のために一定のタイムスタンプを書いていますが、問題はDBを介してテストするように書かれなければならないということです - もしタイムゾーンが記述されているものと異なるならば... – Scruffers

+0

その問題については、他の人が答えてくれたら助言してください。すべてのデータベース時間をUTCで保存し、表示にのみタイムゾーンを使用してください。 –

1

OK、これが最良の選択肢ではないが、なぜあなたのCIサーバーのための別の

"/dbunit/expected_insert_batch.xml" 

を作成することはできません。次に、タイムゾーンの単体テストにスイッチを追加します。

-1

環境に依存しないテストを行う必要があります。このフィールドを動的にすることができる場所を探し、どこでも動作するはずです。

+0

DAOテストは常にそれが動作するデータベースに依存しますが、一般的なテストでは環境に依存しないでください。 – Scruffers

関連する問題