この記事は Qiita Tech Festa 2026 の投稿記事かつ 負債化しないシェルスクリプト設計:GitHub Actionsでbatsの自動テスト・カバレッジの取得 の続編です。
はじめに
以前の記事で Bash のカバレッジ取得に kcov を使おうとしたものの、GitHub Actions の標準 Runner の Ubuntu 24.04 には apt で提供されていなかったので利用を諦めていた話を書きました。
が、実際にはそのうち使える状態になっていました。調査不足だったので訂正と共に実際に使って確認してみました。
背景
kcov は Ubuntu 24.04 では確かになかったのですが、次期LTS の Ubuntu 26.04 では復活していました。
また、GitHub Actions で Ubuntu 26.04 は Public Preview になっていました。
これを組み合わせれば GitHub Actions 上でも比較的容易に検証できるので試してみました。
前提・実行対象
Bash スクリプトのテストを bats でテストした結果を kcov でカバレッジを取るというケースを想定します。
.
├── .github
│ └── workflows
│ └── test.yml # kcov でテストカバレッジを取る
├── src
│ └── calculator.sh # カバレッジ取得対象
└── test
└── calculator.bats # bats によるテスト
Bash スクリプトは以下です。
#!/usr/bin/env bash
add() {
echo $(($1 + $2))
}
subtract() {
echo $(($1 - $2))
}
# 直接実行された場合の処理
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
if [[ "$1" == "add" ]]; then
add "$2" "$3"
elif [[ "$1" == "subtract" ]]; then
subtract "$2" "$3"
else
echo "Usage: $0 {add|subtract} a b"
exit 1
fi
fi
bats のスクリプトは以下です。
カバレッジが正しく取得できているか確認するために subtract を直接実行したパターンのテストを外してあります。
#!/usr/bin/env bats
setup() {
# スクリプトをロード
source ./src/calculator.sh
}
@test "関数 add が正しく計算できるか" {
run add 2 3
[ "$status" -eq 0 ]
[ "$output" = "5" ]
}
@test "関数 subtract が正しく計算できるか" {
run subtract 5 2
[ "$status" -eq 0 ]
[ "$output" = "3" ]
}
@test "スクリプト直接実行で add が動くか" {
run ./src/calculator.sh add 10 5
[ "$status" -eq 0 ]
[ "$output" = "15" ]
}
@test "無効な引数で Usage が出力されてエラーになるか" {
run ./src/calculator.sh invalid
[ "$status" -eq 1 ]
[[ "$output" == *"Usage:"* ]]
}
これを GitHub Actions で実行するためのワークフローは以下です。
name: Coverage with Ubuntu 26.04
on:
push:
branches: [ main ]
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
test:
runs-on: ubuntu-26.04 # Ubuntu 26.04 ランナーを指定
steps:
- name: Checkout code
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
persist-credentials: false
- name: Install bats and kcov
# Ubuntu 26.04 の apt には kcov が含まれているので、apt でインストール可能
run: |
sudo apt-get update
sudo apt-get install -y bats kcov
- name: Ensure target script is executable
run: chmod +x ./src/calculator.sh
- name: Run tests and collect coverage with kcov
run: |
mkdir -p coverage
# kcov で bats の実行結果のカバレッジを取得
# --include-path で src ディレクトリのみをカバレッジ対象とする
kcov --include-path=./src coverage/ bats ./test/
- name: Upload coverage report
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: kcov-coverage-report
path: coverage/
実行結果
GitHub Actions での実行結果サマリは以下です。
成功してカバレッジレポートの zip ファイルがアップロードされています。
これをダウンロードして確認したのが以下です。
calculator.bats であえてはずした subtract の直接呼出しだけが呼ばれていないことが確認できており、正しくカバレッジが取得できているようでした。
余談
ローカルのWSL2で kcov でレポートを作るのも10秒くらいかかったのですが、GitHub Actions 上だと 40秒くらいかかっていました。
今回のテストケースは少数なので、起動時オーバーヘッドが大きいのか、テストケースの分量で実行時間が増えるのかは分からないのですが、 kcov は ptrace を使って命令実行を判別しているはずなので、分量が増えると時間がかかるかもしれません。
おわりに
Ubuntu 24.04 では apt に含まれなくなっていたので GitHub Actions のカバレッジ取得への利用を一時見送っていた kcov ですが、現在は Ubuntu 26.04 で対応できるようになっていました。
エコシステムの対応状況は随時追っていかないと以前とは状況が変わっているのでキャッチアップを欠かさないように心がけて行こうと思います。

