GASを使ってテスト管理のストレスから解放された話。
はじめに
この記事はCommune Advent Calendar 2024シリーズ1 24日目の記事です。
Commune株式会社でQAエンジニアをしています、KOYOです。
さて、QAエンジニアのみなさん、スプレッドシートでテストケースを管理していて、こんな悩みを感じたことはありませんか?
- テストケースのデータ量が増えると、手動で全体進捗更新やNG判定したテストケースの確認が負担になる
- バグの発生ケースを特定するのに、複数のシートを移動しなければならない
これらの課題を解決するために、Google Apps Script (GAS) を使って、スプレッドシート上にダッシュボードを作成しました。今回は、その手法を具体的に解説します。
なぜスプレッドシートを選んだのか?
「そもそも専用のテスト管理ツールを使えばいいのでは?」という意見もあるかもしれません。しかし、今回スプレッドシートを選んだ理由は以下の通りです:
- リリースまでの期間が短い:専用ツールの導入・設定に時間がかけられない
- コストを抑えたい:無料で利用可能なスプレッドシートで代替したい
- 学習コストが低い:エンジニア以外のメンバーでもすぐに使いこなせる
このような背景から、スプレッドシートを低コストかつスピード感を保ちながら運用する方法として選びました。
前提
作成したファイルは下記のようなシート構成です。
シート名 | 目的 |
---|---|
Dashboard | テスト進捗やバグケースの情報を集約 |
テストケースシート1 | テストケース記載 |
テストケースシート2 | テストケース記載 |
... | ... |
計算シート | GASで処理した結果を表示 |
情報整理
どんな情報があればテストケースやバグを管理できるのか整理してみました:
▼ ターゲット
- PdM: プロジェクト全体の進捗を把握したい
- エンジニア: 自分が対応すべきバグをすぐに見つけたい
- デザイナー: テスト中のステータスを確認したい
- QAエンジニア: テスト進捗やバグの修正状況を効率的に管理したい
▼ ターゲットが必要な情報
- バグがどこにあるのか
- バグと判断した理由
- テスト完了までの見通し
- 修正確認の進捗状況
▼ ターゲットが分かりやすい情報の形式
- 表やグラフを活用する
- 各ステータスが明確に示されている
- バグの理由が簡潔に記載されている
課題: 情報を探すストレス
では、その上でなぜスプレッドシートだけでは不十分なのでしょうか。
スプレッドシートを用いたテストケース管理は、学習コストが低く、すぐにはじめられるという利点があります。しかし、データ量が増えると困りごとも生まれてきます。
- どこに必要な情報があるのか分からない
- 複数のシートを移動して探す時間がかかる
- データを手動で更新するのが手間
そこで、欲しいデータ、特にどのケースでバグが発生したのか誰もが一目で確認できるとよい情報管理だと考えました。
解決策: ダッシュボードに情報集約化
ダッシュボードを3つの構成に分けて作成しました:
*進捗データ、テストケースはすべてダミーデータです。
1. 更新ボタン
ボタンを押すだけで、指定したGASの関数を実行します。ボタンの作成は簡単で、任意の図形を作成後、「スクリプトを割り当て」から関数を指定するだけです。
今回は実行したい関数が複数あるので、それらの関数をまとめて実行する関数を指定しました。
2. 進捗データ一覧
各テストケースシートのステータスをGASで集計し、「計算シート」に描画したデータをダッシュボードから参照して表示します。以下はサンプルコードです:
function collectAllData() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var calculationSheet = spreadsheet.getSheetByName('計算シート'); // 計算結果描画先
// 以下、各ステータスを初期化
var totalTestCases = 0; // 総ケース
var waitingForFix = 0; // 修正待ちバグ
// 以下、省略
// 対象テストケースリスト
var sheetNames = ['テストケースシート1', '...'];
sheetNames.forEach(function(sheetName){
var sheet = spreadsheet.getSheetByName(sheetName);
if(sheet) {
var lastRow = sheet.getLastRow();
var statusColumn = 1; // Statusの列を指定
var statuses = sheet.getRange(2, statusColumn, lastRow - 1).getValues(); // Status情報取得
// 各statusの数を計算
statuses.forEach(function(status) {
if(status[0] === '完了') {
completedTestCases++;
} else if (status[0] === '修正待ち') {
waitingForFix++;
}
// 以下、省略
});
}
});
// 指定セルに結果を描画
calculationSheet.getRange('C3').setValue(totalTestCases); // 総ケース
calculationSheet.getRange('C11').setValue(waitingForFix); // 修正待ちバグ
// 以下、省略
Logger.log("計算シートが更新されました");
}
3. バグケース一覧
バグ関連のテストケースをダッシュボード上に一覧表示します。これにより、シート移動せずに、どの画面でどんなバグが発生しているかを一目で確認できます。
また、テストの記載粒度にできるだけ差分が出ないようにGherkin法に則ってテストケースを書いています。フォーマットがあるおかげで僕がテストを書きやすいのはもちろんですが、弊社エンジニアも日頃からこのフォーマットでテストケースを書く機会が多いので、バグのテストケースを確認する際にもストレスフリーです。
以下はバグケース一覧を作成するためのサンプルコードです:
function listBugCases() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
// 対象テストケースリスト
var sheetNames = ['テストケースシート1', '...'];
var bugCases = [];
sheetNames.forEach(function(sheetName) {
var sheet = spreadsheet.getSheetByName(sheetName);
if (sheet) {
var lastRow = sheet.getLastRow();
var statusColumn = 1; // Statusの列を指定
var caseRange = sheet.getRange(2, 1, lastRow - 1, 14);
var cases = caseRange.getValues();
var statuses = sheet.getRange(2, statusColumn, lastRow - 1).getValues(); // Status情報取得
}
});
// Dashboardに結果を描画
var bugsheet = spreadsheet.getSheetByName('Dashboard');
var lastRow = bugsheet.getLastRow();
if (lastRow > 2) {
// 既存データをクリア
bugsheet.getRange(21, 2, lastRow - 2, bugsheet.getLastColumn()).clear();
}
if (bugCases.length > 0) {
bugsheet.getRange(21, 2, bugCases.length, bugCases[0].length).setValues(bugCases);
} else {
Logger.log("該当するバグケースがありません");
}
Logger.log("バグケース一覧が更新されました");
}
よかったこと
このシートを導入して最も良かったことは、
-
手動作業の大幅な削減
テストケースやバグ情報の集計・表示が自動化され、管理の手間が減少したので、他の重要な業務に集中できる時間が増えました。 -
情報共有がスムーズに
ダッシュボードに必要な情報を集約したことで、QAエンジニア以外のメンバー(PdM、エンジニア、デザイナー)も簡単に状況を把握できるようになり、チーム間のコミュニケーションが円滑になりました。 -
コストを抑えつつ短期間で運用可能
専用ツールを導入せず、既存のスプレッドシートと無料のGASを活用することで、費用対効果を最大化できました。
おわり
いかがだったでしょうか?
テストケースが多く管理コストが高い場合でも、GASを使用すれば簡単にダッシュボードに情報を集約できますし、QA以外の方にも状況をわかりやすく伝えることができます。
今後も社内ツールなどでGASを使用しながら効率化に励んでいきたいと思います。
ご一読いただきありがとうございましたm
Discussion