GitHub ActionsとCOVERALLによるOSSカバレッジテストの可視化

2024/09/30に公開

GCC用のカバレッジテストツールであるGCOVにはHTMLレポートを出力する機能があります。この機能をGitHub Actionsから使用してCOVERALLSで可視化できるようにしました。

動機

GCOVはきれいなレポートを作ってくれますが、毎回ちょっとした手順を踏む必要があります。

  1. ビルド時に--coverageオプションを作る必要がある(コンフィギュレーション時に1回)
  2. テストプログラムを実行する必要がある(ビルド後に1回)
  3. カバレージ出力をHTMLに変更する一連のプログラムを実行する必要がある。

スクリプトを作ってVSCodeのタスクにでも登録すれば済む話ですが、正直言ってOSSの場合ビルドごとにチェックするものでもないのでタスクそのものを忘れかねません。

また、CMakeのビルドだとソースツリーの構成によってはビルドツリーのだいぶ深いところにレポートが作られるので、毎回見に行くのはちょっと億劫です。

そこでGitHub Actionsを使おうと考えたわけです。

Gcovr Action

GitHubのマーケットプレースには多数のアクションが登録されています。これらを使うと面倒なワークフローもあっさり実現でき(ることがあり)ます。

今回注目したのはGCovr Actionで、これを使うとGCOVの出力からレポートを簡単に作ることができます。どのくらい簡単かと言うと、リンク先のサンプルを自分のプロジェクトで使ったところあっさり動作しました。

name: test
on:
  push:
jobs:
  test-project:
    runs-on: ubuntu-22.04
    steps:
      - name: Checkout Project
        uses: actions/checkout@v4.2.0

      - name: Build Project
        uses: threeal/cmake-action@v2.0.0

      - name: Test Project
        uses: threeal/ctest-action@v1.1.0

      - name: Check Test Coverage
        uses: threeal/gcovr-action@v1.1.0

このままではGCOVの出力であるレポートを取り出せませんが、それでもCTestの結果によってWorkflowの動作結果をグリーン/レッドに表示できます。

さて、このサンプルに3行追加するだけで、COVERALLSにレポートを表示させることができます。

name: Coverage-Test
on:
  push:
jobs:
  test-project:
    runs-on: ubuntu-22.04
    steps:
      - name: Checkout Project
        uses: actions/checkout@v4.2.0

      - name: Build Project
        uses: threeal/cmake-action@v2.0.0

      - name: Test Project
        uses: threeal/ctest-action@v1.1.0

      - name: Check Test Coverage
        uses: threeal/gcovr-action@v1.1.0
        with:
          coveralls-send: true
          excludes:  build/* test/*

追加したのは最後の3行です。そして最後の1行は「レポートから除外する」ファイルを指定する補助情報ですので、実質2行追加しただけでレポートをCOVERALLに飛ばすことができます。

COVERALLS

COVERALLSによる表示については私の処理結果を例として挙げます。念のためスクリーンショットも示します。

alt text

COVERALLSとGitHubのアカウントを連携させると、ソースコードの行ごとにカバーされているか否かを色分けしてくれます。

alt text

このレポートを作ったリポジトリへのリンクも示しておきます。実験用のリポジトリですので、最新のコミットではなくcoverallsタグを参照するようにしてください。

COVERALLSサービスは随分前からあるようなのですが、存在が当たり前すぎるのか余り説明が見当たりませんでした。メモとして記事にした次第です。

Discussion