JUnit 実践入門 体系的に学ぶユニットテストの技法 第15章 継続的 テスト すばやいフィードバックを手に入れる

第15章 継続的テスト すばやいフィードバックを手に入れる

  • 開発においては、欠陥の修正による恩恵と、リスクのバランスを示している考慮する必要がある
  • テストを早い段階から繰り返し行うことで、リスクをカバーできる。

15.1 継続的テスト

ユニットテストを開発に導入するためには、効果を体感させることが重要であり、その方法として、継続的テストが有用である。

開発チームへのすばやいフィードバック

ユニットテストの恩恵は、「開発チームへのすばやいフィードバック」である。

早期からテストする

  • ユニットテストは、開発早期段階から実施可能。
  • ユニットテストは、内部実装を考慮したテストであるから、プロダクションコードの実装と同時に作成すると効率がよい。

自動的にテストする

ユニットテストは、実行を自動化できる。

繰り返しテストする

リグレッションの早期検知、修正が可能となるため、リグレッションが発生することを恐れ、コード修正が行えなくなる事態を回避できる。

継続的テストとは

  • 継続的テスト continuous testing とは、早い段階からテストを繰り返し実施するプラクティスのこと。
  • ソフトウェアの品質を直接的には高めないが、開発チームに、ソフトウェアリリースへの自信を与える。

継続的テストを行うための3つの要素

以下を現代ソフトウェア開発の三本柱という。

ユニットテスト

JUnitを利用してテストコードを書くことで、プログラムとして実行可能となる。

自動化

バージョン管理

  • テスト失敗時に差分を確認することで、原因を究明できる。
  • 原因を救命できない際に、ひとまず一つ前の正常バージョンに切り戻すことができる。

継続的テストの運用

  • バージョン管理システムに変更があったタイミングで、ユニットテストを含む自動化されたビルドプロセスが実行されるのが一般的。
  • テスト失敗をゼロにすることが大事なのではなく、発生した失敗を早期に検知・修正することが大事。

継続的テストとリファクタリング

継続的テストがリファクタリングを行うことを心理面で容易にし、結果としてきれいなソースコードをもたらす。

ユニットテストリファクタリング

積極的なリファクタリング

継続的テストが実施されている環境では、開発者は積極的にリファクタリングを行うことができる。

15.2 Maven によるビルドプロセスの自動化

Maven とは

  • Apache Foundation が提供する、Java 用のビルドツール。
    • Maven 以前は Antが主流だった。
    • Maven は Ant に欠けていた、パッケージ管理のシステムが提供されている。

Maven の準備

Eclipse から 管理することも可能であるが、基本的にはコマンドラインから実行するツールであるため、公式サイトからダウンロードしたアーカイブを適当なディレクトリに展開し、パスを通しておく。

Maven プロジェクトと POM

  • MavenEclipse 同様、ソースコードやリソースをプロジェクト単位で管理する。
  • Maven プロジェクトでは、ルートディレクトリに XML ファイルを配置し、プロジェクトの構成を定義する。
    • この定義ファイルのことは POM project object model と呼ばれ、通常 pom.xml というファイル名とする。
  • プロジェクト構成を定義した POM を追加すれば、どんなプロジェクトでも Maven を利用できる。
    • ただし Maven プロジェクトの標準的にディレクトリ構成に合わせておくのがベター。

Maven プロジェクトの作成

  • Eclipse から簡単に作成できる。
    • [新規] -> [プロジェクト] -> [Maven] -> [Maven プロジェクト] -> [次へ]
      • グループId groupId:
        複数のプロダクトをグループ化した識別子。Javaプログラムのパッケージに相当。
      • アーティファクトId artifactId:
        そのプロダクトの識別子(名前)となる。
      • バージョン version:
        そのプロダクトのバージョンを表し、一般的には、「メジャーバージョン.マイナーバージョン.リビジョン」と付与する。

Maven のプロジェクト構成

  • 標準では、プロダクションコードとテストコードを独立したソースフォルダに作成する。リソースファイルも独立したソースファイルに作成するため、4つのソースフォルダが作成される。
  • ビルド時の成果物は target 配下に出力されるため、ソースコード管理システム(Subversion, Git 等)利用時は、target フォルダを除外フォルダとすること。

依存ライブラリの管理

依存ライブラリを追加するには、そのライブラリのグループId、アーティファクトId、バージョンを POM に設定すれば良い。

Mavenリポジトリ

依存ライブラリの追加

ソースコードエンコーディング設定

Mavenプラグイン

プラグインは、大きく4つに大分される。 - コンパイルやテストといったコア機能に関連するもの - JAR や WAR の作成などパッケージングに関連するもの - テスト結果や Javadoc などのレポート作成に関連するもの - それ以外の拡張機能に関連するもの

プラグインの設定

Maven によるビルドの実行とフェーズプラグインの設定

テストをスキップする

Eclipse から実行する

プラグインとゴール

ゴールを実行する

Maven によるカテゴリ化リスト

Maven によるカバーレッジレポート

JaCoCo プラグインの導入

JaCoCo によるカバーレッジレポート

15.3 バージョン管理システムによる継続的テストの運用

バージョン管理システムとは

バージョン管理システムへのコミット

Subversion でのテストサイクル

Git や Mercurial でのテストサイクル

15.4 Jenkins による継続的インテグレーション

継続的インテグレーションとは

Jenkins とは

Jenkins の導入

Jenkins のジョブ

ジョブの作成

ジョブの設定

バージョン管理システムの設定

ビルドゴールのの設定

ジョブの実行

ビルドトリガーの設定

Jenkinsのリモートビルド機能

バージョン管理システムのフック機能

継続的インテグレーションの効果

テストの実行コスト低減

すばやいフィードバック

テスト結果の履歴