RailsアプリのテストレポートとカバレッジをAzure Pipelines上で表示する

はじめに

以前、Azure Pipelines上でRailsアプリのテストを実行する方法を書きました。

miyohide.hatenablog.com

このエントリーでは、テストレポートとカバレッジをAzure Pipelines上で表示させる方法を記します。

テストレポートの表示方法

Azure Pipelines上でテストレポートを表示させると、下の画像のように失敗したテストに対してエラーメッセージやスタックトレースを表示させることができます。逐一ログメッセージを読み取る必要がなく分かりやすいです。

f:id:miyohide:20200711162052p:plain

Railsアプリの準備

Azure Pipelinesがサポートしているテストレポートの形式はpublish-test-results機能のドキュメントのようにさまざまなものがあります。

docs.microsoft.com

今回はJUnit形式にすることにしました。minitestではminitest-reporters gemというものがあり、これを利用するとtest/reports以下にTEST-*.xmlファイルが生成されます。

github.com

具体的にはGemfilegem 'minitest-reporters', require: falseを追加します。

group :test do
  gem 'simplecov', require: false
  gem 'minitest-reporters', require: false
end

その後、test/test_helper.rbに以下の設定を追加します。

require 'minitest/reporters'
Minitest::Reporters.use! Minitest::Reporters::JUnitReporter.new

Azure Pipelinesの設定

次にazure-pipelines.ymlに設定を追加します。上記で紹介したpublish-test-results機能を使います。簡単な設定はAzure Pipelines上で行えます。該当のpipelineの右端から「Edit」を選択します。

f:id:miyohide:20200711163507p:plain

その後、「test results」と検索領域に入力すると「Publish Test Results」が絞り込まれるのでそれをクリックします。

f:id:miyohide:20200711163632p:plain

各種設定の入力欄が現れるので、必要事項を入力して「Add」をクリックすると設定が挿入されます。

f:id:miyohide:20200711163947p:plain

最終的には以下のような設定となりました。

- task: PublishTestResults@2
  condition: succeededOrFailed()
  inputs:
    testResultsFormat: 'JUnit'
    testResultsFiles: 'test/reports/TEST-*.xml'

ポイントとしてcondition: succeededOrFailed()を追加することを挙げておきます。この設定をしておかないと、テストが失敗したときにテストレポートが出力されないので、あまり意味を成さないです。

カバレッジを表示する

Publish Code Coverage Results taskを使うと、カバレッジ情報を下図のようにきれいに表示可能です。どのファイルのカバレッジが低いか一目瞭然です。

f:id:miyohide:20200711164833p:plain

Railsアプリの準備

Publish Code Coverage Results taskがサポートしているカバレッジデータのフォーマットは以下のドキュメントが示すようにCoberturaやJaCoCoがあります。

docs.microsoft.com

今回はCobertura形式で出力する方法を記します。Rubyカバレッジ計測gemであるSimpleCovにてCobertura形式で出力させるにはsimplecov-cobertura gemを使います。

github.com

Gemfileには以下のような記述となります。

group :test do
  gem 'simplecov', require: false
  gem 'simplecov-cobertura', require: false
  gem 'minitest-reporters', require: false
end

test/test_helper.rbに以下の記述を追加します。

require 'simplecov-cobertura'
SimpleCov.formatter = SimpleCov::Formatter::CoberturaFormatter

Azure Pipelinesの設定

次にazure-pipelines.ymlに設定を追加します。具体的な設定方法はPublish Code Coverage Results taskのドキュメントや上記のテストレポートで記した方法を参考にしてください。

docs.microsoft.com

最終的には以下のような設定となりました。

- task: PublishCodeCoverageResults@1
  inputs:
    codeCoverageTool: 'Cobertura'
    summaryFileLocation: 'coverage/coverage.xml'

あとはAzure Pipelines上でテストを流せばカバレッジが上で示した画像のようにきれいに参照可能となります。