Comments
Description
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