経過時間を考慮に入れるメソッドで単体テストを行う方法は?


8

私は現在、レガシーシステムの重要なメソッドをリファクタリングしている最中です。作業を始めるまでテストはほとんどありませんでした。リファクタリング後に正しい作業ができるように、かなりの数のテストを追加しました。

今、私は最も重要な部分に遭遇しました:インジケーターを計算するアルゴリズム。それは何かのようなものです

indicator = (OneNumberFromA + AnotherNumberFromB) / elapsedTime;

ユニットテストでこの関数の正しい動作をテストするにはどうすればよいですか?

関数には、プログラムが到達するいくつかのわずかに異なるアルゴリズムもありますが、すべての場合において、これelapsedTimeは結果に不可欠です。

回答:


11

ユニットテストでほとんどすべての問題を解決するのと同じ方法:経過時間を模擬します。

標準化された方法を使用してシステム全体のシステム時間を取得し、その方法をオーバーライド可能にして、単体テストで完全に制御できるようにすることをお勧めします。テストにはTime.fake(timeA)、やのような気の利いた呼び出しがたくさん含まれますTime.stop()


時間は確かにシステムを介して取得されます。関数メソッドは、loginTimeを格納し、DateTime.Now-loginTimeを使用して経過時間を計算します。私はそれを模倣してみます。その方向を教えてくれてありがとう。
mhr

5
次に、それをリファクタリングし、すべての呼び出しをSystem.currentTimeMillis()method Time.now()に置き換えます。これは通常同じことを行いますが、テストでは、任意の値を返すことができます。これには多少の労力が必要ですが、非常に焦点が絞られて抑制された変更であるため、何も壊す可能性はありません。
Kilian Foth 2013

1

時間測定とインジケーターの評価は、さまざまな機能で行う必要があります。あなたの場合、elapsedTime評価関数の入力でなければなりません。そうすることで、評価コードをテストでき、理解しやすくなります。

これで、時間測定機能のテストに問題が残っていますが、これはこの質問の範囲を超えています。


これは私が目指していることの1つですが、現在、elapsedTimeは関数で計算さます。観察可能な動作が同じであることを確認するためのテストを行わずにこれを抽出するのが良いかどうかはわかりません-Fowlers リファクタリングに関して重要なことは何ですか。
mhr
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.