評 価 補 助 ツール 開 発 による コードカバレッジ 測 定 の 導 入 と 不 具 合 防 止 に 向 けた 取 り 組 み - 開 発 エンジニアによる 継 続 的 開 発 評 価 のための 仕 組 み 造 り- 株 式 会 社 ワークスアプリケーションズ COMPANY Web Service Group エキスパートエンジニア 大 畠 悠 介
AGENDA! 弊 社 でのQC 活 動 取 り 組 み 状 況! 魚 の 骨 分 析 図! 対 策 一 覧 表! カバレッジを 運 用 に 乗 せる 為 に 実 施 したこと! オープンソースをベースとしたツール 開 発! JavaScriptカバレッジ 計 測 ツール! 案 件 別 カバレッジ 結 果 出 力 ツール! 実 際 に 行 っている 運 用 手 順! 効 果 測 定 No.1
取 り 組 みの 背 景! パッケージ 製 品 の 開 発 を 重 ねていく 度 に 設 定 値 の 組 み 合 わせ 量 が 増 加 し テスト 量 が 増 加 し 続 けている! お 客 様 より 製 品 に 対 する 機 能 追 加 の 要 望 も 多 いため 短 いサイクルでの 製 品 リリースを 求 められる 状 況 は 変 わらない! 過 去 にテストケースやドキュメントの 整 備 などいくつかの 対 策 を 実 施 した 経 緯 は あるが 目 立 った 改 善 は 見 られなかった 出 荷 後 に 発 見 される 不 具 合 件 数 はリリースを 重 ねるごとに 増 加 傾 向 にあり QC 活 動 を 通 じて 開 発 評 価 の 仕 組 みを 改 善 することでプロダクトの 品 質 を 向 上 しようと 本 取 り 組 みはスタートした No.2
対 策 概 要 の 一 覧 No.3
カバレッジ 導 入 にあたっての 問 題 点! 主 要 プログラムの1つであるJavaScriptに 関 する コードカバレッジが サポート 対 象 ブラウザにて 測 定 できなかった! 10 年 以 上 続 いている 製 品 の 為 デッドコードが 存 在 する 箇 所 も 存 在 し カバレッジ100%を 達 成 することは 不 可 能 であった! カバレッジ 計 測 結 果 の 利 用 方 法 が 分 からない 開 発 者 や 評 価 者 が 大 勢 いた! 明 確 な 利 用 基 準 が 設 けられない 為 に 過 去 に1 度 失 敗 した 経 緯 がある No.4
Java Script Coverage No.5
IE/FirefoxでのJSカバレッジ 計 測 ツール Create!! No.6
JsCoverageの 仕 組 み var ctr = 0; document.body.onclick = function() { ctr = ctr + 1; if (ctr > 4) { alert(ctr); } else { alert(ctr); } } No.7
JsCoverageの 仕 組 み //BRT_BLOCK_BEGIN:1 var ctr = 0; document.body.onclick = function() { //BRT_BLOCK_BEGIN:2 ctr = ctr + 1; if (ctr > 4) { //BRT_BLOCK_BEGIN:3 alert(ctr); //BRT_BLOCK_END:3 } else { //BRT_BLOCK_BEGIN:4 alert(ctr); } //BRT_BLOCK_END:2 } //BRT_BLOCK_END:1 //BRT_BLOCK_END:4 No.8
JsCoverageの 仕 組 み //BRT_BLOCK_BEGIN:1 var ctr = 0; document.body.onclick = function() { //BRT_BLOCK_BEGIN:2 ctr = ctr + 1; if (ctr > 4) { //BRT_BLOCK_BEGIN:3 alert(ctr); //BRT_BLOCK_END:3 } else { //BRT_BLOCK_BEGIN:4 alert(ctr); } //BRT_BLOCK_END:2 } //BRT_BLOCK_END:1 //BRT_BLOCK_END:4 No.9
JsCoverageの 仕 組 み //BRT_BLOCK_BEGIN:1 var ctr = 0; document.body.onclick = function() { //BRT_BLOCK_BEGIN:2 ctr = ctr + 1; if (ctr > 4) { //BRT_BLOCK_BEGIN:3 alert(ctr); //BRT_BLOCK_END:3 } else { //BRT_BLOCK_BEGIN:4 alert(ctr); //BRT_BLOCK_END:4 } //BRT_BLOCK_END:2 }; //BRT_BLOCK_END:1 No.10
JsCoverageの 仕 組 み //BRT_BLOCK_BEGIN:1 window.scriptobjects['scoverage-a.js-0'].executedblock[1] = (window.scriptobjects['scoveragea.js-0'].executedblock[1]? window.scriptobjects['scoverage-a.js- 0'].executedBlock[1] + 1 : 1); var ctr = 0; document.body.onclick = function() { //BRT_BLOCK_BEGIN:2 window.scriptobjects['scoverage-a.js-0'].executedblock[2] = (window.scriptobjects['scoveragea.js-0'].executedblock[2]? window.scriptobjects['scoverage-a.js-0'].executedblock[2] + 1 : 1); ctr = ctr + 1; if (ctr > 4) { //BRT_BLOCK_BEGIN:3 window.scriptobjects['scoverage-a.js-0'].executedblock[3] = (window.scriptobjects['scoveragea.js-0'].executedblock[3]? window.scriptobjects['scoverage-a.js-0'].executedblock[3] + 1 : 1); alert(ctr); //BRT_BLOCK_END:3 } else { //BRT_BLOCK_BEGIN:4 window.scriptobjects['scoverage-a.js-0'].executedblock[4] = (window.scriptobjects['scoveragea.js-0'].executedblock[4]? window.scriptobjects['scoverage-a.js-0'].executedblock[4] + 1 : 1); alert(ctr); //BRT_BLOCK_END:4 } //BRT_BLOCK_END:2 }; //BRT_BLOCK_END:1 No.11
運 用 手 順 No.12
カバレッジ 運 用 に 関 するご 説 明 の 前 に 部 署 の 開 発 サイクル 開 発 評 価 の 完 了 基 準 はカバレッジが100% 通 っていること 品 質 保 証 部 門 はカバレッジ100%のテストケースを 閲 覧 できるため テスト 観 点 の 抜 けをチェック 可 能 No.13
課 課 カバレッジを 運 用 に 乗 せるまでの 課 題 課 題 1: カバレッジ 率 90% の 善 し 悪 しが 判 定 できない スモールスタートとして カバレッジ 対 象 ソースコードを 前 回 リリースからの 差 分 のみとし 100%を 完 了 基 準 にした 題 2: カバレッジ 測 定 方 法 が 分 からない ツールが 利 用 できる 環 境 をクラウド(Amazon EC2) 上 に 整 備 し 利 用 時 はインスタンスをコピーするだけの 状 態 とした 題 3: カバレッジ 測 定 が 面 倒 くさい 案 件 番 号 を 入 力 するだけで 担 当 分 のカバレッジ 未 通 過 行 一 覧 が EXCELで 閲 覧 可 能 なツールを 開 発 した No.14
前 回 リリースからの 差 分 のみって? カバレッジ 未 通 過 のカウント 方 法 を 変 更 し ソース 全 体 = カバレッジ 通 過 行 + 未 通 過 行 ソース 全 体 = 既 存 ソースコード + カバレッジ 通 過 行 + 未 通 過 行 と 考 えた SVN 等 にてソース 管 理 をしていると ソースの1 行 1 行 に 対 してリビジョンを 持 っ ている 為 特 定 ( 前 回 リリース 番 号 等 )のリビジョンより 前 の 行 は 通 過 行 としてカ ウント 可 能 にできる! No.15
未 通 過 行 一 覧 作 成 ツール 概 要 1.カバレッジを 測 定 する 2. 計 測 結 果 を 取 得 3.ソースと 突 合 する 4. 未 通 過 行 がエクセルに 出 力 される 5. 未 通 過 一 覧 を 利 用 して 再 テスト No.16
カバレッジ 計 測 全 体 図 1 Java 通 過 行 情 報 Js 通 過 行 情 報 2 担 当 分 のみ 未 通 過 行 一 覧 No.17
未 通 過 行 一 覧 の 使 い 方 No.18
環 境 準 備 No.19
JaCoCo(Java Code Coverage Library)! javaagentを 利 用 したon-the-fly 方 式! 起 動 引 数 に1 行 追 加 するだけ! -javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2] 例 ) WebSphereでは 管 理 コンソールから アプリケーションサーバ > (サーバー 名 ) > プロセス 定 義 > Java 仮 想 マシン の 汎 用 JVM 引 数 に 下 記 の 様 に 追 記 します -javaagent:f:\ibm\websphere\appserver\java\jre\lib\ext\jacocoagent.jar=destfile=f:\ibm \WebSphere\AppServer\profiles\AppSrv01\logs\cws\was.exec,includes=jp/co/worksap/* No.20
JsCoverage! JSファイルのInstrument(カバレッジデータ 埋 め 込 み) ディレクトリを 指 定 して bat/antで 実 行 するだけ! Webアプリケーションへの 配 置 WEB-INF/libにjs-coverage-tool.jarを 設 置 web.xmlに 数 行 追 記! カバレッジデータの 収 集 (レポート 出 力 ) ディレクトリを 指 定 して bat/antで 実 行 するだけ No.21
未 通 過 一 覧 作 成 ツール! 以 下 をINIファイルに 記 載 して 実 行! SVN 認 証 情 報 ソースのディレクトリ! カバレッジ 通 過 XMLのディレクトリ! 対 象 としたい 開 発 者 の 名 称 など! リビジョン 範 囲! 結 果 ファイル 中 身! チェックイン 時 のコメント! 修 正 リビジョン 番 号! クラス 名 称 行 番 号! 開 発 者 名 称! 行 の 内 容 No.22
効 果 測 定 No.23
効 果 測 定! 定 量 的 効 果 カバレッジ 対 策 にてフォーカスした 要 因 に 対 しての 不 具 合 件 数 が リリース 毎 の 不 具 合 数 比 較 にて 約 7 割 減 少 した! 定 性 的 効 果 開 発 時 にカバレッジ 測 定 を 意 識 したソースコードを 作 成 する 開 発 者 が 増 加 自 主 的 にカバレッジ 測 定 を 開 始 した 部 署 が 出 てきた 品 質 に 対 する 意 識 が 高 まったと 考 えることができる No.24
こんな 場 合 はぜひカバレッジを! 組 み 合 わせテストが 多 いので Pairwiseなどを 利 用 しているが 正 しく 利 用 できているかどうか 不 安 が 残 っている 協 力 会 社 等 のプロジェクト 関 係 者 が 多 いが 自 社 に 関 係 する 部 分 だけに 絞 ったカバレッジを 測 定 したい 特 定 期 間 ( 特 に 締 切 間 際 など)における コミュニケーションロス ( 修 正 内 容 把 握 不 足 )が 心 配 だ 開 発 者 が 勝 手 に 修 正 してしまった 部 分 を 検 知 したい No.25
今 後 の 展 望! カバレッジ 測 定 の 利 用 を 社 外 にも 広 めるため 今 回 開 発 した 測 定 ツールをオープンソースとして 公 開 します!! URL https://github.com/worksapplications ( 今 後 QC 活 動 にて 作 成 したツールは 上 記 にてどんどん 公 開 していきます!) No.26
ご 清 聴 ありがとうございました ご 質 問 ご 意 見 などは ohata_y@worksap.co.jp までお 願 い 致 します No.27