2012-05-18 11 views
7

単体テストを実行し、すべてのメソッドが呼び出された頻度、作成された特定のクラスのインスタンス数、どれくらいの時間特定のメソッド/スレッドなどを実行するようにします。次に、この情報をいくつかの期待値と比較したいと思います。私にこれをさせるよりもProfiler for Javaはありますか?(これはGUIやユーザーのやり取りなしで自動的に行われます)単体テストのJavaプロファイリング結果を自動的に比較する

これは、私はそれが仕事をしたい方法です:自動的にプロファイリング情報のスナップショットをキャプチャ

public class MyTest { 
    @Test 
    public void justTwoCallsToFoo() { 
    Profiler.start(Foo.class); 
    Foo foo = new Foo(); 
    foo.someMethodToProfile(); // profiler should collect data here 
    assertThat(
     Profiler.getTotalCallsMadeTo(Foo.class, "barMethod"), 
     equalTo(3) 
    ); 
    } 
} 
+0

この質問は、他の複数の「Javaプロファイラをお勧めしますか?それで質問?私はIntellijでYourKitを使用し、他の実行ごとに(個々の)ユニットテストをプロファイルします... – amaidment

+1

私は**ユニットテストの中でクラス/メソッド**をプロファイリングしたいです - IDEやプロファイラとの視覚的なやりとりなしに。 – yegor256

+0

ユニットテストでプロファイラが実行され、出力が収集され、プロファイリングデータに基づいて単体テストが合格/不合格になることを意味しますか?たとえば、メソッドが呼び出された回数です。もしそうなら、私は、プログラムでプロファイラ*を呼び出して、APIを介してその出力を取得したいことを明確にするために質問を明確にすることができると考えています。たとえば、人間と同じように「私は比較したい」と読んでいます。 –

答えて

1

これはJ2SE内蔵のHPROF profiling toolで実行できることがわかりました。

java -agentlib:hprof=cpu=times MyTest 

は、それはこのようにフォーマットされたテキストファイルを生成します。

CPU SAMPLES BEGIN (total = 126) Fri Oct 22 12:12:14 2004 
rank self accum count trace method 
    1 53.17% 53.17%  67 300027 java.util.zip.ZipFile.getEntry 
    2 17.46% 70.63%  22 300135 java.util.zip.ZipFile.getNextEntry 
    3 5.56% 76.19%  7 300111 java.lang.ClassLoader.defineClass2 
    4 3.97% 80.16%  5 300140 java.io.UnixFileSystem.list 
    5 2.38% 82.54%  3 300149 java.lang.Shutdown.halt0 
.... 

その後、それはあなたが興味のあるメソッドをファイルを解析して抽出するのは簡単です解決策は完全に無料で、JSEは内蔵しています。これは他のツールと比較して大きな利点です。

+0

これまでに提供したリンクがoracleホームページにリダイレクトされているようです。http://docs.oracle.com/javase/7/docs/technotes/に更新することができます。 samples/hprof.htmlm – evandor

3

は、いくつかのJavaプロファイラで可能である、あなたはプロファイラとあなたをロードするためのJava起動コマンドにVMパラメータを追加する必要がありますプロファイラにデータを記録し、終了時にスナップショットを保存するように指示する必要があります。

JProfilerには"profile" ant taskを使用できます。 JProfiler GUIからエクスポートされた設定ファイルからプロファイリング設定を取得します。 Controller APIを使用して、スナップショットの記録と保存を開始できます。あなたは、既知のベースラインに対してスナップショットを比較することjpcompareコマンドラインユーティリティまたは対応する"compare" ant taskを使用することができます

  1. 次に、2つの選択肢があります。 several comparisons availableがあります。結果をHTMLまたは機械可読形式(CSV/XML)で書き出すことができます。

  2. あなたがjpexportコマンドラインユーティリティまたは対応する"export" ant taskでスナップショットからデータを抽出することができます。次に、独自のコードを記述して、特定の実行のプロファイリングデータを分析することができます。プロファイリングデータの限られたセットについて

、あなたの例ではProfiler.getTotalCallsMadeTo(Foo.class, "barMethod")ような何かをして、独自のプロファイラーを書くことJProfilerをAPIを使用することが実際に可能です。 JPofilerのインストール例のapi/samples/platformの例を参照してください。ホットスポットデータから情報を取得します。

しかし、特定のメソッドが呼び出されたかどうかについてアサーションを行うには、AOPベースのアプローチをとることをお勧めします。パフォーマンスの低下を検出するには、プロファイラベースのアプローチを使用することが適切です。

免責事項:私の会社はJProfilerを開発しています。

+0

解決策のように聞こえます、ありがとう。 Btw、Mavenプラグインはありますか? – yegor256

+0

いいえ、まだMavenプラグインはありません。 –

+0

もう1つの欠点は、無料の製品ではないことです。 – yegor256

関連する問題