この記事は Qiita Tech Festa 2026 の投稿記事かつ (没ネタ) Bash の C0 カバレッジツールを自作しようとしてみた:第1回 プロトタイプ作成編 の続きです。
はじめに
当初とズレた想定になったので正直趣味の話になりました
この記事に書いた検証をしている間に以下の記事で書いたように Ubuntu 26.06 が GitHub Actions の Runner として(pre)リリースされ、 kcov も apt パッケージに戻ってきたのでそちらを使うのが無難です。
前回の簡単なフック処理だけでは実用性がまだないので、本実装前に実用性を高めていくには何を解決していく必要があるかを一度整理します。
課題1:カバレッジの「分母(未実行行)」を特定する
カバレッジ(網羅率)を計算するには、「実行された行数(分子)」だけでなく 「実行可能な全行数(分母)」 を知る必要があります。
前回のPoCでは実行された行のカウントはできましたが、実行されていない行(未実行行) が含まれていませんでした。
Bashスクリプトの場合、コンパイラが存在しないため、ソースコードを自分でパース(解析)して実行可能な行を特定しなければなりません。
暫定的にはヒアドキュメントの計測が難しいですが、愚直にコメント行を取り除き、最終的に shfmt などのベースになっている mvdan などのツールを使って対応できないかと考えています。
課題2:カバレッジレポートの作成などに向けて既存のフォーマットの利用
カバレッジデータをただターミナルに出力するだけでは実用的ではありません。既存のCIツールや可視化ツールと連携するため、LCOVフォーマット(.info) を出力形式にして、既存のツールチェーンに載れるようにします。
LCOVフォーマットの基本構造は以下です。
SF:./sample.sh # ソースファイル (Source File)
DA:2,1 # 行番号2が1回実行された (Data Array)
DA:3,1 # 行番号3が1回実行された
DA:4,0 # 行番号4は実行されていない(0回)
end_of_record # レコード終了
これを生成するために、実行時に取得した配列データと、課題1で取得した「全実行可能行」のリストを突き合わせて .info ファイルを吐き出すBashスクリプトを書きます。
出力されたファイルを genhtml コマンドに渡すとカバレッジレポートが生成できる、という流れを想定しています。
課題3: bats の仕様との衝突
Bash のテストスイートとして bats-core/bats-core を使う想定でいます。
前回の記事で、bats が標準出力・標準エラー出力ファイルディスクリプタを使っている件は書いたのですが、実は PS4 も使っているので、セパレーターなどを衝突しないように選んでいく必要があります。
このあたりの既存フレームワークの詳細な仕様調査には LLM Agent が大いに役に立ちました。
まとめと次回予告
今回は本実装前に解決すべき課題を整理しました。ここまで書いたところで kcov 使える状態に変わったので本実装途中までしかしていないのですが、機会があれば一区切りつくまで実装して記事にしたいと考えています。