(1)はこちら、(2)はこちらから。
カバレッジ測定とCIとの連携
(3)では、Perlでカバレッジ(網羅率)を測定する方法と、測定結果とCIサービスの連携方法について説明します。
カバレッジとは
カバレッジとは、テスト対象のモジュールのコードが、テストによってどれだけ実行されたかを割合で表すものです。カバレッジが高いほど、多くの割合のコードがテストされていることを示します。
カバレッジにはどこまで厳密に測定するかによって複数の種類がありますが、本稿では命令網羅率(すべての実行可能命令が実行されればカバレッジが100%)のことをカバレッジと呼びます。
Devel::Coverによるローカル環境でのカバレッジの測定
次は、カバレッジの測定方法について説明します。
Devel::Coverとは
Devel::Coverを使うと、Perlでカバレッジを測定できます。Devel::Cover
はcpanm
コマンドでインストールできます。
Devel::Coverによるカバレッジの測定
Devel::Coverを使ってカバレッジを測定するには、prove
コマンドとcover
コマンドを使います。テスト対象モジュールのルートディレクトリへ移動し、次のコマンドを実行します[3]。
カバレッジを測定しながらテストを実行するため、通常のテストよりも数倍遅くなります。大規模なプロジェクトの場合、頻繁にカバレッジを測定するのは難しいかもしれません。
カバレッジの測定結果はHTML形式で出力されます。cover_db/coverage.html
をブラウザで開いてみましょう。図10のように、ファイルごとのカバレッジを確認できます。
Codecovによるカバレッジの可視化
カバレッジは測定するだけではあまり意味がありません。測定結果をもとに、重要な箇所にテストが不足している場合はテストを追加したり、カバレッジのカバー率に閾値を設定しPull Requestの採用基準にしたりしてこそ意味が出てきます。
カバレッジの測定結果を開発に活用していくには、カバレッジ可視化サービスを利用するのが便利です。カバレッジ可視化サービスを使うと、手もとの環境で毎回実行せずに自動でカバレッジが測定されます。
Codecovとは
Codecovでは、CIで計測したカバレッジをWebページで見られるようにするだけではなく、カバレッジの増減をもとにアラートを発したり、GitHubのPull Requestと統合したりすることができます。
Codecovへのカバレッジの送信
それでは、Codecovを使ってカバレッジを可視化してみましょう。Codecovを使うには、Devel::Cover
でカバレッジを測定し、Codecovへ結果を送信します。
本稿では、Travis CIを使ってテストを実行し、カバレッジを測定します。.travis.yml
に次のような記述を行います。
before_install
ステップでは、Devel::Cover
のレポータであるDevel::Cover::Report::Codecov
をインストールしています。Devel::Cover::Report::Codecov
にはDevel::Cover
への依存が定義されているため、そちらも自動でインストールされます。
script
ステップでテストの実行とカバレッジの測定を行い、after_success
ステップでカバレッジの測定結果を送信しています。after_success
ステップは、script
ステップのすべてが正常に終了した場合(終了ステータスが0の場合)のみ実行されます。テストが成功していない場合はカバレッジが正常に測定できていないため、カバレッジは送信されません。
カバレッジが正常に送信されると、Codecovのページでカバレッジを閲覧できます(図11)。
CodecovとGitHubの連携
CodecovにはGitHubとの連携機能があります。連携機能を利用すると、次のことを行えます。
- GitHub上でカバレッジの可視化
- Codecovへわざわざ遷移せずにカバレッジ測定結果を意識した開発を行える
- Pull Requestのカバレッジを自動で測定し、結果をコメントとして投稿
- カバレッジの増減をPull Requestからの画面だけで判断でき、テスト不足にすぐ気づける(図12)
連携機能は、ブラウザの拡張機能を利用して実装されています。Chrome、Firefox、Operaで利用できます。
まとめ
今回は、CIツールを使って高品質なPerlモジュールを開発する手法を紹介しました。本稿はOSS開発の場合でしたが、プロダクト開発などプライベートリポジトリの場合も、有償ですが同様の機能を利用できます。ぜひ、便利なサービスを積極的に使い、楽しく効率的に開発を進めていきましょう!
さて、次回の執筆者は松木雅幸さんで、テーマは「Minillaを使ったモダンなCPANモジュール開発」です。お楽しみに。
- 特集1
イミュータブルデータモデルで始める
実践データモデリング
業務の複雑さをシンプルに表現!
- 特集2
いまはじめるFlutter
iOS/Android両対応アプリを開発してみよう
- 特集3
作って学ぶWeb3
ブロックチェーン、スマートコントラクト、NFT