2012-01-26 12 views
2

静的関数のMockingを含む、モックを頻繁に使用する非常に遅いJUnitテストがいくつかあります。シングルテストは20〜30秒かかりますが、 "mvn test"全体には25分かかります。PowerMockでのJUnitテストのプロファイリング?

時間が無駄になっている場所を分析したいが、プロファイリングの経験がほとんどない。

従属モックオブジェクトの初期化が非常に長くかかると仮定します。

つの質問:

1)どのように私はすぐに時間が浪費されている方法で数値を得ることができますか?複雑なパワーユーザーツールは必要ありません。数字を取得するための基本的なものです。 (私たちがしている嘲笑の種類が悪いという証拠)

2)あなたは、設計上の欠陥がそのような悪いタイミングを生むことができるアイデアはありますか?私たちは、模擬サービスを呼び出すJSFバッキングBeanをテストします。おそらく、入力妥当性検証ロジックまたは非リファクタリングされたビジネスロジックがバッキングBeanに存在するかもしれませんが、変更することはできません(それについてのコメントはありません;-))

ad 2)たとえば、 )クラスは@PrepareForTestでテストの準備をします。これは良いことではありませんが、理由を説明することはできません。ここで

答えて

3

は、この上の私の入力です:

  1. Apache Commons StopWatch classのような単純なものを使用してみてください。私はこれがコード内のボトルネックを見つける簡単な方法であることが分かりました。通常、最初のボトルネックが何であるかを見つけると残りのボトルネックが見つけやすくなります。非常に複雑なプロファイリングツールを設定しようとすると、ほとんど時間を無駄にすることはほとんどありません。

  2. 私はあなたが完全に模擬ユニットテストでこのようなパフォーマンスの欠陥を持っていることは奇妙だと思います。私が推測しなければならないことは、あなたが1つか2つの嘲笑されたコンポーネントを欠いていると言って、データベースや外部のWebサービスが実際に呼び出されているということです。もちろん、私は間違っているかもしれません.PowerMockを使わないので、私は決してのすべての静的メソッドをモックしないようにしています。これは現在の最大の設計上の欠陥であり、コードに優れたテストカバレッジを提供する上での最大の障害です。じゃあ何をすればいいの? 2つのオプションがあります。静的メソッドを簡単に嘲笑するクラスメソッドにリファクタリングすることができます。もう1つの選択肢は、静的メソッドをクラスオブジェクトラッパーにラップし、代わりにラッパーをモックすることです。静的メソッドがソースを持たないサードパーティのライブラリからのものである場合は、通常これを行います。

  3. one test has about 30 (!) classes to be prepared for test with @PrepareForTest. This cannot be good, but I cannot explain why.これは実際にはがあまりにも多くの方法を持つように聞こえるかもしれません!これは、約99%のケースで1つのメソッドの依存関係が大きすぎます。おそらくこの方法は、より簡単にテスト可能な別個の方法に分離することができます。

希望します。