...

JaSST Microsoft Word用テンプレート

by user

on
Category: Documents
2

views

Report

Comments

Transcript

JaSST Microsoft Word用テンプレート
ソフトウェアテストシンポジウム 2006
JaSST’06: Japan Symposium on Software Testing 2006
J2EE アプリケーション開発におけるビルド/テスト自動化への
実践的アプローチ
北嵐 直樹‡
†日本アイ・ビー・エム(株) 〒105-0081 東京都中央区日本橋箱崎町 19-21
E-mail:
†[email protected]、
あらまし 開発フェーズにおける実践的なビルド/テストの自動化事例を紹介します。
キーワード テスト、自動化、OSS、ビルド
Empirical Approach of automated build and test
in J2EE application development
-for developing high quality software-
Naoki
Kitaarashi‡
†IBM Japan、 Ltd。 105-0088 Japan
E-mail: †[email protected]
Abstract This paper shows empirical methods for automated build and test in customer application development。
Keyword Testing、 Automated、 OSS、 Build
クトでの自動ビルド/テストの展開を通して得た、
1. は じ め に
J2EE ア プ リ ケ ー シ ョ ン 開 発 に お け る 実 践 的 な 自 動 化
Kent Beck に よ る XP の 提 唱 以 来 テ ス ト に 対 す る 開 発
のアプローチについて述べていきたい。
者の取り組み姿勢が変わってきている。テストはそれ
までのコーディングの後に義務のように実施しなけれ
2. 自 動 化 の 意 義
ばならない作業から、開発者が積極的に、また幾分か
は楽しみを持って取り組むべき作業になってきている
まず始めにシステム開発における自動化の意義に
の で は な い だ ろ う か 。 特 に プ ロ グ ラ ミ ン グ / UT に お
ついて確認しておきたい。自動化とは、単に自動化ツ
け る 作 業 の 効 率 化 / 品 質 向 上 へ の ア プ ロ ー チ は Java
ールを購入してテストを自動化することだけを指すわ
に お け る オ ー プ ン ソ ー ス・ソ フ ト ウ ェ ア( 以 降 OSS と
けではない。開発工程のうち何を自動化するのかを明
記述)の世界を中心に猛烈に広まってきている。
確に定義することは、最近のオープン系の開発では極
最 近 で は 、 OSS は 単 な る 商 用 製 品 の 代 理 で は な い 。
めて重要である。特に定型的な作業を適切に自動化す
世界中のユーザーが手軽かつ無償で利用できるという
ることは、省力化/品質の安定化/属人性の排除/標
特 徴 を 活 か し て 、OSS で し か 実 現 で き な い 様 々 な ツ ー
準化の推進/プロセスの確立といった多様なメリット
ル が 生 み 出 さ れ て き て い る 。JUnit や Ant は そ の 代 表 と
に繋がる。とくに、ビルド/デプロイ/メトリクスの
も言えるものだろう。開発時のビルド/テスト/デプ
測定は定型的な作業となるため、自動化の有力な候補
ロ イ の 自 動 化 も OSS 抜 き に は 語 れ な い 分 野 で あ り 、開
として挙げられる。容易に自動化が可能な作業を手作
発 者 は 複 数 の OSS を 組 み 合 わ せ る こ と で 、品 質 の 向 上
業で行うことは、作業の非効率化だけでなく、作業の
と作業の効率化を実現する自動化環境を容易に手に入
品質の面でも大きな問題を抱えていると言える。人間
れられるようになってきた。しかしながら、大規模な
は創造的な作業には向いているが、定型的な作業には
シ ス テ ム 開 発 の 現 場 で 、こ の OSS に よ る ビ ル ド / テ ス
向いていない。逆にコンピューターは定型的な作業に
ト/デプロイの自動化を実現する場合、選択可能な
向いていて、創造的な作業に向いていない。つまり、
OSS の 種 類 の 多 さ 、 実 践 的 な ガ イ ド の 不 足 、 テ ス ト ・
人手による作業とコンピューターを使った作業は補完
プロセスの未整備といった理由により、実現までのハ
関係にあると言える。
開発フェーズでの効果的な自動化タスクとして継
ードルは高い。
本論では、筆者が 1 年に渡る大規模お客様プロジェ
続 的 イ ン テ グ レ ー シ ョ ン [3]の 実 施 が 考 え ら れ る 。継 続
1
的 イ ン テ グ レ ー シ ョ ン と は 、Martin Fowler に よ り 提 唱
る も の が 多 い 。 こ の た め Ant ベ ー ス の 自 動 化 タ ス ク に
されたアプローチであり、開発期間を通じて常に開発
各 種 OSS を 容 易 に 組 み 込 む こ と が で き る 。
モジュールのインテグレーション、つまり、ソースコ
■ Maven
ードのビルド作業を行うことを指す。この継続的ビル
ドの実行環境では、ビルドは単体テストが完了しモジ
簡 単 に 言 え ば Maven は Ant の 代 わ り に 利 用 可 能 な ビ
ュール統合に移る段階から始まるのではなく、開発作
ルド/テスト/デプロイを自動化するツールである。
業期間を通じて常時ビルドが行われる。
Ant が 一 連 の 作 業 を 1 か ら XML と し て 記 述 す る の に 比
Martin Fowler に よ り 提 唱 さ れ た こ の ア プ ロ ー チ は 、
べ て 、 Maven で は ビ ル ド / テ ス ト / デ プ ロ イ の ス ク リ
予防的テストの考えをベースにしている。ビルド作業
プトが事前に準備されており、開発者はソースコード
では、全開発者のソースコードと依存するライブラリ
の場所とオプションを指定するだけで、簡単に作業の
を組み合わせてコンパイル作業を行う。ソース間でイ
自 動 化 を 図 る こ と が で き る 。 Ant を プ ロ グ ラ ミ ン グ 言
ンターフェースの不整合がある場合はコンパイルエラ
語 と す れ ば 、Maven は ERP の よ う な パ ッ ケ ー ジ ソ フ ト
ーが発生するため、ビルド作業を行うことはモジュー
と 考 え る と 、両 者 の 機 能 の 違 い が 分 か り や す い だ ろ う 。
ル全体のインターフェースの検証を行うことになる。
単 に 作 業 の 自 動 化 を 行 う た け で な く 、最 終 的 に Web の
つまり、継続的ビルドを実施することで、インターフ
レポートサイトを構築するように構成されていること
ェース間の整合性に関する不具合を、ソースを修正し
も Maven の 大 き な 特 徴 で あ る 。Maven で の 各 作 業 は プ
た直後に発見できるようになる。不具合は、それが生
ラグインという単位で構成されていて、各プラグイン
み出されてから発見されるまでの時間が短ければ短い
は HTML レ ポ ー ト を 生 成 す る よ う に 作 成 さ れ て い る 。
ほ ど 、少 な い コ ス ト で 修 正 す る こ と が で き る 。従 っ て 、
Maven 本 体 は 各 プ ラ グ イ ン が 生 成 し た 様 々 な レ ポ ー ト
継続的ビルドを実施することで、モジュール間の整合
を 1 つ の Web サ イ ト と し て ま と め る こ と が で き る た め 、
性に関する不具合を最小限のコストで修正することが
面 倒 な 設 定 を す る こ と な く 、JUnit に よ る テ ス ト 結 果 や
できるようになると言える。
カ バ レ ッ ジ 測 定 結 果 等 を 、 HTML レ ポ ー ト と し て 公 開
継続的にビルド作業を行うにはビルド作業の自動
可能だ。
化 が 不 可 欠 で あ り 、現 在 で は 各 種 の OSS を 組 み 合 わ せ
■ CruiseControl
ることで、リポジトリを監視し、コードに変更があっ
継 続 的 イ ン テ グ レ ー シ ョ ン の 提 唱 者 で あ る Martin
た場合に自動的にビルドが走る環境を準備することが
Fowler が 所 属 す る ThoughtWorks 社 よ り 、 無 償 で 提 供
できる。
されているビルドの自動化をサポートするツールであ
る 。 CruiseControl は サ ー バ ー 上 に 常 駐 す る プ ロ グ ラ ム
3. 各 種 OSS の 紹 介
Java ア プ リ ケ ー シ ョ ン の 開 発 に お い て 、各 種 タ ス ク
であり、指定されたリポジトリを常時監視して、ソー
の 自 動 化 の 実 現 に は ツ ー ル と し て の OSS の 存 在 が 必
スコードに変更があると自動的にビルド用のスクリプ
要不可欠である。ここでは 4 章でのプロジェクト事例
ト を 実 行 す る 。そ し て 、ビ ル ド の 結 果 を チ ェ ッ ク し て 、
の 紹 介 に 先 立 っ て 、利 用 し た OSS に つ い て 簡 単 に 説 明
e メ ー ル に よ る 通 知 を 行 っ た り 、 ビ ル ド 結 果 を Web サ
しておく。
イ ト 上 で 公 開 し た り す る 機 能 を 提 供 す る 。
CruiseControl 自 体 は ビ ル ド 機 能 を 提 供 せ ず 、 Ant ま た
は Maven を 呼 び 出 す こ と で ビ ル ド 作 業 を 実 施 す る 。
■ Ant
C に お け る make と 同 様 に 、java 開 発 で 各 種 タ ス ク の
CruiseControl を 使 用 す る こ と で 、 Ant や Maven で 作 成
自 動 化 に 使 用 さ れ る ツ ー ル が Ant で あ る 。Java 開 発 の
したビルド/テスト用のスクリプトをサーバー上で自
現場では既にデファクト・スタンダードな位置付けで
動実行し、その結果を容易に監視することができるよ
あ り 、 build.xml と 呼 ば れ る XML で 記 述 さ れ た 定 義 フ
うになる。
ァイルを実行することで開発に関連するあらゆるタス
■ CheckStyle
ク を 自 動 化 す る こ と が で き る 。 Ant で は コ ン パ イ ル 、
ファイルのコピー/削除といった個々の作業がタスク
CheckStyle は ル ー ル に 従 っ て Java の ソ ー ス コ ー ド に
として定義されており、これらのタスクを組み合わせ
対する静的インスペクションを行うツールである。
ることで一連の作業を定義していく。あらかじめ多く
Javadoc と API の 整 合 性 が 取 れ て い る か 、 変 数 名 が 標
の タ ス ク が 標 準 で 提 供 さ れ る だ け で な く 、Java プ ロ グ
準 に 従 っ て い る か 、 未 使 用 の 変 数 / import が 定 義 さ れ
ラムとして簡単にユーザー定義のタスクを追加できる
て い な い か 等 、 CheckStyle に 標 準 で 定 義 さ れ て い る
た め 、最 近 の OSS で は Ant タ ス ク を 標 準 で 提 供 し て い
様々なルールを取捨選択して、ソースコードをインス
2
ペクションできる。各ルールにはオプションを指定で
ラ ス 、 そ れ ら 全 て に 対 し て JUnit に よ る テ ス ト ケ ー ス
きるため、しきい値、名前の書式、チェック対象とい
の作成を義務づけている。開発対象のアプリケーショ
っ た 項 目 を 柔 軟 に カ ス タ マ イ ズ 可 能 だ 。 CheckStyle は
ンは基幹システム向けの基盤フレームワークであり、
Eclipse の プ ラ グ イ ン の 他 、 Ant、 Maven に も 対 応 し て
J2EE
いるため、作業の自動化も容易である。
Server6.0, DB2 v8.1, MQ v5 と い っ た 技 術 や 製 品 を 使 用
■ Cobertura
StrutsTestCase for JUnit, DbUnit, Cactus を 使 用 し て い
1.3 、 Struts1.1,
IBM
WebSphere
Application
す る 。 JUnit 系 テ ス ト フ レ ー ム ワ ー ク と し て は 、 JUnit,
Cobertura は オ ー プ ン ソ ー ス の カ バ レ ッ ジ・ツ ー ル と
る。特徴としては基盤系であるため画面系の処理が少
し て 有 名 な JCoverage の 後 継 と も 言 う べ き ツ ー ル で あ
な く 、 業 務 系 の ア プ リ ケ ー シ ョ ン と 比 べ て JUnit よ る
る 。 本 家 JCoverage GPL 版 の メ ン テ ナ ン ス が 止 ま っ て
単体テストに向いていることが挙げられる。
本プロジェクトでは、単体テストの完了基準として
し ま っ た こ と を 受 け て 、 JCoverage の ソ ー ス コ ー ド を
下記の 3 つの項目を定めている。
元 に 新 た に 開 始 さ れ た の が Cobertura プ ロ ジ ェ ク ト で
あ る 。 使 い 勝 手 や 機 能 は JCoverage と ほ ぼ 同 様 で あ る
た め 、 JCoverage に 慣 れ た ユ ー ザ ー な ら 違 和 感 な く 使
・ カ バ レ ッ ジ 基 準 の 達 成( DjUnit、Cobertura 使 用 )
用 で き る だ ろ う 。 既 知 の JCoverage の 不 具 合 が 修 正 さ
・
CheckStyle に よ る 静 的 コ ー ド イ ン ス ペ ク シ ョ ン
れ て い る こ と 、 McCabe の サ イ ク ロ マ チ ッ ク 複 雑 度 を
・
JUnit に よ る テ ス ト ケ ー ス の 作 成 と サ ー バ ー で
の自動実行の成功
算 出 す る 機 能 が 追 加 さ れ て い る こ と 等 が 、 JCoverage
との主な違いである。
上記の基準を確実に守らせるために、開発環境であ
るクライアント側とサーバー側で同じチェックを実施
4. 適 用 事 例
こ の 章 で は 、 筆 者 が 参 画 す る 大 規 模 J2EE ア プ リ ケ
することにした。具体的には、開発実施時は開発環境
ーション開発プロジェクトで稼働している自動ビルド
で あ る IBM Rational Software Architect( 以 降 、 RSA)
/テスト環境について説明する。
上でプラグインを実行することで、作成したテストケ
ー ス が 完 了 基 準 を 満 た し て い る こ と を 確 認 す る 。一 方 、
ビ ル ド ・ サ ー バ ー と し て は 1 台 の PC サ ー バ ー を 用
意している。プロジェクトの規模やサーバー上で実行
リポジトリにチェックインされたソースコードに対し
させるタスクにも依るが、サーバー機にはさほどスペ
ては、ビルド・サーバー上で定期的に自動タスクを実
ックは要求しない。本プロジェクトでも当初はノート
行させ、全てのソースコードが単体テスト完了基準を
ブックをサーバーとして使用していたが、スペック的
満たしていることを確認することとした。
RSA 上 で は 、静 的 コ ー ド イ ン ス ペ ク シ ョ ン の た め に
な問題は特になかった。
CheckStyle プ ラ グ イ ン を 、JUnit テ ス ト ケ ー ス 実 施 時 の
対 象 と な る ク ラ ス 数 は 2005 年 8 月 時 点 で 約 1000 ク
カ バ レ ッ ジ 測 定 の た め に DjUnit プ ラ グ イ ン を 使 用 し
図 1 自動ビルド/テスト環境
チェックイン
・
・
・
・
・
・
・
CruiseControl 2.3
Ant 1.6.2
Maven 1.02
Cobertura 1.6
CheckStyle 3.5
JUnit 3.5
FindBugs 0.9.1
ビルド・
/アウト
リポジトリ
サーバー
(CVS)
ビルド/テスト
チェックイン/アウト
結 果 の確 認
ビ ル ド の 成 功 ビルドの成
/失 敗
功 /失 敗
(e メール)
(e メール)
Rational Software
レポート
Architect
(Web)
ビルド管 理 者
開発者
3
(eclipse 3.0)
・ CheckStyle 3.5
・ DjUnit 0.7.2
・ 各 種 xUnit
リポジトリからのチェックアウト
Maven
/Ant
Ant
更新の度
ビ ル ド ( コ ン パ イ ル ,jar 作 成 )
Ant
更新の度
カバレッジレポート
Ant
2 回 /日
単 体 テ ス ト ( JUnit)
Ant
2 回 /日
監 視 し 、 コ ー ド に 変 更 が あ っ た 場 合 は Ant ビ ル ド フ ァ
コ ー ド イ ン ス ペ ク シ ョ ン
( CheckStyle)
Maven
2 回 /日
イ ル ま た は Maven プ ロ ジ ェ ク ト を 実 行 し て 、ビ ル ド /
CVS 変 更 ロ グ 一 覧 作 成
Ant
2 回 /日
テ ス ト を 実 行 す る 。 最 近 の OSS は eclipse の プ ラ グ イ
PMD( コ ー ド イ ン ス ペ ク シ ョ ン )
Maven
2 回 /日
ン と Ant/Maven ベ ー ス の タ ス ク の 両 方 を 提 供 し て い る
FindBugs( コ ー ド イ ン ス ペ ク シ ョ ン ) Maven
2 回 /日
ものが多いため、このクライアント側とサーバー側で
Javadoc 生 成
Ant
2 回 /日
同 じ チ ェ ッ ク を 行 う の に は OSS の 利 用 が 適 し て い る
ソ ー ス コ ー ド 公 開 (Xref)
Maven
2 回 /日
た 。 CheckStyle に 適 用 す る ル ー ル は 、 デ フ ォ ル ト で 提
タスク名
供 さ れ て い る Sun の 標 準 ル ー ル を 修 正 し 、必 要 最 低 限
なものだけを定義している。
サ ー バ ー 上 で は 、 CruiseControl を 使 用 す る こ と で 継
続的なビルド/テスト環境を実現させている。
CruiseControl は ソ ー ス コ ー ド ・ リ ポ ジ ト リ ( CVS) を
と言えるだろう。
実行間隔
表 1 実施したタスクの種類と頻度
本 プ ロ ジ ェ ク ト で の 自 動 実 行 環 境 は Maven と Ant を
組 み 合 わ せ た も の で あ る 。 当 初 、 Maven の み で 環 境 構
ザーには使いにくいと判断したため、レポートのトッ
築を試みたが、ソース/テストケース・リポジトリの
プページだけは独自に日本語化を行った。各タスクの
数、プラグイン実行の失敗、デプロイ用に準備してい
実 行 頻 度 は 、jar フ ァ イ ル の ビ ル ド の み リ ポ ジ ト リ で の
る Ant ス ク リ プ ト と の 共 有 等 の 理 由 に よ り 現 在 の Ant
更 新 の 度 と し 、JUnit に よ る 単 体 テ ス ト と 各 種 チ ェ ッ ク
と Maven を 併 用 す る 形 に 落 ち 着 い た 。Ant と Maven の
タスクの実施は 1 日 2 回としている。これは 1 回の実
使い分けの方針は次の通りである。
行にタスク全体で 1 時間半ほどかかるためである。
自動実行の結果は成功/失敗にかかわらず
CruiseControl の 機 能 を 使 用 し て HTML 形 式 の e メ ー ル
・ コ ン パ イ ル 用 に 準 備 し て い る Ant が あ る 場 合 は
・
・
それを使用(二重メンテの回避)
をビルド担当者に送るように設定している。自動実行
Maven の プ ラ グ イ ン が 正 常 に 動 作 し な い 場 合 や
は様々な原因で失敗する。一番多いのはモジュール変
サ ポ ー ト し て い な い 場 合 、 同 等 の Ant タ ス ク で
更によるコンパイルエラーだ。担当者がいちいちサー
代替
バーの実行結果をチェックしなければ実行に失敗した
Maven の プ ラ グ イ ン と オ プ シ ョ ン 設 定 だ け で は 、
ことが分からないと、対応が遅れがちである。自動実
機 能 的 に 満 た さ れ な い 場 合 、 Ant タ ス ク を 使 っ
行時のエラーは迅速に解決すべきであり、これを実現
てカスタマイズを行う
す る た め に は 、 PULL で は な く PUSH 形 式 で 実 行 結 果
をチェックできるようにしておくべきである。
Maven の プ ラ グ イ ン が 正 常 に 動 作 し な い ケ ー ス は 、
5. 効 果
一 部 あ り 、 対 象 ク ラ ス 数 が 多 い 場 合 に OutOfMemory
本章ではビルド/テストの自動化を実施したこと
が 発 生 す る と い う も の で あ る 。 ま た 、 Maven の プ ラ グ
による具体的な効果について述べていく。
インが提供するデフォルトのレポートをカスタマイズ
し た い 場 合 や 、 Maven の プ ラ グ イ ン が 提 供 し な い オ プ
まず継続的ビルドを実施することにより、リリース
シ ョ ン 設 定 を 行 い た い 場 合 は 、 Maven の プ ラ グ イ ン を
間際にビルドエラーが発生することを防止できるよう
独 自 に カ ス タ マ イ ズ す る の で は な く 、 Ant タ ス ク と し
になったことが挙げられる。あるソースコードへの変
て同様な機能(タスクの実行とレポートの作成)を作
更が他チームのソースにコンパイルエラーを引き起こ
り 込 ん だ 。表 1 に Maven お よ び Ant で 実 行 し て い る タ
す 、つ ま り イ ン タ ー フ ェ ー ス の 不 整 合 を 、CVS へ の チ
ス ク を 示 す 。自 動 実 行 さ せ て い る の は ビ ル ド 作 業 の 他 、
ェックイン後に即時に発見でき、それを修正できるた
JUnit に よ る 単 体 テ ス ト の 自 動 実 行 、 Cobertura を 使 っ
め、チーム間の依存関係のよる問題を最小限に抑える
た カ バ レ ッ ジ の 測 定 、 CheckStyle、 PMD、 FindBugs に
ことができた。
よ る 静 的 コ ー ド イ ン ス ペ ク シ ョ ン の 実 施 、 Javadoc の
ま た ト ー タ ル で 1000 を 超 え る ク ラ ス を 開 発 し て い
生 成 、CVS 変 更 ロ グ の 作 成 を 行 っ て い る 。こ れ ら の タ
るため、各開発者の環境にモジュールをソースコード
ス ク の 実 行 結 果 は 全 て HTML レ ポ ー ト 化 し 、Maven の
単位で配布するのは、煩雑かつ非効率である。継続的
レポートサイトとして、全開発者に公開している。
ビ ル ド に よ り 最 新 の jar フ ァ イ ル を 共 有 ラ イ ブ ラ リ に
Maven は 日 本 語 化 さ れ て い な い た め 、 デ フ ォ ル ト で は
チェックイン可能であったため、各開発者はクラスで
全て英語のサイトが公開される。これでは一般のユー
は な く jar を 自 分 の 開 発 環 境 に 取 り 込 む こ と で 開 発 作
4
業を実施できた。
な労力が必要なことも事実である。そこで折衷案とし
JUnit に よ る 自 動 テ ス ト の 実 施 は 、変 更 に よ る デ グ レ
て、ツールによるカバレッジ測定を基本として、重要
ードの防止、大小様々なリファクタリングの促進に繋
なクラスのみ人手によるレビューを実施する案が考え
がっている。これは、リグレッション・テストを実施
られる。ツールを使って行網羅レベルのカバレッジを
することで、ソースコードへの変更が既存の機能に影
測定することで、明らかなテスト漏れがないことを機
響を与えていないことを容易に検証可能であったため
械的に保証することが可能だ。残りは、ある程度フォ
である。通常、開発が進み、実装した機能の依存関係
ーカスを絞ってテストケースが足りているかどうかを
が複雑になるにつれて、変更には細心の注意が必要と
チェックすれば良く、少ないワークロードで必要な品
なるものである。実際、ささいな変更が思いもよらぬ
質を確保することができるだろう。人手による確認で
所で影響を及ぼしていることがあるものだ。加えて、
は、エラーが発生する確率が高い箇所や考慮漏れが出
プログラミングの品質を維持するためには、不具合の
やすい箇所についてテストケースが充足しているかを
修正だけでなく設計の変更を伴うリファクタリングの
チェックする。具体的には、境界値のテスト、異常系
実施も不可欠な作業と考える。今回の開発では、リグ
のテスト、マルチスレッドでの排他制御のテストなど
レッション・テストの自動化を実現できたからこそ、
が挙げられる。
ツールによるカバレッジテストを自動化すること
必要なリファクタリングを実施できたと言える。
ク ラ イ ア ン ト 側 開 発 環 境 で の 各 種 テ ス ト( UT、カ バ
で、テストケースの品質を少ないコストで検証できる
レッジ、コードインスペクション)の実施と同じテス
ことは、テストの自動化における分かりやすい効果と
トをサーバーで実施することで、各テストの実施を徹
言えるだろう。
底することができたことも特筆すべき効果の 1 つとし
て 挙 げ ら れ る 。 UT の 場 合 、 各 開 発 者 が き ち ん と 単 体
6. ま と め
テストを実施しているかを、どのように確認するかが
ビルド/テスト/デプロイ作業の自動化の実現は、
課題の 1 つとして挙げられる。リーダーによる目検で
アプリケーションの品質や作業効率の面で大きな効果
のチェックだと開発規模が膨らんだ場合は目が行き届
を生み出すものだが、これを 1 から構築することは少
かず、開発者のモラルまかせになってしまうケースが
なくないワークロードとスキルを要求される。利用で
多いものだ。今回の開発では単体テストの完了基準と
きるツールが多いことは開発者の選択肢を広げるとい
して定義した項目については、サーバー側での自動テ
う意味では良いのだが、逆に組合せの検証作業を繁雑
ストにパスすることを最終確認とした。これにより、
にしている。また実践レベルのガイドとなると、あま
管 理 者 側 で UT の 抜 け / 漏 れ を 確 実 に チ ェ ッ ク す る こ
り見あたらないため、現状では開発者自身が独力で自
と が で き 、ア プ リ ケ ー シ ョ ン の 品 質 の 維 持 に 役 立 っ た 。
動化環境を構築しなければならない。筆者も候補とな
最後にツールによるカバレッジ測定の効果につい
った様々なツールを試し、試行錯誤を重ねながら現在
て 触 れ て お く 。 カ バ レ ッ ジ 測 定 は 昔 か ら UT で 必 ず 実
の環境を作り上げた。長期のプロジェクトであればこ
施したいテストとして挙げられているものだが、ツー
そ、こうした作業に時間をかけることができたが、短
ルのサポートなしには実現が難しいテストの 1 つであ
期間のプロジェクトの場合そんな余裕はないだろう。
る 。カ バ レ ッ ジ 測 定 の レ ベ ル と し て は 、C0( 行 網 羅 )、
より多くのプロジェクトで自動化環境を実現する
C1( 分 岐 網 羅 )、 C2( パ ス 網 羅 ) が 挙 げ ら れ る が 、 ツ
ためには、もっと手間なく環境を構築できるようにす
ー ル が サ ポ ー ト す る の は 通 常 C0 も し く は 部 分 的 な
る必要がある。そのためには、使用するツールの推奨
C1 の み で あ る 。 カ バ レ ッ ジ が 100%で あ っ た と し て も
セットを決め、環境構築のための適切なガイドを提供
行網羅の場合は、全てのコードが実行されたことを示
することが求められる。また、最初は小さく初めて、
すに過ぎない。従って、例えツールを使ってカバレッ
それを徐々に大きくしていくといったアプローチが効
ジを測定してみても、そのソースが取り得る全ての条
果的と考える。具体的には、最初はビルド作業の自動
件の組合せをテストしたとは言えない。つまり、論理
化 だ け を 行 い 、そ れ か ら JUnit に よ る テ ス ト の 自 動 化 、
的なテストケースの網羅性までは、ツールでは測れな
Maven レ ポ ー ト サ イ ト の 構 築 を 実 現 し て い く の で あ る 。
いと言える。
Maven を 使 っ た レ ポ ー ト サ イ ト の 構 築 に 比 べ れ ば 、 ビ
筆者は、理想を言えば人手によるテストケースのレ
ルドの自動化は比較的容易に実現可能である。
ビューは必ず行うべき作業と考える。これは、上記に
挙げた通り、テストケースの論理的な網羅性は機械で
JUnit よ る 単 体 テ ス ト の 自 動 化 、CheckStyle に よ る 静
は測れないからである。しかしながら、現実的な話と
的コードインスペクション等のテスト作業の自動化は
して全てのテストケースを人手でテストするには膨大
管理者の努力だけでは効果的な運用はできない。開発
5
者を巻き込み、サーバーで発生したエラーは修正しな
で も 、 JUnit に よ る 自 動 テ ス ト の 実 施 率 は ま だ 全 体 の
ければならないという習慣を植え付けることが大事で
70%ほ ど で あ り 、 残 り の 30%に つ い て は 今 後 組 み 込 ん
ある。もし、サーバー上のテストに失敗しても、それ
でいく予定となっている。
をそのままで放置してしまう、つまりエラーが起こっ
ていることを常態化させてしまうと、開発者はサーバ
今後の展望としては、現在のビルド/テストの自動
ー上でのエラーを無視してしまうようになる。この常
化に加えて、サーバーへのデプロイ作業を自動化した
態になってしまうとサーバー上でのチェックは形だけ
いと考えている。本プロジェクトではアプリケーショ
のものになってしまう。後でまとめてエラーを修正す
ン・サ ー バ ー と し て IBM WebSphere Application Server
る案も考えられるが、ワークロードの確保が難しいた
( 以 降 WAS と 記 述 ) を 使 用 し て い る 。 WAS で は デ プ
め現実的ではないだろう。エラーがあっても修正しな
ロ イ の 自 動 化 の た め に 各 種 Ant タ ス ク や コ マ ン ド が 準
いのでは、せっかくサーバー上で自動テストを行って
備されているので、これらを組み合わせることで、現
も、その効果が半減してしまう
在、手作業で実施しているサーバーへのデプロイ作業
自動ビルド/テストを効果的に運用していくには、
のかなりの部分を自動化できると見込んでいる。
エラーはすぐに修正するという習慣を開発チーム全体
に持たせることが必要である。これを実現する手段と
本論では、筆者が現在実践している自動ビルド/テ
して次の 3 つの作業が考えられる。
スト環境の事例を紹介し、その効果と考慮点について
述べた。本論が、日々プロジェクトでの品質管理に携
・ サーバーでのテスト結果を全開発者に報知する
・
わっている開発者の参考となれば幸いである。
ビルドエラーの結果を関係者(チームリーダー
文
格のユーザー)に送る
・
献
[1] Rick D Craig、体 系 的 ソ フ ト ウ ェ ア テ ス ト 入 門 、日
経 BP 社 、 2004 年 10 月 .
[2] Mike Clark 、 Pragmatic Project Automation 、
Pragmatic Bookshelf、 2005.2.
[3] 継 続 的 イ ン テ グ レ ー シ ョ ン 、
http://www.martinfowler.com/articles/continuousInte
gration.html
サーバー上でのビルド/テストに失敗した場合
は、迅速に管理者から担当者に修正依頼を行う
始めのうちは、開発者は進んでサイトのチェックや
修正を行わないはずなので、管理者側が権限を持って
エラーの修正を依頼する。サーバー側でエラーが起こ
った場合はすぐに修正を行うという体制を継続してい
くと、開発者は自発的にサーバーでのエラーを修正す
るようになっていく。こうなると管理者側での手間を
かけずにビルド/テスト環境を効果的に運用していく
ことができるようになる。
自 動 化 の 中 で も っ と も 実 現 が 困 難 な の が 、JUnit に よ
る テ ス ト の 自 動 化 で あ る 。 全 て テ ス ト ケ ー ス を JUnit
で作成することは可能でも、ソースに対する変更の度
にテストケースを更新し続けること、テストケースを
サーバー上で自動実行させることには大きな労力が伴
い 、 実 現 ま で の 道 の り は 遠 い 。 特 に JUnit テ ス ト ケ ー
スをサーバー上でも実行できるように開発するために
は、ガイド/ユーティリティの準備と開発者に対する
教育が欠かせない。開発者にまかせて作成したテスト
ケースの場合、様々な理由によりサーバー上では自動
実行できないクラスが数多く含まれるものであるから
だ。
工数的/開発者のスキル的な理由で全てのクラス
に対して単体テストの自動化が難しければ、クラスに
優先順位を付けて重要なクラスのみを自動化対象にす
るといったアプローチも考えられる。本プロジェクト
6
Fly UP