EMMA
EMMA 統合ノート
EMMA でカバレッジを収集する場合、次の手順が実行されます。
1\. 各コンパイルステップ (javac/javac2 を使用) の後、ビルドエージェントは EMMA を呼び出して、コンパイルされたクラスをインストルメントし、ソースファイルの場所を保存します。その結果、クラスメタデータを含む coverage.em ファイルがビルドチェックアウトディレクトリに作成されます。収集された Java ファイルのソースパスは、最終的な HTML レポートを生成するために使用されます。
2\. テスト実行。この段階では、実際の実行時カバレッジ情報が収集されます。このプロセスにより、coverage.ec ファイルが作成されます。テストタスクが複数ある場合は、データが coverage.ec に追加されます。
3\. レポート生成。ビルドが終了すると、TeamCity は HTML カバレッジレポートを生成し、レポートを含む coverage.zip ファイルを作成してサーバーにアップロードします。また、coverage.txt ファイルの概要レポートと元の coverage.e(c|m) ファイルを生成してアップロードし、IntelliJ IDEA の TeamCity プラグインからカバレッジを表示できるようにします。
EMMA でのカバレッジの構成
EMMA エンジンを使用してコードカバレッジを構成するには、次の手順を実行します。
ビルド構成を作成 / 編集している間、ビルドステップページに移動します。
Ant ビルドランナーを選択します。
コードカバレッジセクションで、ドロップダウンメニューのカバレッジツールとして EMMA を選択します。
カバレッジオプションを設定します。以下の利用可能なオプションの説明を参照してください。
オプション | 説明 |
|---|---|
カバレッジデータにソースファイルを含める | ソースファイルをコードカバレッジレポートに含めるには、このオプションをオンにします(Web でソースを表示できます)。 |
カバレッジ計測パラメーター | このフィールドを使用して、コードカバレッジレポートの作成に使用するフィルターを指定します。これらのフィルターは、インスツルメンテーションから除外されるクラスを定義します。フィルターの詳細な説明については、EMMA のドキュメント(英語)を参照してください。 |
トラブルシューティング
報道なし、メッセージがあります: EMMA: 出力は作成されません: メタデータが空です
すべてのクラス(カバレッジが評価される)がビルド中に再コンパイルされることを確認してください。通常、これにはビルドの開始時に「クリーン」タスクを追加する必要があります。
java.lang.NoClassDefFoundError: com/vladium/emma/rt/RT
このメッセージは、ビルドが実行時に EMMA インストルメント化されたクラスファイルをロードし、クラスパスに emma.jar ファイルが見つからない場合に表示されます。junit や testng などのテストタスクの場合、TeamCity は emma.jar をクラスパスに自動的に追加します。ただし、他のタスクの場合はそうではなく、ビルドスクリプトを変更するか、インストルメンテーションから一部のクラスを除外する必要がある場合があります。
ビルドが独自のコンパイル済みクラスを使用する java タスクを実行する場合、emma.jar を java タスクのクラスパスに追加するか、java タスクで使用されるクラスがインスツルメントされないようにする必要があります。また、fork=true 属性を使用して java タスクを実行する必要があります。
対応する emma.jar ファイルは buildAgent/plugins/coveragePlugin/lib/emma.jar から取得できます。典型的なビルドの場合、対応するインクルードパスは ../../plugins/coveragePlugin/lib/emma.jar になります。
クラスをコンパイルから除外するには、EMMA インストルメンテーションタスクの設定を使用します。TeamCity UI には、これらのパラメーターを EMMA に渡すフィールドがあり、「カバレッジ計測パラメーター」とラベル付けされています。一部のパッケージをインスツルメンテーションから除外するには、次の構文を使用します: -ix -com.foo.task.*,+com.foo.*,-*Test* パッケージ com.foo.task.* にはカスタムタスクのファイルが含まれます。
EMMA カバレッジ結果は不安定です
junit タスクに fork=true 属性があることを確認してください。推奨される属性の組み合わせは fork=true forkmode=once です。