Linux上で動作するJavaアプリケーションは、時間と日付の周りに多くのイベントとビジネスロジックを持っています。linuxの "速い時間"をシミュレート
テストのために、何かを時間をかけてより速く調整することは可能ですか?たとえば、1時間の壁時間で全年度を通してコンピュータを終了させるとします。
Linux上で動作するJavaアプリケーションは、時間と日付の周りに多くのイベントとビジネスロジックを持っています。linuxの "速い時間"をシミュレート
テストのために、何かを時間をかけてより速く調整することは可能ですか?たとえば、1時間の壁時間で全年度を通してコンピュータを終了させるとします。
時間/日付の呼び出しのためのラッパーインタフェースを記述することができます。実際のシステムコールを実行する実際の実装を1つ、必要なもの(高速、低速、偽の日付など)を実行できるテスト実装をお持ちください。
良いアプローチですが、Web /アプリケーションサーバーのログファイル管理、メモリ消費、テストなどの外部要素をチェックする必要がある場合(あなたのアプリ、sql/no-sql db、サービス/ジョブのようなCronなど)。この種のテストでは、ハードウェアのクロックを変更して、すべての関係者を "騙す"必要があります。 [Endurance Testing](http://www.softwaretestingsoftware.com/all-types-of-software-testing/)を参照してください。 *ドラゴンボール**の "双曲線タイムチャンバー"を考えてみましょう*** –
システム時間を取得するためのシステムコール(つまりSystem.currentTimeMillis()
)を使用している場合は、おそらくシステム時間を変更することで時間を短縮できます。これは、アプリケーションに表示される時間に反映されるはずです。
時間を計算する他の方法(JVM開始からの経過時間(すなわちSystem.nanoTime()
)、ネットタイムサーバーなど)を使用している場合、答えは不可能であるということです。
私はちょうどあなたが求めて何をする方法を説明していますし、これが唯一の統合テストのために良いですが、あなたは他の考慮事項は何も考慮に入れたときに、あなたが言ったマシンを上の影響を与えていることは十分に強調することはできません。
これは、適切で広範なユニットテストのために置き換えられるものではありません。
他の誰かがこのマシンを使用している場合、それらは幸せではありません。シミュレーションがクラッシュすると、マシンの時計が間違っています。シミュレーション中にファイルを作成すると、後でそのタイムスタンプが表示されます。 –
@ジョナサン、よく言いますが、私は免責事項で私の答えを更新しました –
テスト中にクロックを再スケジュールできるようにシステムを設計する必要があります。いくつかのクラスのシステムには、スケジュールされたイベントを時間順に格納するイベントキューがあります。シミュレーションのどの時点でも、次のイベントはキューの最初の項目です。キューから取り除き、そのイベントが発生した時刻と一致するように有効時間を調整することができます。新しいイベントがスケジュールされると、キューに追加されます。したがって、実際の時間が経過するのを待たずに、システムが可能な限り迅速にイベントを処理することができます。しかし、そのような仕組みが働くようにシステムを設計する必要があります。
単体テストに最適なアプローチの1つは、コードで現在の時刻にアクセスする方法を抽象化することです。
System.currentTimeMillis()を直接呼び出す代わりに、独自の実装を提供できます。このような
サムシング(擬似コード):
class MyTime {
private static TimeInterface CurrentTimeInterface = new DefaultTimeImpl();
public setTimeInterface(TimeInterface timeInterface) {
CurrentTimeInterface = timeInterface;
}
public int getTime() { CurrentTimeInterface.getTime(); }
}
class DefaultTimeImpl implements TimeInterface {
public int getTime() { return System.currentTimeMillis(); }
}
class TestTimeImpl implements TimeInterface {
private int CurrentTimeMillis = 0;
public int getTime() { return CurrentTimeMillis; }
public void setTime(int timeMillis) { CurrentTimeMillis = timeMillis}
public void sleep(int millis) { CurrentTimeMillis += millis; }
}
その後、どこでもあなたがSystem.getTimeMillis(と呼ばれていた)の代わりにMyTime.getTime()を呼び出します。コードをテストするときは、TestTimeImplを作成し、MyTime.setTimeInterface(testTimeImpl)を呼び出します。次に、時間を欲しいときは、testTimeImpl.sleep()またはtestTimeImpl.setTime()を呼び出します。
これにより、任意の時間をミリ秒までシミュレートできます。
システムコールで「time」と「date」を呼び出しますか? –
スクリプトは毎秒1秒間隔で時間を設定しています:) –
このプログラムは、データベースや他の外部プログラムに依存していますか? – jmucchiello