🙆

CircleCIで分割して実行したJestのカバレッジをSonarCloudで集約する

2 min read

前提

  • Jestで自動テストをしている
  • CircleCIでテストを実行し、SonarCloudでカバレッジの集計をしている
  • CircleCIで自動テストを並列実行を始めた

問題

SonarCloudで並列実行したときのカバレッジ結果をSonarCloudでまとめることができるか。

現状の私の結論

できる。

  • jestの設定でカバレッジレポートの出力を環境変数CIRCLE_NODE_INDEXを使って別のファイルになるようにする
  • テストの実行レポートは不要と判断。SonarQubeの設定のsonar.testExecutionReportPathsは指定しない。
  • カバレッジファイルの指定は出力を予定しているファイルすべてを指定する

Jestの設定例

coverageDirectoryを環境変数 CIRCLE_NODE_INDEX ごとに変更することで集約したとき上書きされるのを回避する。jest.config.jsの設定例

module.exports = {
  coverageDirectory: `coverage/node-${process.env.CIRCLE_NODE_INDEX}`,
}

SonarCloudの設定例

出力ディレクトリをわけた結果出力されるファイルを sonar.javascript.lcov.reportPathsにコンマ区切りで全て指定する。出力されないファイルがあっても問題ないので、必要になりうるものは設定しておく。

16並列を想定した場合のsonar-project.propertiesの設定例

sonar.javascript.lcov.reportPaths=coverage/lcov.info,coverage/node-0/lcov.info,coverage/node-1/lcov.info,coverage/node-2/lcov.info,coverage/node-3/lcov.info,coverage/node-4/lcov.info,coverage/node-5/lcov.info,coverage/node-6/lcov.info,coverage/node-7/lcov.info,coverage/node-8/lcov.info,coverage/node-9/lcov.info,coverage/node-10/lcov.info,coverage/node-11/lcov.info,coverage/node-11/lcov.info,coverage/node-12/lcov.info,coverage/node-13/lcov.info,coverage/node-14/lcov.info,coverage/node-15/lcov.info

この記事で記載してないこと

CircleCIの設定

もうちょっと詳しく

Jestに関する事情

  • SonarCloudでJavaScriptのカバレッジデータはlcov形式を使う
  • jestはlcov形式のカバレッジデータの出力をサポートしている
  • jest-sonar-reporterというnpmがありjestの設定を上書きしていい感じにしてくれるものがあるがすでにアーカイブされている
    • そもそもファイルの出力先を変えるのにpackage.jsonを使うためロジックをかくことができない
  • jest-sonarというのもある
    • 使えそうではあるが採用しなかった
    • カバレッジレポート以外にテストの実行結果のレポートも出力できる
    • 現時点では不要かつ出力しないことで実行時間が短縮できそうであったため、採用しなかった

SonarCloudに関する事情

その他雑談

この記事は業務中に得たノウハウを単純化したものである。