entry-header-eye-catch.html
entry-title-container.html

entry-header-author-info.html
Article by

GitLab の Merge Request でテストカバレッジを可視化した

はじめましての方ははじめまして。 Scala エンジニア Javakky です。

今回は、 Scala のテストカバレッジツールである scoverage の導入方法と、 GitLab を使った可視化について見ていきます。

scoverage とは

scoverage は Scala 向けのテストカバレッジ計測ツールです。

sbt 用のプラグインも用意されており、 coverage タスクによってカバレッジを計測することができます。

github.com github.com 弊チームでは GitLab の artifacts に成果物を設置することで GitLab Pages として閲覧できるようにしています。 docs.gitlab.com

GitLab Test coverage visualization

前項のようにテストカバレッジの取得と閲覧はできていたのですが、毎回確認をしに行くのは少々面倒でした。

そこで導入した Test coverage visualization は GitLab の Merge Request 上でテストカバレッジの結果を参照できる機能です。

docs.gitlab.com 下記のように artifacts/reports で cobertura.xml を指定するだけで、CI上で実行したカバレッジを結果を元に、 diff に結果を表示することができます。

scoverage:
  stage: test
  image: mozilla/sbt:8u292_1.5.7
  script: sbt coverage test coverageAggregate
  coverage: '/All done. Coverage was \[\d+\.\d+\%\]/'
  artifacts:
    paths:
      - target/scala-2.13/scoverage-report
    reports:
      coverage_report:
        coverage_format: cobertura
        path: target/scala-2.13/coverage-report/cobertura.xml

画像のように、カバレッジが通過していない行はオレンジのラインが、通過している行は緑色のラインが表示されます。 (サンプルプログラムはplay-samplesを利用)

手動実行タスクにする

カバレッジ取得がCIで走るのは便利なのですが、テスト並列化の恩恵が受けづらいなど、実行時間面での不便が少しありました。

そこで、以下のように gitlab-ci.yml に設定を行うことで、レビュー前など開発者が手動で実行した時のみカバレッジが実行されるようにしました。

scoverage:
  stage: test
  image: mozilla/sbt:8u292_1.5.7
  script: sbt coverage test coverageAggregate
# 中略
  rules:
    # スケジュールされたタスクとして呼び出された場合
    - if: '$CI_PIPELINE_SOURCE == "schedule" && $TASK_NAME == "scoverage"'
    # Merge Request の CI
    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
      # 手動で実行ボタンを押した場合のみ
      when: manual
      # 失敗しても次のステージの CI を実行できる
      allow_failure: true

終わりに

GitLab の Test code visualization は scoverage だけでなく、 JaCoCoPHPUnit など、 Cobertura の XML 形式を出力できるカバレッジツールに対応しています。

レビュー時のテスト項目確認などに非常に便利なので、皆さんもぜひ使ってみてください!

icon
javakky
決済周りの改善を中心に働いている2021年入社エンジニア。その名の通りJavaが好きなことで有名(?)で、最近はScalaを使える部署へ入ったらしい。