継続的インテグレーションとは
継続的インテグレ―ション(CI)をご存知でしょうか。継続的インテグレーションとはエクストリーム・プログラミングのプラクティスのひとつで、ビルドやインスペクションを継続的に実行していくことを意味します。
本日は、Maven、Jtest、Jenkinsの各特徴をご紹介しながら、継続的インテグレーションをより効果的に運用できるような情報をお届けします。
Maven
Mavenとは、ビルドツールの一種です。いつ、どこで、誰がビルドしても同じ成果物を生成できることを目的としたツールになっており、以下の特徴を有しています。
- プロジェクトのディレクトリ構成が予め決まっている。
- 依存ライブラリはMavenリポジトリから自動的にダウンロードされる。
- 依存ライブラリを使用するタイミング(Maven用語ではフェーズ)を指定できる。
- JUnitによる単体テストの実行が可能である。
- 開発した成果物はMavenのリポジトリに公開可能である。
図1. EclipseのMavenプロジェクト
上記の特徴を持っているため、ソースコードを格納するディレクトリとMavenの設定ファイル(pom.xml)さえあれば、誰がどこでビルドしても失敗することはありません。
コンパイルや実行に必要な依存ライブラリは、Mavenが設定情報を元にインターネットから自動でダウンロードしてくれます。
また、Mavenには単体テストを実行できる枠組みも用意されています。JUnit単体テストケースをsrc/test/javaディレクトリに格納するだけで、Mavenがビルドの前に単体テストを自動実行します。デフォルトの動作では単体テストに失敗した場合ビルドは実行されません。これによりテストにパスしていない成果物の生成を防ぐことができます。ビルド時に意識することなく単体テストが実行されるため、回帰テストとしてもよく利用される機能です。
もちろん開発者はビルド時まで単体テストの実行を待つ必要はありません。mvn testコマンドを実行することで、単体テストを逐次実行することも可能です。
また、Mavenには単体テストを実行できる枠組みも用意されています。JUnit単体テストケースをsrc/test/javaディレクトリに格納するだけで、Mavenがビルドの前に単体テストを自動実行します。デフォルトの動作では単体テストに失敗した場合ビルドは実行されません。これによりテストにパスしていない成果物の生成を防ぐことができます。ビルド時に意識することなく単体テストが実行されるため、回帰テストとしてもよく利用される機能です。
もちろん開発者はビルド時まで単体テストの実行を待つ必要はありません。mvn testコマンドを実行することで、単体テストを逐次実行することも可能です。
Jtest
Parasoft JtestはJavaアプリケーションに対するテストをサポートするためのツールです。大きく分けて静的解析機能と動的解析機能があり、今回は静的解析機能をご紹介します。
静的解析機能には以下の種類があります。
静的回帰ツールとしてはOSSのFindBugsやCheckStyleが有名ですが、Jtestのフロー解析を利用するとOSSではチェックしきれないファイルまたがりのバグを検出できます。
フロー解析(バグ探偵)で検出できるバグの一例をご紹介します。
詳しくはOSSとの比較ページを参照ください。
機能名 | 概要 |
---|---|
パターンマッチング | 特定の記述をしていることで発生するバグを検出する。 |
フロー解析(バグ探偵) | 処理の流れを静的に追い、結果的に発生するバグを特定する。 |
メトリクス計測 | ソースコードの保守性や複雑度を数値として計測する。 |
フロー解析(バグ探偵)で検出できるバグの一例をご紹介します。
図2. Jtestによるフロー解析(バグ探偵)の例
詳しくはOSSとの比較ページを参照ください。
Jtest Mavenプラグイン
JtestにはMavenプラグインが提供されており、MavenからJtestを呼びだすことができます。
通常、JtestはEclipseプロジェクトでなければ解析できませんが、Mavenプラグインを利用することによりEclipseプロジェクトではないMavenプロジェクトに対しても解析がかけられます。 MavenからJtestを実行するにはmvn parasoft:jtestのようにゴールに「parasoft:jtest」を指定します。
図3. Jtest Maven プラグインの設定例(pom.xml)
通常、JtestはEclipseプロジェクトでなければ解析できませんが、Mavenプラグインを利用することによりEclipseプロジェクトではないMavenプロジェクトに対しても解析がかけられます。 MavenからJtestを実行するにはmvn parasoft:jtestのようにゴールに「parasoft:jtest」を指定します。
Jenkins
Jenkinsは言わずと知れた継続的インテグレーションツールです。以下の特徴を持っています。
ビルドの設定画面ではMavenの設定ファイルである、pom.xmlの場所と、ゴール(clean/compile/test/install等)を指定するだけです。
- 定期的なビルドを実行することが可能。
- Mavenとの親和性が高い。
- JUnitの結果やFindBugsの結果をJenkins上で参照することも可能。
- GitやSubversion等のバージョン管理ツールと連携可能。
- 成果物(jar/war/ear)の管理が可能。
図4. Jenkinsのビルド作成画面
ビルドの設定画面ではMavenの設定ファイルである、pom.xmlの場所と、ゴール(clean/compile/test/install等)を指定するだけです。
図5. Mavenのビルド方法指定
Maven+Jtest+Jenkinsの相乗効果
Maven、Jtest、Jenkinsの特徴を組み合わせることにより、様々な効果を得ることが可能になります。
開発環境に縛られない
IDEごとにばらばらだった静的解析の実行や単体テストの実行はMavenからの実行で統一されます。
これにより、EclipseやNetBeans、IntelliJなど開発者は自分にマッチしたIDEを自由に選択できます。
静的解析を実行するためにEclipseプロジェクトになおして、依存ライブラリを設定して・・・などという煩わしい作業は不要になります。依存ライブラリの解決はMavenに任せればよいのです。
ジョブの管理が容易
あらゆるタスクがMavenからの実行で可能になるため、Jenkins上のジョブは一つで済みます。いくつもジョブを作成してビルドパイプラインを作る必要はありません。
以下をひとつのジョブで実現可能になり、継続的なインテグレーションをより容易に実現できます。
以下をひとつのジョブで実現可能になり、継続的なインテグレーションをより容易に実現できます。
- ビルドの自動化
- 静的解析(パターンマッチング+フロー解析+メトリクス)とレポート生成の自動化
- 単体テストの自動化
- 成果物のデプロイ自動化
図6. JenkinsからMavenのビルドを実行した際のログ
開発初期から結合レベルのバグを検出
OSSの代わりにJtestのフロー解析を適用することで、コーディング工程では検出が難しいバグを検出可能になり、より効果的なインテグレーションを実施することが可能になるでしょう。検出した違反はMaven+Jtestによって${Mavenプロジェクト}/target/site/parasoftの配下にレポートとして自動出力されます。
図7. Jenkinsによって実行されたJtestのレポート
意識することなく回帰テストを実行可能
単体テスト工程になり、Mavenのテスト格納ディレクトリに単体テストファイルが蓄積されていくと、開発者が意識することなくJenkinsとMavenによって単体テストが実行されます。単体テストの結果は${Mavenプロジェクト}/target/surefire-reports/TEST-プロジェクト名.xmlで保存されるため、テスト結果をそのままIDEにインポートすることも可能です。
加えて、単体テストケースを蓄積しておくことで、ソースコードを変更した際の回帰テストとしての役目も担ってくれます。
成果物に対するテストの状況を確認
いつビルドした成果物なのかをJenkins上で管理することもできます。ビルドされた際のテスト状況も合わせて確認することができるため、リリース可能な成果物なのかを一目で確認可能です。
図8. Jenkins上での成果物と単体テスト結果の確認
最後に
今回はJtest9.5をベースにした継続的インテグレーションをご紹介しました。
Jtestの後継製品であるDTP for Javaでは、Mavenから単体テストを実行し、カバレッジを採取することも可能になる予定です。さらに便利になってインテグレーションの効果を上げるDTP for Java のリリースをお楽しみに!
Jtestの後継製品であるDTP for Javaでは、Mavenから単体テストを実行し、カバレッジを採取することも可能になる予定です。さらに便利になってインテグレーションの効果を上げるDTP for Java のリリースをお楽しみに!