プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle JDeveloperによるアプリケーションの開発
12c (12.1.3)
E57556-02
  目次へ移動
目次

前
 
次
 

10 Javaアプリケーション・プロジェクトのテストとプロファイリング

JDeveloperでは、Javaコードの品質およびパフォーマンスを分析するためのツールが提供されています。また、Javaプロジェクトのユニット・テスト用の機能が用意されています。これらのツールを使用して、コードの品質およびプログラミング・スキルを高めることができます。

この章の内容は次のとおりです。

10.1 Javaアプリケーション・プロジェクトのテストとプロファイリングについて

プロファイラは、プログラムに関する統計を収集して、パフォーマンスの問題を診断できるようにします。プロファイラは、実行中のプログラムによるプロセッサおよびメモリーのリソースの使用状況を監視し、ログに記録します。また、統計を収集して、パフォーマンスの問題をより容易に診断し、コードの非効率な部分を修正できるようにします。

JDeveloperには、アプリケーションをテストするために「新規ギャラリ」からアクセス可能なJUnitウィザードがあり、テスト・フィクスチャ、テスト・ケース、およびテスト・スイートを作成できます。JUnitなどの自動テストツールにより、通常の、信頼できるユニット・テストをより簡単に実行できます。JUnitは、JDeveloperにインストールおよび統合できるオプション機能です。

10.2 アプリケーションのプロファイリング

プロファイラは、実行中のプログラムによるプロセッサおよびメモリーのリソースの使用状況を監視し、ログに記録します。統計が収集され、パフォーマンスの問題をより容易に診断してコードの非効率な部分を修正できます。

JDeveloperプロファイリング・ツールは、次の3つのモードで機能します。

  • JVM遠隔測定グラフとスレッド・タイムラインを含むオーバーヘッドなしモニタリングに対応するモニター。スレッドのアクティビティやメモリー割当てなどの、ターゲットJVMのプロパティに関する概要を取得する場合にこれを選択します。

  • 動的バイトコード計測を利用するクイック・サンプリング、または高度にカスタマイズされたパフォーマンス・プロファイリングに対応するCPU。メソッドの実行時間やメソッドが呼び出された回数などの、アプリケーション・パフォーマンスに関する詳細データを取得する場合にこれを選択します。

  • 特定のタイプのメモリー・リークを特定するための存続世代メトリックを含むメモリー・プロファイリング。オブジェクト割当てとガベージ・コレクションに関する詳細データを取得する場合にこれを選択します。

また、HeapWalkerと呼ばれる.hprofビューアも提供します。

10.2.1 CPUプロファイラについて

CPUプロファイラは、アプリケーションがプロセッサに及ぼす影響を分析するために使用します。これを使用すると、プログラムでCPU時間を最も多く消費するメソッドとスレッドを特定できます。CPUプロファイラを使用すると、起動、初期化、再描画およびコンパイルなどのアプリケーションの機能をテストできます。CPUプロファイラによって、アプリケーションのパフォーマンスに関する統計データが収集されて表示されます。

プロファイラには、CPUプロファイリング用の2つのツールがあります。

  • クイック(サンプリング済): アプリケーションをサンプリングし、定期的にスタック・トレースを取得します。このオプションは、メソッドをインストゥルメントする方法と比較して正確性が低下しますが、オーバーヘッドは低くなります。このオプションは、インストゥルメントが必要になる可能性のあるメソッドを見つけるのに役立ちます。

  • 拡張(インストゥルメント済): プロファイル済アプリケーションのメソッドをすべてインストゥルメントします。ルート・メソッドを定義することでインストゥルメントされるアプリケーションのコードの一部を制限する場合に選択できます。このオプションにより、プロファイリングのオーバーヘッドを大幅に削減できます。

10.2.2 メモリー・プロファイラについて

メモリー・プロファイラを使用すると、プログラムがどのようにJavaヒープを使用しているかを把握できます。メモリー・リークやヒープの非効率な使用、および一般にメモリーに関する疑わしい動作を検出できます。プロファイラには、メモリー・プロファイリング用の2つのツールがあります。

  • クイック(サンプリング済): アプリケーションをサンプリングし、定期的にスタック・トレースを取得します。このオプションは、メソッドをインストゥルメントする方法と比較して正確性が低下しますが、オーバーヘッドは低くなります。このオプションは、インストゥルメントが必要になる可能性のあるメソッドを見つけるのに役立ちます。

  • 拡張(計測済): プロファイルされたアプリケーションのメソッドがすべて計測されます。ルート・メソッドを定義することによって、計測されるアプリケーションのコード部分を制限するように選択できます。このオプションにより、プロファイリングのオーバーヘッドを大幅に削減できます。

10.2.3 プロファイリング・セッションの開始方法

実行の対象となるプロジェクトがローカル・マシンに存在している場合は、追加構成なしでプロジェクトをプロファイルすることができます。ローカル・プロジェクトをプロファイルする際、プロジェクトを起動してJDeveloperの中からプロファイリング・セッションを開始します。

ローカル・アプリケーションのプロファイリングを実行したいけれども、JDeveloperからアプリケーションを開始できない、または開始したくない場合には、アプリケーションにIDEをアタッチしてアプリケーションをプロファイルすることができます。詳細は、第10.2.14項「アタッチ・モードを使用したプロファイリング」を参照してください。

ローカル・プロジェクトをプロファイルするには、エディタでプロジェクトを開く必要があります。IDEでプロファイラを使用するには、事前にプロファイラを調整しておく必要があります。プロファイラの調整は1回だけで十分です。詳細は、第10.2.6項「プロファイラの調整方法」を参照してください。初めてプロジェクトをプロファイルする場合、IDEでプロジェクト・ビルド・スクリプトを変更してプロファイラを統合する必要があります。IDEでは、プロジェクト・ビルド・スクリプトのバックアップを作成した後で変更が実行されます。

特定の操作がプロファイル・セッション中にIDEによって実行されるように設定を構成できます。たとえば、CPUやメモリー解析の稼働結果を開いたり、常にスレッド・ビューを表示したり、ヒープ・ダンプをプロファイル済プロジェクトに常時保存するなどの操作がIDEで可能です。

プロファイリング設定を構成するには:

  1. 「ツール」「プリファレンス」「プロファイラ」を選択します。

  2. 「プロファイラ」ページで、ポート番号を設定し、必要な設定を指定します。

  3. 「OK」をクリックします。

プロファイリング・セッションを開始する手順は次のとおりです。

  • メイン・メニューから、「実行」プロファイラ <project_name>をクリックします。

    プロファイラをアタッチするには、メイン・メニューから「実行」「プロファイラのアタッチ」をクリックします。

10.2.4 プロファイリングのウィンドウについて

アプリケーションをプロファイリングする際、IDEで提供される一連のウィンドウによってプロファイリング・プロセスの制御とプロファイリングの結果表示が可能になります。次のウィンドウを開くには、「ウィンドウ」「プロファイリング」「ウィンドウ名」(例: 「ウィンドウ」「プロファイリング」「プロファイリング・ポイント」)を選択します。

次のウィンドウを使用すると、プロファイリング・セッションの制御と構成を実行できます。

  • 「プロファイラ」ウィンドウ: このウィンドウには、プロファイリング・セッションを開始、停止、変更するコントロール、プロファイリング結果が表示されるウィンドウを開くコントロール、およびスナップショットを管理するコントロールが表示されます。

  • 「プロファイリング・ポイント」ウィンドウ: このウィンドウを使用して、プロファイリング・ポイントの表示と管理を実行できます。

プロファイラは、次のウィンドウを使用してプロファイリング結果を表示します。

  • プロファイリングのライブ結果

  • 「遠隔測定の概要」ウィンドウ

  • 「VM遠隔測定」ウィンドウ

  • スレッドのプロファイリング・ウィンドウ

  • 「スナップショット」ウィンドウ

  • 「ヒープ」ウィンドウ

10.2.5 プロファイリング結果について

プロファイリング・セッションから取得したプロファイリング結果は、選択するプロファイリング・タスクによって異なります。プロファイリング・セッションが進行中の場合は、プロファイリング・タスクのライブ結果を確認することができます。プロファイリング・セッションの任意の時点で、結果を取得して保存できます。

ライブ結果

「ライブ結果」ウィンドウには、プロファイリング・セッションの進行中にわたるプロファイリング・タスクの結果が表示されます。

  • 「VM遠隔測定」: 「VM遠隔測定」ウィンドウには、スレッド・アクティビティおよび、VMでのメモリー・ヒープとガベージ・コレクションに関する高水準のデータが表示されます。

  • 「スレッド」: 「スレッド」ウィンドウには、アプリケーションのスレッド・アクティビティに関する詳細情報が表示されます。

  • 「遠隔測定の概要」: 「遠隔測定の概要」ウィンドウには、「VM遠隔測定」ウィンドウに表示されるグラフの小型バージョンが表示されます。

  • 「プロファイリングのライブ結果」: 「プロファイリングのライブ結果」ウィンドウには、実行中のプロファイリング・セッションのライブ・データが表示されます。表示されるライブ結果は、選択されたプロファイリング・タスクによって異なります。


    注意:

    「プロファイリングのライブ結果」ビューは、アプリケーションをモニタリングしているときには使用できません。

これらのウィンドウを開くには、メイン・メニューから「ウィンドウ」「プロファイリング」「ウィンドウ名」を選択します。

取得した結果

取得した結果のウィンドウには、プロファイリング・セッションの特定の時点におけるプロファイリング・データが表示されます。結果の取得はプロファイリング・セッション中のどの時点でも可能であり、その結果はプロジェクトまたはローカル・システムに保存できます。保存した取得結果を表示するのに、プロファイリング・セッションを実行中である必要はありません。

  • 「スナップショット」: このビューには、プロファイリング・セッションの取得結果が表示されます。スナップショットに含まれているデータは、スナップショットの撮影時に実行しているプロファイリング・タスクによって異なります。

  • 「ヒープ」: このビューにはヒープ・ダンプが表示されます。このビューで、ヒープのコンテンツを調べることができます。

  • ビューをイメージとして保存: 「ライブ結果」ウィンドウに表示されている現在のビューの.pngイメージは、ツールバーの「現在のビューを画像に保存」ボタンを使用して保存できます。このボタンは、プロファイル・ビューで画像への保存をサポートしている場合にかぎり、使用できます。「ファイルまたはディレクトリの選択」ダイアログで、イメージを保存するファイルまたはディレクトリを指定して、「保存」をクリックします。

10.2.6 プロファイラの調整方法

IDEを使用してアプリケーションのプロファイリングを実行するには、事前にIDEを調整しておく必要があります。この調整プロセスは、プロファイリングに使用するJDKごとに実行する必要があります。これは、アプリケーションのバイトコード計測によってある程度のオーバーヘッドが生じ、より正確な結果を得るためには、コード計測にかかる時間を要因から取り除く必要があるために行います。

ローカル・システム用にIDEを調整する手順は次のとおりです。

  1. 実行中のその他のプログラムをすべて終了します。

    他のアプリケーションを実行中であっても調整は実行されますが、調整の実行時にCPU集中型プログラムを実行すると、正確なプロファイリング結果が得られない可能性があります。

  2. メイン・メニューから、「実行」「プロファイラ」「プロファイラの調整の実行」を選択します。

  3. プロファイリングに使用するJavaプラットフォームを選択して、「OK」をクリックします。


    注意:

    Javaプラットフォームは、「ツール」→「ライブラリの管理」ページでJava SE定義に追加されている場合のみ、調整できます。

    「OK」をクリックすると、選択したJavaプラットフォームに関する調整データが収集されます。調整プロセスが完了したら、IDEを使用してアプリケーションのプロファイリングを開始できます。

    複数のコンピュータまたはシステム間で調整データを共有しないようにしてください。


    注意:

    IDEの調整は、使用するJDKごとに1回だけで十分です。ただし、システムのパフォーマンスに影響するような変更をローカル構成またはリモート構成に加えた場合には、調整プロセスを再実行することをお薦めします。システム・パフォーマンスに影響を与える可能性のある変更とは、次のようなものです。
    • ハードウェアのアップグレード

    • オペレーティング・システムの有意な変更またはアップグレード

    • プロファイリングに使用するJavaプラットフォームのアップグレード


10.2.7 ヒープ・ダンプの取得方法

プロファイリング・セッションの進行中にヒープ・ダンプを取得できます。ヒープ・ダンプを取得するときに、ヒープをプロジェクトまたはローカル・ファイル・システムに保存するよう要求されます。ヒープ・ダンプを保存した後で、随時ヒープ・ダンプをロードして、ヒープ上のオブジェクトを参照したり、個別オブジェクトの参照を特定したり、ヒープ・ダンプの比較によるスナップショット間の相違を確認したりすることができます。ヒープ・ダンプをロードしたり参照したりするために、プロファイリング・セッションが実行中である必要はありません。

ヒープ・ダンプを取得するには、アプリケーションがJDK 1.5.0_12またはそれ以降で実行している必要があります。

プロファイリング・ポイントを使用してヒープ・ダンプを取得する手順は次のとおりです。

  1. プロファイリング・ポイントを配置するコードが含まれているソース・ファイルを開きます。

  2. プロファイリング・ポイントを配置するコードの行を右クリックして、「プロファイリング・ポイントの追加」を選択します。

  3. 「プロファイリング・ポイント・タイプ」リストで、次のスナップショット・ポイントのいずれか1つを選択して「次へ」をクリックします。

    • スナップショットの取得

    • 時間によるスナップショットの取得

    • トリガーによるスナップショットの取得

  4. ウィザードの「プロパティのカスタマイズ」ページで、スナップショットのタイプとして「ヒープ・ダンプ」を選択し、追加設定を変更します。「ヒープ・ダンプ」オプションは、「設定」→「取得」から使用できます。

プロファイリング・ポイントを使用してヒープ・ダンプを取得する際、プロファイリング・ポイントを配置するソース・コード内のポイントを指定します。たとえば、スレッドが特定のメソッドに入ったときに、ヒープ・ダンプを取得する必要が生じることがあります。

OutOfMemoryエラー時にヒープ・ダンプを取得する手順は次のとおりです。

  1. メイン・メニューから、「ツール」「設定」「プロファイラ」を選択します。

  2. 「OutOfMemoryError時」リストで、OutOfMemoryError発生時のIDEの動作を指定するオプションをドロップダウン・リストから選択します。

    デフォルトの動作は、ヒープ・ダンプをプロファイル済プロジェクトに保存することです。

10.2.8 オブジェクト問合せ言語(OQL)を使用したヒープ・ダンプの分析方法

OQLはSQLに似た問合せ言語であり、Javaヒープに問い合わせて、そのJavaヒープから要求された情報のフィルタ処理/選択を可能にします。「クラスXのすべてのインスタンスを表示」というような事前定義の問合せはツールによってすでにサポートされていますが、OQLでは柔軟性が高くなっています。OQLは、JavaScript式言語に基づいています。

「ヒープ」ウィンドウでJavaヒープをロードする際、このウィンドウの「OQLコンソール」タブをクリックしてOQLエディタを開くことができます。OQLコンソールには、OQLエディタ、保存済OQL問合せウィンドウ、および問合せ結果を表示するウィンドウが含まれています。任意のサンプルOQL問合せを使用したり、ヒープ・データをフィルタ処理および選択する問合せを作成して、Javaヒープから必要な情報を特定することができます。問合せを選択または作成した後で、Javaヒープに対して問合せを実行して、結果を表示できます。

OQL問合せのフォームは次のとおりです。

select <JavaScript expression to select>
[ from [instanceof] <class name> <identifier>
[ where <JavaScript boolean expression to filter> ] ]

ここでは、class nameは完全修飾Javaクラス名(例: java.net.URL)または配列クラス名、char[] (または[C)はchar配列名、java.io.File (または[Ljava.io.File;)はjava.io.File[]の名前、というようになります。完全修飾されたクラス名が、実行時にJavaクラスを常に一意に識別するとはかぎりません。同名であっても、別のローダーによってロードされた複数のJavaクラスが存在している場合もあります。したがって、クラス名にはクラス・オブジェクトのID文字列が使用できます。instanceofキーワードが使用されている場合は、サブタイプ・オブジェクトが選択されます。このキーワードが指定されていない場合は、指定されたクラスのインスタンスのみが選択されます。from句とwhere句は両方ともオプションです。

select句および(オプションとして)where句では、式はJavaScript式で使用されます。フィールドに自然構文でアクセスできるようにするために、Javaヒープ・オブジェクトは便利なスクリプト・オブジェクトとしてラップされます。たとえば、Javaフィールドはobj.field_name構文でアクセスでき、配列要素はarray[index]構文でアクセスできます。選択されたJavaオブジェクトはそれぞれ、from句で指定された識別子名のJavaScript変数にバインドされます。

10.2.8.1 OQLの例

長さが100以上のStringをすべて選択します。

select s from java.lang.String s where s.count >= 100

長さが256以上のint配列をすべて選択します。

select a from int[] a where a.length >= 256

正規表現に一致するStringのコンテンツを表示します。

select {instance: s, content: s.toString()} from java.lang.String s
    where /java/(s.toString())

すべてのFileオブジェクトのパス値を表示します。

select file.path.toString() from java.io.File file

すべてのClassLoaderクラスの名前を表示します。

select classof(cl).name 
    from instanceof java.lang.ClassLoader cl

指定されたID文字列によって識別されるClassのインスタンスを表示します。

select o from instanceof 0xd404b198 o

0xd404b198はClassのIDです(セッション内)。これを検索するには、そのクラスのページに表示されたIDを調べます。

10.2.8.2 OQLの組込みオブジェクトと関数

ヒープ・オブジェクト

ヒープ組込みオブジェクトは、次のメソッドをサポートしています。

  • heap.forEachClass: Javaクラスごとにコールバック関数をコールします。

    heap.forEachClass(callback);
    
  • heap.forEachObject: Javaオブジェクトごとにコールバック関数をコールします。

    heap.forEachObject(callback, clazz, includeSubtypes);
    

    clazzは、インスタンスが選択されているクラスです。これが指定されない場合、java.lang.Object. includeSubtypesのデフォルトは、サブタイプ・インスタンスを含めるかどうかを指定するブール・フラグになります。このフラグのデフォルト値はtrueです。

  • heap.findClass: 指定された名前のJavaクラスを検索します。

    heap.findClass(className);
    

    この場合のclassNameは、検索するクラスの名前です。結果として得られるClassオブジェクトのプロパティは、次のとおりです。

    • name: クラスの名前。

    • superclass: スーパークラスのClassオブジェクト(または、java.lang.Objectの場合はnull)。

    • statics: Classの静的フィールドの名前と値のペア。

    • fields: フィールド・オブジェクトの配列。フィールド・オブジェクトのプロパティはnameとsignatureです。

    • loader: このクラスをロードしたClassLoaderオブジェクト。

    Classオブジェクトのメソッドは、次のとおりです。

    • isSubclassOf: 指定されたクラスがこのクラスの直接または間接サブクラスかどうかをテストします。

    • isSuperclassOf: 指定されたClassがこのクラスの直接または間接のスーパークラスかどうかをテストします。

    • subclasses: 直接および間接サブクラスの配列を返します。

    • superclasses: 直接および間接スーパークラスの配列を返します。

  • heap.findObject: 指定されたオブジェクトIDからオブジェクトを検索します。

    heap.findObject(stringIdOfObject);
    
  • heap.classes: すべてのJavaクラスの列挙を返します。

  • heap.objects: Javaオブジェクトの列挙を返します。

    heap.objects(clazz, [includeSubtypes], [filter])
    

    clazzは、インスタンスが選択されているクラスです。これが指定されない場合、java.lang.Object. includeSubtypesのデフォルトは、サブタイプ・インスタンスを含めるかどうかを指定するブール・フラグになります。このフラグのデフォルト値はtrueです。このメソッドでは、オプションのフィルタ式を受け入れてオブジェクトの結果セットをフィルタ処理します。

  • heap.finalizables: - ファイナライズが保留中であるJavaオブジェクトの列挙を返します。

  • heap.livepaths: - 指定されたオブジェクトがアライブしているパスの列挙を返します。このメソッドでは、ブール・フラグであるオプションの第2パラメータを受け入れます。このフラグにより、弱い参照のあるパスを含めるかどうかが指定されます。デフォルトでは、弱い参照のあるパスは含まれません。

    select heap.livepaths(s) from java.lang.String s
    

    この配列の各要素が、別の配列になっています。後の配列には、パスの「参照チェーン」に入っているオブジェクトが含まれています。

  • heap.roots: - ヒープのRootの列挙が返されます。

    各Rootオブジェクトのプロパティは、次のとおりです。

    • id: このルートにより参照されるオブジェクトの文字列ID

    • type: Rootの記述タイプ(JNIグローバル、JNIローカル、Java Staticなど)

    • description: Rootの文字列の記述

    • referrer: このルートに責任を持つ、またはnullであるThreadオブジェクトまたはClassオブジェクト

  • クラスjava.lang.Systemの静的フィールド'props'にアクセスします。

    select heap.findClass("java.lang.System").statics.props
    select heap.findClass("java.lang.System").props
    
  • java.lang.Stringクラスのフィールド数を取得します。

    select heap.findClass("java.lang.String").fields.length
    
  • オブジェクトIDが指定されているオブジェクトを検索します。

    select heap.findObject("0xf3800b58")
    
  • 名前パターンjava.net.*を持つクラスをすべて選択します。

    select filter(heap.classes(), "/java.net./(it.name)")
    

個別のオブジェクトに対する関数

  • allocTrace関数

    指定されたJavaオブジェクトがある場合は、その割当てサイト・トレースを返します。allocTraceはframeオブジェクトの配列を返します。各frameオブジェクトのプロパティは、次のとおりです。

    • className: メソッドがframeで実行中であるJavaクラスの名前。

    • methodName: - frameで実行中のJavaメソッドの名前。

    • methodSignature: frameで実行中のJavaメソッドのシグネチャ。

    • sourceFileName: frameで実行中のJavaクラスのソース・ファイルの名前。

    • lineNumber: メソッド内のソース行番号。

  • classof関数

    指定されたJavaオブジェクトのクラス・オブジェクトを返します。結果として得られるオブジェクトは次のプロパティをサポートしています。

    • name: クラスの名前。

    • superclass: スーパークラスのクラス・オブジェクト(または、java.lang.Objectの場合はnull)

    • statics: クラスの静的フィールドの名前と値のペア

    • fields: fieldオブジェクトの配列。fieldオブジェクトのプロパティはnameとsignatureです。

    • loader: このクラスをロードしたClassLoaderオブジェクト。

    Classオブジェクトのメソッドは、次のとおりです。

    • isSubclassOf: 指定されたクラスがこのクラスの直接または間接サブクラスかどうかをテストします。

    • isSuperclassOf: 指定されたクラスがこのクラスの直接または間接のスーパークラスかどうかをテストします。

    • subclasses: 直接および間接サブクラスの配列を返します。

    • superclasses: 直接および間接スーパークラスの配列を返します。

    • 各Referenceタイプ・オブジェクトのクラス名を表示します。

      select classof(o).name from instanceof java.lang.ref.Reference o
      
    • java.io.InputStreamのすべてのサブクラスを表示します。

      select heap.findClass("java.io.InputStream").subclasses()
      
    • java.io.BufferedInputStreamのすべてのスーパークラスを表示します。

      show all superclasses of java.io.BufferedInputStream 
      
  • forEachReferrer関数

    指定されたJavaオブジェクトのリファラごとにコールバック関数をコールします。

  • identical関数

    指定された2つのJavaオブジェクトが同一かどうかを返します。次に例を示します。

    select identical(heap.findClass("Foo").statics.bar, heap.findClass("AnotherClass").statics.bar)
    
  • objectid関数

    指定されたJavaオブジェクトの文字列IDを返します。このIDはheap.findObjectに渡すことができ、識別のためにオブジェクトを比較する場合にも使用できます。次に例を示します。

    select objectid(o) from java.lang.Object o
    
  • reachables関数

    指定されたJavaオブジェクトから推移的に参照されるJavaオブジェクトの配列を返します。オプションとして、カンマ区切りフィールド名である第2パラメータがアクセス可能性の計算から除外されることを受け入れます。フィールドはclass_name.field_nameパターンで作成されます。

    • 各Propertiesインスタンスからアクセス可能なオブジェクトをすべて印刷します。

      select reachables(p) from java.util.Properties p
      
    • java.net.URLからアクセス可能なオブジェクトをすべて印刷しますが、指定されたフィールド経由でアクセス可能なオブジェクトは省略されます。

      select reachables(u, 'java.net.URL.handler') from java.net.URL u
      
  • referrers関数

    指定されたJavaオブジェクトの参照を保持するJavaオブジェクトの列挙を返します。このメソッドでは、ブール・フラグであるオプションの第2パラメータを受け入れます。このフラグにより、弱い参照を含めるかどうかが指定されます。デフォルトでは、弱い参照は含まれません。

    • java.lang.Objectインスタンスごとにリファラ数を印刷します。

      select count(referrers(o)) from java.lang.Object o
      
    • java.io.Fileオブジェクトごとにリファラを印刷します。

      select referrers(f) from java.io.File f
      
    • 2つ以上で参照された場合のみ、URLオブジェクトを印刷します。

      select u from java.net.URL u where count(referrers(u)) > 2
      
  • referees関数

    指定されたJavaオブジェクトが直接参照するJavaオブジェクトの配列を返します。このメソッドでは、ブール・フラグであるオプションの第2パラメータを受け入れます。このフラグにより、弱い参照を含めるかどうかが指定されます。デフォルトでは、弱い参照は含まれません。たとえば、java.io.Fileクラスのすべての静的参照フィールドを印刷するには、次のようにします。

    select referees(heap.findClass("java.io.File"))
    
  • refers関数

    最初のJavaオブジェクトが2番目のJavaオブジェクトを参照するかどうかを返します。

  • root関数

    指定されたオブジェクトがオブジェクトのrootセットのメンバーである場合、この関数は、その理由を説明する説明Rootオブジェクトを返します。指定されたオブジェクトがrootではない場合、この関数はnullを返します。

  • sizeof関数

    指定されたJavaオブジェクトのサイズをバイト数で返します。次に例を示します。

    select sizeof(o) from int[] o
    
  • retainedsize関数

    指定されたJavaオブジェクトの保持セットのサイズをバイト数で返します。注意: この関数をヒープ・ダンプに対してはじめて使用する場合は、かなり時間がかかる場合があります。

    retainedsize関数の使用例は次のとおりです。

    select rsizeof(o) from instanceof java.lang.HashMap o
    
  • toHtml関数

    指定されたJavaオブジェクトのHTML文字列を返します。これは、select式によって選択されたオブジェクトに対して自動的にコールされます。ただし、より複雑な出力の印刷に役立つ場合があります。たとえば、ハイパーリンクを太字で印刷するには、次のようにします。

    select "<b>" + toHtml(o) + "</b>" from java.lang.Object o
    

10.2.8.3 複数の値の選択

JavaScriptオブジェクトのリテラルまたは配列を使用して、複数の値を選択できます。

たとえば、スレッド・オブジェクトごとに名前とスレッドを表示します。

select { name: t.name? t.name.toString() : "null", thread: t } 
from instanceof java.lang.Thread t

配列/イテレータ/列挙操作関数

これらの関数は、配列/イテレータ/列挙および式文字列[または、コールバック関数]を入力として受け入れます。これらの関数は、配列/イテレータ/列挙を反復し、各要素に対して式(または関数)を適用します。注意: JavaScriptオブジェクトは連想配列です。したがって、これらの関数は任意のJavaScriptオブジェクトとともに使用することもできます。

  • concat関数

    指定された配列/列挙に、指定されたブール式がコードで指定した要素が含まれているかどうかを返します。評価されたコードは、次の組込み変数を参照できます。

    • it: 現在参照している要素

    • index: 現在の要素の索引

    • array: 反復中の配列/列挙

    たとえば、一部の静的オブジェクトのいくつかのクラスによって参照されるPropertiesオブジェクトをすべて選択するには、次のようにします。

    select p from java.util.Properties p
    where contains(referrers(p), "classof(it).name == 'java.lang.Class'")
    
  • count関数

    指定されたブール式を満たす入力配列/列挙の要素の件数を返します。ブール式のコードは、次の組込み変数を参照できます。

    • it: 現在参照している要素

    • index: 現在の要素の索引

    • array: 反復中の配列/列挙

    たとえば、特定の名前パターンを持つクラスの数を印刷します。

    select count(heap.classes(), "/java.io./(it.name)")
    
  • filter関数

    指定されたブール式を満たす入力配列/列挙の要素が含まれている配列/列挙を返します。ブール式のコードは、次の組込み変数を参照できます。

    • it: 現在参照している要素

    • index: 現在の要素の索引

    • array: 反復中の配列/列挙

    • result: 結果の配列/列挙

    • java.io.*名前パターンを持つクラスをすべて表示します。

      select filter(heap.classes(), "/java.io./(it.name)")
      
    • リファラがjava.netパッケージに属していないURLオブジェクトのすべてのリファラを表示します。

      select filter(referrers(u), "! /java.net./(classof(it).name)")
      from java.net.URL u
      
  • length関数

    配列/列挙の要素数を返します。

  • map関数

    指定されたコードを各要素で評価することにより、指定された配列/列挙を変換します。評価されたコードは、次の組込み変数を参照できます。

    • it: 現在参照している要素

    • index: 現在の要素の索引

    • array: 反復中の配列/列挙

    • result: 結果の配列/列挙

    Map関数は、入力配列/列挙の要素ごとにコードを繰り返しコールすることによって作成された値の配列/列挙を返します。

    たとえば、次の名前と値を持つjava.io.Fileの静的フィールドをすべて表示します。

    select map(heap.findClass("java.io.File").statics, "index + '=' + toHtml(it)")
    
  • max関数

    指定された配列/列挙の最大要素を返します。オプションとして、配列の要素を比較するコード式を受け入れます。デフォルトでは、数値比較が使用されます。比較式では、次の組込み変数が使用できます。

    • lhs: 比較の左辺の要素

    • rhs: 比較の右辺の要素

    • 最大長のstringインスタンスを検索します。

      select max(map(heap.objects('java.lang.String', false), 'it.count'))
      
    • 最大長であるstringインスタンスを検索します。

      select max(heap.objects('java.lang.String'), 'lhs.count > rhs.count')
      
  • min関数

    指定された配列/列挙の最小要素を返します。オプションとして、配列の要素を比較するコード式を受け入れます。デフォルトでは、数値比較が使用されます。比較式では、次の組込み変数が使用できます。

    • lhs: 比較の左辺の要素

    • rhs: 比較の右辺の要素

    • 最小サイズのvectorインスタンスを検索します。

      select min(map(heap.objects('java.util.Vector', false), 'it.elementData.length'))
      
    • 最大長であるvectorインスタンスを検索します。

      select min(heap.objects('java.util.Vector'), 'lhs.elementData.length < rhs.elementData.length')
      
  • sort関数

    指定された配列/列挙をソートします。オプションとして、配列の要素を比較するコード式を受け入れます。デフォルトでは、数値比較が使用されます。比較式では、次の組込み変数が使用できます。

    • lhs: 比較の左辺の要素

    • rhs: 比較の右辺の要素

    • すべてのchar[]オブジェクトをサイズ順に印刷します。

      select sort(heap.objects('char[]'), 'sizeof(lhs) - sizeof(rhs)')
      
    • すべてのchar[]オブジェクトをサイズ順に印刷しますが、サイズも併せて印刷します。

      select map(sort(heap.objects('char[]'), 'sizeof(lhs) - sizeof(rhs)'), 
      '{ size: sizeof(it), obj: it }')
  • top関数

    指定された配列/列挙の上位N個の要素を返します。オプションとして、配列の要素と上位要素の数を比較するコード式を受け入れます。デフォルトでは、外観の順序で上位10個の要素が返されます。比較式では、次の組込み変数が使用できます。

    • lhs: 比較の左辺の要素

    • rhs: 比較の右辺の要素

    • 5つの最長文字列を印刷します。

      select top(heap.objects('java.lang.String'), 'rhs.count - lhs.count', 5)
      
    • 5つの最長文字列を印刷しますが、サイズも併せて印刷します。

      select map(top(heap.objects('java.lang.String'), 
      'rhs.count - lhs.count', 5), '{ length: it.count, obj: it }')
  • sum関数

    指定された入力配列または列挙のすべての要素の合計を返します。オプションとして、第2パラメータとして式を受け入れます。これは、入力要素を合計する前のマッピングに使用します。

    たとえば、各Propertiesオブジェクトからアクセス可能なサイズの合計を返します。

    select sum(map(reachables(p), 'sizeof(it)')) 
    from java.util.Properties p
     
    // or omit the map as in ...
    select sum(reachables(p), 'sizeof(it)') 
    from java.util.Properties p
    
  • toArray関数

    入力配列/列挙の要素が含まれている配列を返します。

  • unique関数

    指定された入力配列/列挙の一意の要素が含まれている配列/列挙を返します。

    次の例では、文字列から参照される一意のchar[]インスタンスを選択しています。複数の文字列インスタンスでコンテンツに対して同じchar[]を共有できます。

    // number of unique char[] instances referenced from any String
    select count(unique(map(heap.objects('java.lang.String'), 'it.value')))
     
    // total number of Strings
    select count(heap.objects('java.lang.String'))
    

10.2.8.4 その他の例

次の例では、各クラス・ローダーのヒストグラムと、それによってロードされたクラス数が印刷されます。

java.lang.ClassLoaderには、タイプjava.util.Vectorのクラスであるprivateフィールドがあり、Vectorにはベクター内の要素数であるelementCountというprivateフィールドがあります。この問合せでは、JavaScriptオブジェクトのliteral関数およびmap関数を使用して複数の値(loader、count)を選択します。これは、sort関数を比較式とともに使用して、結果を件数(つまり、ロードされたクラス数)別にソートします。

select map(sort(map(heap.objects('java.lang.ClassLoader'), 
'{ loader: it, count: it.classes.elementCount }'), 'lhs.count < rhs.count'),
'toHtml(it) + "<br>"')

次の例では、クラス・ローダー・インスタンスごとに親子チェーンを示しています。

select map(heap.objects('java.lang.ClassLoader'),
      function (it) {
         var res = '';
         while (it != null) {
            res += toHtml(it) + "->";
            it = it.parent;
         }
         res += "null";
         return res + "<br>";
      })

java.lang.ClassLoaderクラスの親フィールドが使用されていて、コールをマップするためにコールバック関数を使用して親がnullになるまで検索していることに注意してください。

次の例では、すべてのSystemプロパティの値が印刷されます。この問合せ(および、その他の多くの問合せ)は、Javaプラットフォーム・クラスのprivateフィールドが通知(実装の詳細)なしに変更または削除された可能性があるため、安定していないことがあります。ただし、ユーザーのクラスを制御できる場合は、このような問合せをユーザーのクラスに使用しても安全です。

select map(filter(heap.findClass('java.lang.System').props.table, 'it != null && it.key != null && it.value != null'),
            function (it) {
                var res = it.key.toString() + ' = ' + it.value.toString();
                return res;
            });
  • java.lang.Systemには、タイプjava.util.Propertiesの'props'という名前の静的フィールドがあります。

  • java.util.Propertiesには、タイプjava.util.Hashtable$Entryの'table'というフィールドがあります(このフィールドはjava.util.Hashtableから継承されます)。これはハッシュ表バケット配列です。

  • java.util.Hashtable$Entryにはキー、値、およびnextフィールドがあります。各エントリは、同じハッシュ表バケット内で次のエントリ(またはnull)を指します。

  • java.lang.Stringクラスには、タイプchar[]のvalueフィールドがあります。

10.2.9 CPUパフォーマンスの分析方法

このタスクでは、ターゲット・アプリケーションのパフォーマンスを分析します。アプリケーション全体をプロファイルするか、またはプロファイル対象のクラスを制御するフィルタを指定することによって計測されるコードを制限するように選択できます。

このプロファイリング・タスクを実行すると、次のようなプロファイリング結果が得られます。

  • コンテキストでのメソッド実行の時間(%)と実際の所要時間

  • 各メソッドがコンテキスト内で起動した回数

  • メソッドの起動に達するメソッド・コールのチェーン

  • コンテキストでのメソッド実行の時間/数

アプリケーションのパフォーマンスを分析する手順は次のとおりです。

  1. 分析するアプリケーションを開きます。

  2. メイン・メニューから、「実行」「プロファイル」「プロジェクト」を選択します。

  3. 「プロファイル」ウィンドウの左側のペインで「CPU」をクリックします。

  4. 「フィルタ」リストで、フィルタを選択します。

  5. 選択すると、プロファイリング・ポイントを使用してプロファイラのアクションを制御できます。

  6. 新しいカスタム構成を作成する必要がある場合には、「カスタムを作成」をクリックします。

  7. 「実行」をクリックします。

「実行」をクリックすると、ターゲット・アプリケーションが起動してプロファイリング・セッションが開始します。

10.2.10 カスタム構成の作成方法

カスタム構成を作成する際、そのプロファイリング・タスクに対して使用可能なすべての内部設定を完全に制御できます。カスタム・プロファイリング設定のセットごとに作成、保存、および名前の割当てを実行できます。カスタム構成は特定のプロジェクトに関連付けられており、「プロファイル」ダイアログの「モニター」セクション、「CPU」セクションおよび「メモリー」セクションで選択可能です。

「詳細設定」をクリックすると、より詳細なプロファイリング・オプションを設定できます。カスタム構成は、再使用したり変更したりできるように、IDE作業セッション間で自動的に保存されます。

カスタム構成の作成の手順:

  1. カスタム構成を作成するアプリケーションを開きます。

  2. メイン・メニューから、「実行」「プロファイル」「プロジェクト」を選択します。

  3. 「プロファイル」ウィンドウの左ペインで、「モニター」、「CPU」または「メモリー」をクリックします。

  4. 構成に組み入れる必要のあるオプション、たとえばフィルタ、プロファイリング・ポイントなどを選択します。

  5. 「カスタムを作成」をクリックします。

  6. 「名前」テキスト・ボックスに、新しい構成の名前を入力します。

  7. 「OK」をクリックします。

10.2.11 プロファイリング結果のフィルタリング

「プロファイリングのライブ結果」ウィンドウと結果スナップショットで、表示された結果の下のフィルタ・ボックスを使用して結果を名前別にフィルタ処理できます。

名前別に結果をフィルタ処理する手順は次のとおりです。

  1. メイン・メニューから、「ウィンドウ」「プロファイリング」→「ライブ結果」をクリックします。

  2. 表示された結果の下のフィルタ・ボックス内でフィルタ条件を入力します。

    スナップショットにおいてフィルタ・ボックスが使用できるのは、CPUスナップショットでは「ホットスポット」タブおよび「結合」タブであり、メモリー・スナップショットでは「メモリー」タブです。

  3. 条件に対して次のフィルタリング・パラメータの1つをドロップダウン・メニューから選択します。

    • 次を含む(大/小文字の区別なし)

    • 次を含まない(大/小文字の区別なし)

    • Regular expression(大/小文字の区別)

  4. 右側のチェックをクリックして、フィルタを結果に適用します。

フィルタ・ボックスの右にある矢印をクリックすると、前のフィルタ条件を表示したり、選択したりできます。完全な未フィルタの結果をリストアするには、フィルタ・ボックスの右にある「フィルタのクリア」をクリックします。

10.2.12 プロファイリング・フィルタの設定方法

アプリケーションのパフォーマンスを分析する際、フィルタを使用して、計測に含めるクラス、または計測から除外するクラスを指定できます。フィルタの使用時に計測するクラス数を制限すると、プロファイリングのオーバーヘッドが縮小されます。フィルタを選択するには、プロファイリング・セッションを構成するときに「フィルタ」ドロップダウン・リストからフィルタを選択します。

「簡易フィルタ」の設定を変更する手順は次のとおりです。

  1. カスタム構成を作成するアプリケーションを開きます。

  2. メイン・メニューから、「実行」「プロファイル」「プロジェクト」を選択します。

  3. 「フィルタ」フィールドで、「フィルタ値を表示」をクリックします。

  4. 「フィルタ値」ダイアログで、「簡易フィルタへ」をクリックします。

  5. フィルタ・タイプとして、「除く」または「含む」を選択します。

  6. フィルタ値を入力して、「OK」をクリックします。

フィルタを複数回使用する場合は、カスタム・フィルタ・セットを作成できます。

カスタム・フィルタ・セットを変更または作成する手順は次のとおりです。

  1. プロファイリング・タスクの選択ダイアログで、「CPU」を選択します。

  2. 「フィルタ・セットを編集」をクリックします。

  3. 既存のフィルタ・セットを選択するか、「追加」をクリックして新しいフィルタ・セットの名前を入力します。

  4. 新しいフィルタ・セットを定義する場合は、フィルタ・セット名を指定します。

  5. 「フィルタ・セット・タイプ」を指定します。

  6. 「グローバル・フィルタ」リストで、フィルタ・セットに含めるグローバル・フィルタを、そのフィルタのチェック・ボックスを選択してアクティブにします。

    カーソルを値の上に置くと、そのフィルタに含まれているすべてのパターンが表示されます。

  7. 「OK」をクリックして、新しいカスタム・フィルタ・セットを保存します。

新しいフィルタ・セットを作成した後で、「フィルタ」ドロップダウン・リストからそのフィルタを選択できます。プロジェクトのパフォーマンスを分析する際、その新しいフィルタが使用できます。

10.2.13 プロファイリングのライブ結果の使用方法

「プロファイリングのライブ結果」ウィンドウには、実行中のプロファイリング・セッションのライブ結果が表示されます。ツールバーとポップアップ・メニューを使用して、「プロファイリングのライブ結果」ウィンドウに表示される結果を操作できます。「プロファイリングのライブ結果」ウィンドウを開くには、プロファイリング・セッション中に次のいずれか1つを実行します。

  • メイン・メニューから、「ウィンドウ」「プロファイリング」「ライブ結果」を選択します。

  • 「プロファイラ」ウィンドウで、「ライブ結果」をクリックします。

要素 説明
自動的に結果を更新 有効になっている場合(デフォルト)、結果が短い間隔で更新されます。無効の場合は、「ただちに結果を更新」をクリックして結果を更新します。
ただちに結果を更新 結果をただちに更新する場合にクリックします。
ガベージ・コレクションの実行と結果の更新 ガベージ・コレクションを実行します。
収集結果をリセット すでに蓄積されたプロファイリング結果を廃棄する場合にクリックします。
「収集結果のスナップショットを取得」 結果をスナップショットとして保存する場合にクリックします。未保存のスナップショットはソース・エディタで開かれます。
エクスポート先 クリックすると、指定の場所にデータがエクスポートされます。
現在のビューを画像に保存 表示された結果を.png画像として保存する場合にクリックします。

結果をソートするには、それぞれの列ヘッダーをクリックするか、結果エントリを右クリックしてポップアップ・メニューからコマンドを選択します。表示される結果と使用可能なポップアップ・メニュー項目は、次のどのプロファイリング・タスクを実行しているかによって異なります。

10.2.14 アタッチ・モードを使用したプロファイリング

ただし、IDEの外側でアプリケーションを開始する必要がある場合は、アタッチ・モードを使用してアプリケーションをプロファイルすることができます。たとえば、次のような場合にアタッチ・モードを使用できます。

  • アプリケーションをコマンドラインから開始する必要がある、または複雑な起動スクリプトを使用している。

  • アプリケーションまたはターゲットJVMの起動時にプロファイリング・データを取得する必要がある。

  • アプリケーションを再起動せずにアプリケーションをプロファイルする必要がある。

次のような場合は、アタッチ・モードを使用する必要があります。

  • リモートJVM(リモート・アプリケーション・サーバーなど)で実行中のアプリケーションをプロファイルする必要がある。

アタッチ・モードを使用すると、すでに実行しているアプリケーション、またはローカル・マシンまたはリモート・マシンで起動しようとしているアプリケーションにプロファイリング・ツールをアタッチすることができます。アタッチ・モードの使用は、長時間実行しているアプリケーションのプロファイリング、特にアプリケーション・サーバーで実行しているWebアプリケーションまたはエンタープライズ・アプリケーションのプロファイリングに役立ちます。また、アタッチ・モードを使用して、アプリケーション・サーバー自体のコードをプロファイルすることもできます。

アプリケーションにアタッチするには、ターゲット・アプリケーションまたはサーバーの起動オプションを事前に構成しておく必要があります。「アタッチ・ウィザード」を使用して、プロジェクトのアタッチメント設定を指定します。アタッチメント設定の構成は、1回だけで十分です。アタッチメント設定はプロジェクト固有です。つまり、プロジェクトにはそれぞれ独自の設定が割り当てられています。アタッチメント設定を変更したい場合には、いつでも「アタッチ・ウィザード」を実行できます。

「アタッチ・ウィザード」で、アプリケーションのタイプと場所を指定します。「アタッチ・ウィザード」は、指定された詳細に基づいてアプリケーションまたはサーバーの構成方法に関する手順を示し、プロファイラをアタッチできるようにします。

選択するアタッチ・モードは、取得する必要のあるプロファイリング・データのタイプと、ターゲットJVMプラットフォームの詳細によって異なります。次の表に、アタッチ・モードの概要を示します。

  • Local Direct

    このモードは、ローカル・アプリケーションの起動に関するプロファイリング・データを取得したい場合に使用します。

    このモードを使用する場合、ターゲットJVMとアプリケーションはプロファイラがアタッチされるまで待機した後で起動します。アプリケーションからデタッチした後で、アプリケーションを再起動して別のプロファイリング・セッションを開始する必要があります。

  • Local Dynamic (JDK 1.6が必要)

    このモードは、ローカル・アプリケーションに関するプロファイリング・データを取得したい場合に使用します。このモードを使用するには、アプリケーションでJDK 1.6以上を実行している必要があります。

    このモードを使用すると、アプリケーションを再起動せずにアプリケーションへのアタッチとアプリケーションからのデタッチを実行できます。

  • Remote Direct

    このモードは、リモートJVMで実行しているアプリケーションのプロファイリング・データを取得したい場合に使用します。このモードを使用するには、ターゲット・マシンにProfiler Remote Packをインストールする必要があります。リモート・システムの詳細を指定し、「アタッチ・ウィザード」を使用してProfiler Remote Packを生成してください。

    このモードを使用すると、プロファイラがアタッチされた後でリモート・アプリケーションが起動します。このモードを使用すると、ターゲットJVMの起動に関するプロファイリング・データを取得できます。

10.2.15 アプリケーションのモニター方法

「プロファイリング・タスク」ボックスで「アプリケーションのモニター」を選択すると、ターゲット・アプリケーションは計測なしで実行します。スレッドのアクティビティやメモリー割当てなどの、ターゲットJVMのプロパティに関する高水準の情報のみが結果として表示されます。

アプリケーションをモニターする手順は次のとおりです。

  1. モニターするアプリケーションを開きます。

  2. メイン・メニューから、「実行」「プロファイル」を選択します。

  3. 「モニター」をクリックします。

  4. オプションとして、「スレッドのモニターを有効化」を選択します。

    このオプションは、アプリケーションの起動からスレッドをモニターする場合に選択します。スレッドの状態をサンプリング・オプションがデフォルトで選択されています。このオプションは、アプリケーションをポーリングすることでスレッド状態を定期的に更新します。

  5. 「実行」をクリックします。

「実行」をクリックすると、ターゲット・アプリケーションが起動してプロファイリング・タスクが開始します。「プロファイラ」ウィンドウで「遠隔測定」ボタンまたは「スレッド」ボタンをクリックして、結果を表示します。

デフォルトでは、アプリケーション・スレッド・アクティビティはモニターされません。「スレッド」タブを開き、「スレッド」ボタンをクリックすると、プロファイリング・セッション中にいつでもスレッド・アクティビティのモニタリングを開始できます。

アプリケーション起動からスレッドをモニターする場合は、プロファイリング・セッションを開始する前に「スレッドのモニターを有効化」を選択します。

10.2.16 プロファイリング・ポイントの設定方法

プロファイリング・ポイントはソース・コード内のマーカーであり、特定のプロファイリング・アクションを起動できます。コードにプロファイリング・ポイントを設定するには、ソース・エディタのポップアップ・メニューを使用するか、「プロファイリング・ポイント」ウィンドウのツールバーを使用します。

次のタイプのプロファイリング・ポイントを設定できます。

  • 結果のリセット

  • ストップウォッチ

  • スナップショットの取得

  • 時間によるスナップショットの取得

  • トリガーによるスナップショットの取得

注意: 「時間によるスナップショットの取得」および「トリガーによるスナップショットの取得」のアイコンは、コード・エディタには表示されません。これらのアイコンは「プロファイリング・ポイント」ウィンドウにのみ表示されます。

プロファイリング・ポイントを使用して、プロファイリング結果のリセット、スナップショットの取得、またはコード・フラグメントのタイムスタンプまたは実行時間の記録を行うことができます。

プロファイリング・ポイントは、一度設定されると、削除されるまでプロジェクトに含まれます。

プロファイリング・ポイントを設定する手順は次のとおりです。

  1. プロファイリング・ポイントを追加するクラスを特定して、ソース・エディタでそのクラスを開きます。

  2. ソース・エディタで、プロファイリング・ポイントを追加する行の左余白を右クリックします。

  3. プロファイリング・ポイントの追加を選択して、「新規プロファイリング・ポイント」ウィザードを開きます。

  4. プロファイリング・ポイント・タイプとプロジェクトを選択します。

  5. 「次へ」をクリックします。

  6. 必要に応じて、プロファイリング・ポイントのプロパティをカスタマイズします。

  7. 「終了」をクリックします。

プロファイリング・ポイントのタイプを表すアイコンが、プロファイリング・ポイントを挿入したソース・エディタに表示されます。

プロファイリング・ポイントを有効または無効にするには、ソース・エディタで、プロファイリング・ポイントが含まれている行の左余白を右クリックして、<プロファイリング・ポイント名>「有効化」または「無効化」を選択します。

アクティブなプロファイリング・ポイントを表示する手順は次のとおりです。

  1. アプリケーションを開きます。

  2. メイン・メニューから、「実行」「プロファイル」を選択します。

  3. プロファイリング・タスク(CPUまたはメモリー)を選択します。

  4. 「アクティブなプロファイリング・ポイントを表示」を選択します。

また、「ウィンドウ」「プロファイリング」「プロファイリング・ポイント」を選択することもできます。

10.2.17 リモート・アプリケーションへのアタッチ方法

プロファイリング・ツールをアプリケーションにアタッチすることにより、Webサーバーなどのリモート・システムで実行しているアプリケーションのプロファイリングを実行できます。このモードを使用すると、プロファイラがアタッチされた後でリモート・アプリケーションが起動します。このモードを使用すると、ターゲットJVMの起動に関するプロファイリング・データを取得できます。

プロファイリング・ツールをアタッチするには、「アタッチ・ウィザード」を使用してプロジェクトのアタッチメント設定を指定します。「アタッチ・ウィザード」で、アプリケーションのタイプとリモート位置を指定します。「アタッチ・ウィザード」は、指定された詳細に基づいてリモート・システムの構成方法に関する手順を示し、プロファイリングをサポートします。

リモート・システムにアタッチするには、リモート・システムにRemote Profiler Packをインストールして、そのパック上でリモート・システムを起動する必要があります。「アタッチ・ウィザード」を使用してリモート・システムの詳細を指定し、そのシステム用にRemote Profiler Packを生成してください。詳細は、第10.2.18項「Profiler Remote Packの生成方法」を参照してください。

手順に従ってリモート・システムを構成した後、リモート位置にプロファイラをアタッチできます。アタッチ・モードは1回構成するだけで十分です。アタッチメント設定はプロジェクトに関連付けられています。いつでも「アタッチ・ウィザード」を実行して、アタッチメント設定を変更できます。

リモート・アプリケーションのプロファイリング手順は次のとおりです。

  1. アプリケーションを開きます。

  2. メイン・メニューから、「実行」「プロファイラのアタッチ」を選択します。

  3. 「プロファイラ」ダイアログで、「定義...」をクリックしてアタッチメント設定を構成します。

  4. 「アタッチ方法」で「リモート」を選択します。

  5. 「アタッチ・ウィザード」を完了すると、ターゲット・アプリケーションに従ってアタッチメント設定が指定されます。

  6. 「終了」をクリックして、「アタッチ・ウィザード」を終了します。

  7. ターゲットの場所を構成し、「アタッチ・ウィザード」の最終ページの手順に従ってリモート・アプリケーションを起動します。生成済のProfiler Remote Packがまだインストールされていない場合は、リモート・システムにそれをインストールする必要があります。

    リモート・アプリケーションを起動すると、アプリケーションはIDEがアタッチされるまで待機してから起動します。

  8. 「プロファイラ」ページで、プロファイリング・タスクと任意のプロファイリング・オプションを選択します。

  9. 「アタッチ」をクリックします。

「アタッチ」をクリックすると、JDeveloperがリモートJVMにアタッチして、アプリケーションが起動します。ローカル・アプリケーションの場合と同様に、プロファイリング・データを表示できます。

IDEがリモート・アプリケーションにアタッチされた後で、次の操作を実行できます。

  • リモート・アプリケーションからデタッチする

    リモート・アプリケーションからデタッチすると、リモート・アプリケーションは停止しませんが、リモート・アプリケーションに関するプロファイリング・データの受信が停止します。リモート・アプリケーションにアタッチするには、「アタッチ・ウィザード」の起動オプションを使用してリモート・アプリケーションを再起動する必要があります。

  • プロファイリング・セッションを変更する

    プロファイリング・セッションの変更は、リモート・アプリケーションからデタッチしなくても実行できます。たとえば、プロファイリング・タスクをプロファイリングのオーバーヘッド削減のためのモニタリングに変更した後で、タスクを再度変更することができます。この方法では、リモート・アプリケーションを再アタッチして再起動する必要がありません。

10.2.18 Profiler Remote Packの生成方法

プロファイリング・ツールをリモート・システムにアタッチするには、リモート・システムにRemote Profiler Packをインストールする必要があります。Remote Profiler Packは、プロファイリング・ツールをリモート・システムにアタッチできるライブラリのアーカイブです。

Remote Profiler Packを生成する手順は次のとおりです。

  1. アプリケーションを開きます。

  2. メイン・メニューから、「実行」「プロファイラのアタッチ」を選択します。

  3. 「プロファイラのアタッチ」ダイアログの下部で、「定義...」をクリックします。

  4. 「アタッチ方法」で「リモート」を選択します。

  5. 「ホスト名」および「オペレーティング・システム」を指定します。

  6. アタッチ手順を読み、Remote Profiling Packの作成をクリックします。

「リモート・パックを生成」をクリックすると、Profiler Remote Packの保存場所を指定するように要求されます。IDEでパックが生成された後、「アタッチ・ウィザード」の手順に従ってパックをインストールし、そのパック上でリモート・システムを起動する必要があります。

10.2.19 ローカル・アプリケーションへのアタッチ方法

アプリケーションをIDEの外側で起動したい、または起動する必要がある場合は、アタッチ・モードを使用してローカル・アプリケーションのプロファイリングを実行できます。たとえば、次のような場合にアタッチ・モードを使用できます。

  • アプリケーションをコマンドラインから開始する必要がある、または複雑な起動スクリプトを使用している。

  • アプリケーションまたはターゲットJVMの起動時にプロファイリング・データを取得する必要がある。

  • アプリケーションを再起動せずにアプリケーションをプロファイルする必要があります(動的アタッチ・モード、JDK 1.6が必要)。

ローカル・アプリケーションにアタッチするには、「アタッチ・ウィザード」を使用して、まずアタッチメント設定を構成する必要があります。これらの設定は、プロファイリング中のプロジェクトに関連付けられています。プロジェクト用のアタッチ設定の構成は1回だけですみますが、設定の変更はいつでも「アタッチ・ウィザード」を再実行して行えます。

ローカル・アプリケーションにアタッチするための設定を構成する際、次のアタッチメント・モードから選択できます。

  • 「直接」: このモードを使用すると、ローカル・アプリケーションの起動に関するプロファイリング・データを取得できます。

  • 動的(JDK 1.6以上が必要): このモードを使用すると、アプリケーションを停止せずにアプリケーションからのデタッチとアプリケーションへの再アタッチを実行できます。

ローカル・アプリケーションにリモートにアタッチする手順は次のとおりです。

  1. アプリケーションを開きます。

  2. メイン・メニューから、「実行」「プロファイラのアタッチ」を選択します。

  3. 「アタッチ先」リストで、プロジェクトがある場合は、そのプロジェクトを選択します。

  4. 「プロファイラのアタッチ」ダイアログの下部で、「定義...」をクリックします。

  5. 「アタッチ設定」ウィザードで、「ローカル」アタッチ・モードを選択します。

  6. 「アタッチ・ウィザード」を完了すると、ターゲット・アプリケーションに従ってアタッチメント設定が指定されます。

  7. 「OK」をクリックして、「アタッチ設定」ウィザードを終了します。

  8. ターゲットの場所を構成し、「アタッチ・ウィザード」の手順に従ってローカル・アプリケーションを起動します。生成済のProfiler Remote Packがまだインストールされていない場合は、ローカル・システムにそれをインストールする必要があります。詳細は、第10.2.18項「Profiler Remote Packの生成方法」を参照してください。

    ローカル・アプリケーションを起動すると、アプリケーションはIDEがアタッチされるまで待機してから起動します。

  9. プロファイリング・タスクと任意のプロファイリング・オプションを選択します。

  10. 「アタッチ」をクリックします。

IDEがローカル・アプリケーションにリモートにアタッチされた後で、次の操作を実行できます。

  • リモート・ローカル・アプリケーションからデタッチする

    リモート・ローカル・アプリケーションからデタッチすると、アプリケーションは停止しませんが、アプリケーションに関するプロファイリング・データの受信が停止します。リモート・アプリケーションにアタッチするには、「アタッチ・ウィザード」の起動オプションを使用してリモート・アプリケーションを再起動する必要があります。

  • プロファイリング・セッションを変更する

    プロファイリング・セッションの変更は、リモート・アプリケーションからデタッチしなくても実行できます。たとえば、プロファイリング・タスクをプロファイリングのオーバーヘッド削減のためのモニタリングに変更した後で、タスクを再度変更することができます。この方法では、リモート・アプリケーションを再アタッチして再起動する必要がありません。

10.2.20 スレッド・アクティビティの表示方法

プロファイリング・セッション中に、「スレッド」ウィンドウでアプリケーションのスレッド・アクティビティに関する詳細情報を表示できます。

「スレッド」タブを開き、「スレッド」ボタンをクリックすると、プロファイリング・セッション中にいつでもスレッド・アクティビティのモニターを開始できます。デフォルトでは、アプリケーション・スレッド・アクティビティは呼び出されるまでモニターされません。

「スレッド」ウィンドウを開くには:

  • メイン・メニューから、「ウィンドウ」「プロファイリング」「スレッド」を選択します。

    アプリケーション起動からスレッドをモニターする場合は、プロファイリング・セッション開始時に「スレッドのモニターを有効化」を選択します。この詳細設定は「プロファイル」ダイアログにあります。

10.2.21 遠隔測定結果の表示方法

「VM遠隔測定」ウィンドウでは、スレッド・アクティビティおよび、VMでのメモリー・ヒープとガベージ・コレクションに関する高水準のデータを表示できます。「VM遠隔測定」ウィンドウは通常は、メイン・エディタ・ウィンドウに表示されます。

「VM遠隔測定要」ウィンドウを開くには、プロファイリング・セッション中に次のいずれか1つを実行します。

  • メイン・メニューから、「ウィンドウ」「プロファイリング」「VM遠隔測定」を選択します。

  • 「プロファイラ」タブで、「VM遠隔測定」をクリックします(メイン・メニューから、「ウィンドウ」「プロファイリング」「プロファイラ」をクリック)。

VM遠隔測定の結果が次のタブに表示されます。

  • 「メモリー(ヒープ)」: このタブには、ヒープの合計サイズと使用済サイズが表示されます。

  • 「メモリー(GC)」: このタブには、ガベージ・コレクションにかかった相対的な時間と存続世代数が表示されます。

  • 「スレッド/ロードされたクラス」: このタブには、プロファイル済アプリケーションJVMにおけるスレッド合計数が表示されます。

それぞれのタブでは、グラフの上にカーソルを合わせてツールチップを呼び出すと、詳細データを表示できます。

10.2.22 スナップショットの取得方法

スナップショットでは、特定の時点のプロファイリング・データが取り込まれます。スナップショットに取り込まれるデータは、スナップショットの撮影時に進行中のプロファイリング・セッションのタイプによって異なります。スナップショットを検索するには、「スナップショット」ウィンドウのツールバーを使用して表示された結果をフィルタ処理します。また、結果を右クリックして、ポップアップ・メニューで追加のコマンドを選択することもできます。

スナップショットは、次の点でプロファイリングのライブ結果とは異なります。

  • スナップショットは、プロファイリング・セッションが実行中でなくても確認できます。

  • スナップショットには、ライブ結果よりも詳細なプロファイリング・データの記録が含まれます。

  • スナップショットは容易に比較できます。

プロファイリング・セッションの進行中のみ、スナップショットを取得できます。スナップショットを手動で取得するか、プロファイリング・ポイントを設定してアプリケーション内の正確なポイントでスナップショットを自動的に取得できます。プロファイリング・ポイントを使用してスナップショットを取得する際、スナップショットを取得するソース・コード内のポイントを特定します。たとえば、スレッドが特定のメソッドに入ったときに、スナップショットを取得する必要が生じることがあります。

取得したスナップショットは、メイン・エディタ・ウィンドウで開きます。そのスナップショットは、あとでプロジェクトに保存できます。

スナップショットを手動で取得する手順は次のとおりです。

  1. プロファイリング・セッションを開始します(詳細は、第10.2.3「プロファイリング・セッションの開始方法」を参照のこと)。

  2. メイン・メニューから、「ウィンドウ」「プロファイリング」「プロファイラ」をクリックします。

  3. 「スナップショットの取得」をクリックします。

プロファイリング・ポイントを使用してスナップショットを取得する手順は次のとおりです。

  1. プロファイリング・ポイントを配置するコード行が含まれているソース・ファイルを開きます。

  2. プロファイリング・ポイントを配置するコード行の横の左余白を右クリックして、「プロファイリング・ポイントの追加」を選択します。

  3. 「新規プロファイリング・ポイント」ウィザードでスナップショット・オプションの1つを選択して、「次へ」をクリックします。

  4. ウィザードの「プロパティのカスタマイズ」ページで、任意のプロファイリング・ポイントのプロパティを変更します。

  5. 「終了」をクリックします。

スナップショットは、プロジェクトに保存することも、ローカル・ファイル・システムの場所に保存することもできます。スナップショットをプロジェクトに保存すると、そのスナップショットが「プロファイラ」ウィンドウ内の「保存スナップショット」に表示されます。スナップショットを保存するには、スナップショット・ツールバーのプロジェクトに保存ボタンをクリックします。あるいは、「ツール」「設定」「プロファイラ」ウィンドウを使用して、スナップショット取得時の動作を構成できます。

10.3 JUnitによるユニット・テス

JUnitは、Java対応のリグレッション・テスト用オープン・ソース・フレームワークです。JUnitを使用して、Javaコードを検証するテストを記述および実行します。

テスト・フィクスチャ、テスト・ケースおよびテスト・スイートを作成するには、JDeveloperのJUnitウィザードを使用します。一般的なプロジェクト用のテスト・コンポーネントを作成するウィザードに加えて、ビジネス・コンポーネント・プロジェクトの専用ウィザードが提供されています。

JUnitは、JDeveloperにインストールおよび統合できるオプション機能です。

10.3.1 JUnitのインストール方法

JUnitは、JDeveloperとともに配布されないオプション機能です。これを使用する場合は、ダウンロードおよびインストールする必要があります。


注意:

JUnitは、IBMのパブリック・ライセンス契約に基づいて提供されています。JUnitをダウンロードする前に、ライセンス契約を受け入れる必要があります。

JDeveloperにJUnitをインストールする手順は、次のとおりです。

  1. 「ヘルプ」→「更新の確認」に移動して、Oracle Technology Network (OTN)からJUnitをダウンロードします。

  2. JDeveloperを終了し、再起動します。

    JUnitがインストールされます。アンインストールする場合は、拡張機能マネージャを使用します。

10.3.2 Javaプロジェクトに対するJUnitテストの作成

JUnitテスト・アプリケーションは、次のコンポーネントで構成されます。

  • 1つ以上のテスト・ケース。テスト対象のメソッドを呼び出し、予測される結果についてのアサーションを作成します。デフォルトで生成されるテスト・ケース・クラスは「Test」という名前ですが、ユーザーが任意の有効なJava名を指定できます。

  • テスト・フィクスチャ。テストが実行される状態を提供します。任意のクラスをテスト・フィクスチャとして使用できますが、JDeveloperには専用のテスト・フィクスチャ・クラスを作成するウィザードも用意されています。デフォルトで生成されるテスト・フィクスチャ・クラスは「Fixture」という名前ですが、ユーザーが任意の有効なJava名を指定できます。

  • テスト・スイート。テスト・ケースを呼び出します。デフォルトのテスト・スイート・クラスは、「AllTests」という名前です。

  • ランナー。テスト・スイートを呼び出し、テスト結果を相関付けて表示します。

10.3.3 JUnitカスタム・テスト・フィクスチャの作成方法

テスト・フィクスチャとは、既知の値を持つオブジェクトのセットで、テスト・ケースにデータを提供します。任意のクラスをテスト・フィクスチャとして使用できますが、JDeveloperにはカスタムのテスト・フィクスチャ・クラスや様々な専用のテスト・フィクスチャを作成できるウィザードも用意されています。


注意:

UnitTestFixtureはpublicクラスです。そのインスタンスを作成した場合、生成されたコードにエラーは生じません。

AppModuleAMFixtureはprivateクラスです。そのインスタンスを作成した場合、生成されたコードにはエラーが生じます。


JUnitのカスタムのテスト・フィクスチャ・クラスを作成するには、次のようにします。

  1. 「アプリケーション」ウィンドウで、プロジェクトを選択します。

  2. 「ファイル」「新規」「ギャラリから」を選択します。

  3. 「カテゴリ」ツリーで「一般」を開き、「ユニット・テスト」を選択します。

  4. 「項目」リストで、「テスト・フィクスチャ」をダブルクリックします。

  5. ウィザードを完了するとテスト・フィクスチャ・クラスが作成されます。

    ウィザードによって作成されたクラスが、編集用に開かれます。

  6. 必要に応じてファイルを変更します。

    特に、テスト・フィクスチャ・オブジェクトを初期化するコードをsetUp()メソッドに追加します。取得したリソースをすべてリリースするコードをtearDown()メソッドに追加します。

10.3.4 JunitのJDBCテスト・フィクスチャの作成方法

テスト・フィクスチャとは、既知の値を持つオブジェクトのセットで、テスト・ケースにデータを提供します。JDBCテスト・フィクスチャは、使用するテスト・ケースにデータベース接続を確立するコードを提供します。

JUnitのJDBCテスト・フィクスチャ・クラスを作成するには、次のようにします。

  1. 「アプリケーション」ウィンドウで、プロジェクトを選択します。

  2. 「ファイル」「新規」「ギャラリから」を選択します。

  3. 「カテゴリ」ツリーで「一般」を開き、「ユニット・テスト」(JUnit)を選択します。

  4. 「項目」リストで、「テスト・フィクスチャ」をダブルクリックします。

  5. ダイアログを完了するとテスト・フィクスチャ・クラスが作成されます。

    作成されたクラスが、編集用に開かれます。

  6. 必要に応じてファイルを変更します。具体的には、テスト・フィクスチャ・オブジェクトを初期化するコードをsetUp()メソッドに追加し、取得されたリソースを解放するコードをtearDown()メソッドに追加します。

10.3.5 JUnitテスト・ケースの作成

テスト・ケース・クラスには、JUnitのアサーションを呼び出してテストを実行する1つ以上のメソッドがあります。例10-1に、JUnit 3.xでの典型的なテスト・ケースを示します。この例では、テスト対象のメソッドにテスト・フィクスチャ・データを渡してから、その結果を既知の値と比較し、予測どおりかどうかを確認しています。

例10-1 JUnit 3.xのテスト・ケース

public void testCountChars()
{
      int expected = 4;
      int actual = fixture1.countChars('a');
      assertEquals(expected, actual);
}

例10-2 JUnit 4のテスト・ケース

@Test
public void testCountChars()
{
      int expected = 4;
      int actual = fixture1.countChars('a');
      Assert.assertEquals(expected, actual);
}

例10-2に示したテスト・ケースでは、countChars()がテスト対象であり、テストの結果をassertEquals()でチェックしています。これは、JUnit Assertクラスで定義されているアサーション・メソッドの一種です。テスト・フィクスチャfixture1の状態はsetUp()メソッドで確立され、このメソッドは例10-3で示すようにテスト・ケースの呼出しより前に呼び出されていました。

例10-3 setUp()メソッド

protected void setup() throws Exception
{
fixture1 = new StringFixture("Goin' to Kansas City, Kansas City, here I come.");
}

JUnitテスト・ケース・クラスを作成するには、次のようにします。

  1. 「アプリケーション」ウィンドウで、プロジェクト、またはテストする必要のある特定のクラスを選択します。

  2. 「ファイル」「新規」「ギャラリから」を選択します。

  3. 「カテゴリ」ツリーで「一般」を開き、「ユニット・テスト」を選択します。

  4. 「項目」リストで、「テスト・ケース」をダブルクリックします。

  5. 「テスト・ケースの作成」ダイアログの「テストするクラスの選択」ページで、「テスト中のクラス」に入力するか、「参照」をクリックします。

  6. 「クラス・ブラウザ」ダイアログで、テストするクラスを確認します。または、「クラス名を一致」フィールドに最初の文字を入力します。「一致するクラス」リストは識別しやすいようにフィルタ処理されます。

    クラスを選択し、「OK」をクリックして、ダイアログを閉じます。「次へ」をクリックします。

  7. テストする個別のメソッドを選択し、「次へ」をクリックします。

  8. 「テスト・ケース・クラスの設定」ダイアログで、テスト・ケース、パッケージ、その拡張対象のクラスの名前を入力し、JUnitでスタブが作成される組込み機能のリストを選択します。「次へ」をクリックします。

  9. 「テスト・フィクスチャの選択」ページで、テスト・ケースに追加するテスト・フィクスチャを選択するか、「参照」をクリックします。

  10. テスト・ケースに追加するテスト・フィクスチャがすべてリスト中で選択されていることを確認し、「終了」をクリックします。

    ウィザードによって作成されたクラスが、編集用に開かれます。

EJBアプリケーション専用のテスト・ケースを作成できます。詳細は、第28.12.3項「JUnitを使用したEJBユニットのテスト方法」を参照してください。

10.3.6 JUnitテスト・ケースにテストを追加する方法

メソッドに対するユニット・テストを、既存のJUnitテスト・ケース・クラスに追加できます。

JUnitテスト・ケース・クラスにテストを追加するには、次のようにします。

  1. コード・エディタで、新しいユニット・テストを作成するメソッドを選択します。

  2. メイン・メニューから「ソース」「新規メソッドのテスト」を選択します。

  3. 「既存のTestCaseクラスに追加」を選択します。

  4. 「クラス名」ドロップダウン・ボックスから、または「参照」を使用して、新しいテストを追加するテスト・ケース・クラスを選択します。

  5. 新しいテストをテスト・ケースに追加するには、「OK」をクリックします。

10.3.7 JUnitテスト・スイートの作成

テスト・スイートは、テスト・ケースを呼び出すクラスです。

「JUnitテスト・スイート」ウィザードには、main()メソッドと、TestRunnerクラスへのコールを挿入するオプションがあります。「JUnit TestRunner」ログ・ウィンドウが開き、テスト結果が表示されます。別のテスト・ランナーを使用する場合には、メソッドを編集します。

例10-4に示したJUnit 3.xテスト・スイートでは、suite()メソッドによってTestSuiteインスタンスが作成され、それにテスト・ケースが追加されます。テスト・ケースを追加または削除する場合には、このメソッドを編集します。

例10-4 JUnit 3.xのテスト・スイート

public class AllTests {
    public static Test suite() {
    TestSuite suite;
    suite = new TestSuite("project1.AllTests");
    return suite;    }        

例10-5に示したJUnit 4テスト・スイートでは、テスト・ケース・クラスは@Suiteおよび@RunWithの注釈を付けて記述されています。

例10-5 JUnit 4のテスト・スイート

@RunWith(Suite.class)
@Suite.SuiteClasses( {})
public class AllTests1 {
    public static void main(String[] args) {
    String[] args2 = { AllTests1.class.getName() };
    org.junit.runner.JUnitCore.main(args2);
    }
}

JUnitテスト・スイート・クラスを作成するには、次のようにします。

JUnitテスト・ケースを作成する前に、テストされるプロジェクトの作成を完了している必要があります。

  1. 「アプリケーション」ウィンドウで、プロジェクトを選択します。

  2. 「ファイル」「新規」「ギャラリから」を選択します。

  3. 「カテゴリ」ツリーで「一般」を開き、「ユニット・テスト」(JUnit)を選択します。

  4. 「項目」リストで、「テスト・スイート」をダブルクリックします。

  5. ウィザードを完了するとテスト・スイート・クラスが作成されます。ウィザードによって作成されたクラスが、編集用に表示されます。

  6. 必要に応じてファイルを変更します。特に次の点が重要です。

    • suite()メソッドでテスト・ケースを追加します。

    • main()メソッドで、必要に応じてランナーの呼出しを置き換えます。

10.3.8ビジネス・コンポーネント・テスト・スイートの作成方法

作成されるテキスト・フィクスチャは、接続数を減らすシングルトン・クラスです。テスト・ケースごとに接続または切断する場合は、JUnit 4の注釈、@Beforeおよび@Afterを使用してテスト・ケースをカスタマイズします。

JUnit BC4Jテスト・スイート・ウィザードでは、アプリケーション・モジュールの各ビュー・オブジェクトに対してテストが生成されます。アプリケーション・モジュールがメソッドをエクスポートしていない場合、ウィザードによって、アプリケーション・モジュールそのもののテストも生成されます。生成されるビュー・オブジェクト・クラスの形式はview_objectVOTest.javaであり、形式がpackage.view.viewobjectVOのパッケージに収められます。この場合のpackageはアプリケーション・モジュール・パッケージです。生成されるアプリケーション・モジュール・テストの形式はapplication_moduleAMTest.javaであり、形式がpackage.applicationModuleのパッケージに配置されます。生成されるテスト・フィクスチャ・クラスの形式はapplicationmoduleAMFixture.javaであり、アプリケーション・モジュール・テストと同じパッケージに配置されます。

生成されるすべてのテスト・スイート・クラスの形式はAllapplicationmoduleTest.javaであり、アプリケーション・モジュールのパッケージ名と同じ名前でパッケージに配置されます。

各アプリケーション・モジュールまたはビュー・オブジェクト・テストについてテスト・ケースのXMLファイルも生成されます。このXMLファイルには、アプリケーション・モジュールまたはビュー・オブジェクト・テスト・ケースで定義されているテスト・メソッドが含まれます。重複が多くなりすぎる可能性があるため、ベース・クラス(ある場合)のテスト・メソッドは含まれません。

ビジネス・コンポーネント・テスト・スイートを作成するには:

  1. メイン・メニューから、「ファイル」を選択し、「新規」を選択します。

    ビジネス・コンポーネント・テスト用に別のプロジェクトを作成します。

  2. 「新規ギャラリ」で、「一般」を展開し、「プロジェクト」「Javaプロジェクト」の順に選択して、「OK」をクリックします。

  3. Javaプロジェクトの作成ウィザードの「プロジェクト名」ページで、テスト・プロジェクトの名前とディレクトリ・パスを入力し、「次へ」をクリックします。

  4. プロジェクトのJava設定ページで、パッケージ名、プロジェクトのJavaソース・コードのディレクトリ、および出力クラス・ファイルが配置される出力ディレクトリを入力し、「終了」をクリックします。

  5. 「アプリケーション」ウィンドウで、テストするアプリケーション・モジュールをダブルクリックします。

  6. 概要エディタで、「Java」ナビゲーション・タブをクリックします。

  7. 「Java」ページで、「Javaクラス」セクションの「編集」アイコンをクリックします。

  8. 「Javaオプションの選択」ダイアログで「アプリケーション・モジュール・クラスの生成」を選択して、「OK」をクリックします。

  9. 概要エディタの「Java」ページで、クラス・インタフェース・セクションの「編集」アイコンをクリックします。

  10. 「クライアント・インタフェースの編集」ダイアログで、テストするメソッドを「選択済」ペインに移動して、「OK」をクリックします。

  11. 「アプリケーション」ウィンドウで、作成したテスト・プロジェクトを右クリックして、「新規」を選択します。

  12. 「新規ギャラリ」で、「一般」を展開し、「ユニット・テスト」「ビジネス・コンポーネントのテスト・スイート」の順に選択して、「OK」をクリックします。

  13. JUnit BC4Jテスト・スイート・ウィザードの「テストの構成」ページで次の値を選択し、「次へ」をクリックします。

    • ビジネス・コンポーネント・プロジェクト: テストするアプリケーション・モジュールを含むプロジェクトを選択します。

    • アプリケーション・モジュール: テストするアプリケーション・モジュールを選択します。

    • 構成: ローカル・アプリケーション・モジュールまたは共有アプリケーション・モジュールを選択します。

    • 「ベース・クラスのテスト」→「アプリケーション・モジュール拡張」: 様々なベース・クラスを指定できます。生成されるテスト・ケース・クラスはそのベース・クラスから拡張されます。このとき、ベース・クラスのすべてのpublic抽象メソッドの本体は単純なデフォルトの実装になります。

    • 「ベース・クラスのテスト」→「ビュー・オブジェクト拡張」: ビュー・オブジェクトが拡張するクラスを指定できます。生成されるテスト・ケース・クラスはそのベース・クラスから拡張されます。このとき、ベース・クラスのすべてのpublic抽象メソッドの本体は単純なデフォルトの実装になります。

  14. 「サマリー」ページで選択内容を確認して、「終了」をクリックします。

10.3.9 Business Componentsテスト・フィクスチャの作成方法

ビジネス・コンポーネントのテスト・スイートを作成すると、ビジネス・コンポーネントのテスト・フィクスチャも一緒に作成されます。また、ビジネス・コンポーネントのテスト・フィクスチャを個別に作成することもできます。

生成されるテスト・フィクスチャ・クラスの形式はapplicationmoduleAMFixture.javaであり、形式がpackage.applicationModuleのパッケージに配置されます。この場合のpackageはアプリケーション・モジュール・パッケージです。

ビジネス・コンポーネント・テスト・フィクスチャを作成するには:

  1. メイン・メニューで、「ファイル」「新規」「ギャラリから」を選択します。

    ビジネス・コンポーネント・テスト用に別のプロジェクトを作成します。

  2. 「新規ギャラリ」で、「一般」を開き、「プロジェクト」「Javaプロジェクト」を選択して、「OK」をクリックします。

  3. Javaプロジェクトの作成ダイアログの「プロジェクト名」ページで、テスト・プロジェクトの名前とディレクトリ・パスを入力し、「次へ」をクリックします。

  4. プロジェクトのJava設定ページで、パッケージ名、ソース・ディレクトリおよび出力ディレクトリを入力し、「終了」をクリックします。

  5. 「アプリケーション」ウィンドウで、テストするアプリケーション・モジュールをダブルクリックします。

  6. 概要エディタで「Java」ナビゲーション・タブをクリックし、「Javaクラス」セクションの「編集」アイコンをクリックします。

  7. 「Javaオプションの選択」ダイアログで「アプリケーション・モジュール・クラスの生成」を選択して、「OK」をクリックします。

  8. 概要エディタの「Java」ページで、クラス・インタフェース・セクションの「編集」アイコンをクリックします。

  9. 「クライアント・インタフェースの編集」ダイアログで、テストするメソッドを「選択済」ペインに移動して、「OK」をクリックします。

  10. 「アプリケーション」ウィンドウで、作成したテスト・プロジェクトを右クリックして、「新規」を選択します。

  11. 「新規ギャラリ」で、「一般」を展開し、「ユニット・テスト」「ビジネス・コンポーネントのテスト・フィクスチャ」の順に選択して、「OK」をクリックします。

  12. JUnit BC4Jテスト・フィクスチャ・ウィザードの「テストの構成」ページで次の値を選択し、「次へ」をクリックします。

    • ビジネス・コンポーネント・プロジェクト: テストするアプリケーション・モジュールを含むプロジェクトを選択します。

    • アプリケーション・モジュール: テストするアプリケーション・モジュールを選択します。

    • 構成: ローカル・アプリケーション・モジュールまたは共有アプリケーション・モジュールを選択します。

  13. 「サマリー」ページでテスト・フィクスチャ・クラスを確認して、「終了」をクリックします。

10.3.10 プロジェクトのすべてのテスト・ケースでテスト・スイートを更新する方法

プロジェクトのすべてのテスト・ケースでテスト・スイートを更新します。

テスト・スイートを更新するには、次のようにします。

  1. suite()メソッドを持つクラスで、コンテキスト・メニューから「ソース」「テスト・スイートのリフレッシュ」を選択します。

  2. テスト・ケースのリストにあるすべての項目がチェックされていることを確認してください。

  3. テスト・スイートを更新するには「OK」をクリックします。

10.3.11 JUnitテスト・スイートの実行方法

テスト・スイートが正常にコンパイルされたら、実行できます。

JUnitテスト・スイートを実行するには、次のようにします。

  1. 「アプリケーション」ウィンドウで、テスト・スイート・クラスを選択します。

  2. 右クリックして「実行」を選択します。

    テストが実行され、テスト・ランナーによって結果が表示されます。