web-dev-qa-db-ja.com

JUnitはパフォーマンステストを作成するのに適したツールですか?

先週、私は2つのクラスを作成しましたが、私のチームはそれらのパフォーマンスに関して懸念を表明しました。コードを評価するために、簡単なJUnitテストを作成し、豊富なテストデータのセットを作成してこれらのクラスを実行し、そのデータを関連するメソッドに何千回も繰り返し送りました。各反復の実行時間を記録し、ループとSystem.nanoTime()を使用して、高、低、および平均時間をログアウトしました。最後に、JUnitに、高い時間と平均時間が許容範囲内であると断言させました。このテスト方法により、チームはこのコードに自信を持ちました。

JUnitは、この方法でパフォーマンスをテストするための適切なツールですか?ユニット(メソッドおよびクラス)レベルでパフォーマンスをテストするためのより良いツールはありますか?

41
Freiheit

より良いアプローチがあるかもしれませんが、JUnitでベンチマークを実装するのに役立ついくつかのフレームワークもあります。いくつかの有用なプラクティスは、ウォームアップ実行、統計的評価です。 JUnitBenchmarks および JUnitPerf をご覧ください

[〜#〜] edit [〜#〜]は、質問が述べられて以来、JUnitBenchmarksが非推奨になっているようです。プロジェクトのメンテナーは [〜#〜] jmh [〜#〜] に進むことを推奨しています。バリーNL、ヘッズアップをありがとう。

41
kostja

いいえ。JUnitは単体テスト用に設計されています。 Javaでパフォーマンステストを作成する際には、多くの注意が必要です。 Google Caliper を使用します。これは、特にマイクロベンチマークテストを作成するために設計されています。

Javaで正しいマイクロベンチマークを書くにはどうすればいいですか? を見てください

21

テストはベンチマークテストとしてより適切に定義する必要があります。はい、JUnitはこの方法で使用できますが、最良の選択ではありません。ただし、たとえば最大値を定義できます。テストの評価時間。したがって、パフォーマンスの低下を引き起こすアルゴリズムが変更された場合、テストは失敗します。構成には@Test(timeout=12345)を使用します。

実際のパフォーマンステストが必要な場合は、JMeterを検討してください。

6
AlexR