はじめましての方ははじめまして。 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 だけでなく、 JaCoCo や PHPUnit など、 Cobertura の XML 形式を出力できるカバレッジツールに対応しています。
レビュー時のテスト項目確認などに非常に便利なので、皆さんもぜひ使ってみてください!