0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

(没ネタ) Bash の C0 カバレッジツールを自作しようとしてみた:第2回 課題整理編

0
Posted at

はじめに

当初とズレた想定になったので正直趣味の話になりました

この記事に書いた検証をしている間に以下の記事で書いたように Ubuntu 26.06 が GitHub Actions の Runner として(pre)リリースされ、 kcovapt パッケージに戻ってきたのでそちらを使うのが無難です。

前回の簡単なフック処理だけでは実用性がまだないので、本実装前に実用性を高めていくには何を解決していく必要があるかを一度整理します。

課題1:カバレッジの「分母(未実行行)」を特定する

カバレッジ(網羅率)を計算するには、「実行された行数(分子)」だけでなく 「実行可能な全行数(分母)」 を知る必要があります。
前回のPoCでは実行された行のカウントはできましたが、実行されていない行(未実行行) が含まれていませんでした。

Bashスクリプトの場合、コンパイラが存在しないため、ソースコードを自分でパース(解析)して実行可能な行を特定しなければなりません。

暫定的にはヒアドキュメントの計測が難しいですが、愚直にコメント行を取り除き、最終的に shfmt などのベースになっている mvdan などのツールを使って対応できないかと考えています。

課題2:カバレッジレポートの作成などに向けて既存のフォーマットの利用

カバレッジデータをただターミナルに出力するだけでは実用的ではありません。既存のCIツールや可視化ツールと連携するため、LCOVフォーマット(.info) を出力形式にして、既存のツールチェーンに載れるようにします。

LCOVフォーマットの基本構造は以下です。

sample.info
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 使える状態に変わったので本実装途中までしかしていないのですが、機会があれば一区切りつくまで実装して記事にしたいと考えています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?