はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】Unity公式パッケージ「Code Coverage」を利用してTest Frameworkのコードカバレッジを計測する

はじめに

今回はUnity公式パッケージであるCode Coverageを利用してTest Frameworkで実行したテストのコードカバレッジを計測する方法を紹介したいと思います。

docs.unity3d.com

実際に生成したレポート

Code Coverageとは

Code Coverageとはテストで用いられるコードがどれだけ実行されたかを示す指標です。

コード網羅率(コードもうらりつ、英: Code coverage、コードカバレッジ)は、ソフトウェアテストで用いられる尺度の1つである。プログラムのソースコードがテストされた割合を意味する。この場合のテストはコードを見ながら行うもので、ホワイトボックステストに分類される。

コード網羅率は体系的なソフトウェアテストのための技法として最初に生み出されたものの1つである。1963年の Communications of the ACM にある Miller と Maloney の論文に言及されているのが最初である。

コード網羅率 - Wikipedia

概要

本パッケージではテストモード関係なくエディタが実行中であればCode Coverageを収集することができます。

このパッケージを使用して、自動テストからコードカバレッジデータとレポートをエクスポートできます。さらに、Code Coverage パッケージには Coverage Recording 機能があり、手動テスト時や、プロジェクトに自動テスト機能がない場合に、オンデマンドでカバレッジデータを取得することができます。

Code Coverage - Unity マニュアル

結果をHTMLとして出力することもできます。

計測結果
計測結果

Line Coverageを出してくれたり、実際のコードを表示しながら何回実行されたかを調べたりもできます。(赤色に表示されているところはカバーされていない箇所)

環境

Unity2019.3.0a8 or later

インストール方法

Unity Package Managerからインストールします。Add Package from git URL...からcom.unity.testtools.codecoverageと入力すればOKです。

Code Coverageのインストール

セットアップ

Code Coverageを使うためにまずは設定が必要です。

メニューバーのWindow -> Analysis -> Code Coverageを選択し、Code Coverage Windowを立ち上げてください。

Code Coverage Window

まずはCode Coverageのデータとレポート生成を有効にするために、Enable Code Coverageのチェックボックを有効にしてください。

Code Coverage Windowについて

Code Coverage Windowの詳細について

詳細は以下の公式ドキュメントを参照してみてください。
Code Coverage window | Code Coverage | 1.2.5


今回のようにTest Frameworkでの計測結果(EditModeのみ)だけをレポートに出力したい場合は、Included Assembliesをテストに関係するアセンブリのみにすると良いでしょう。

対象アセンブリをテスト関連のものだけにする

EditModePlayModeでなくても計測することができますが、計測対象外のアセンブリが含まれていると見づらいので除いておく方が良いかと思います。

Test Runnerでレポートを作成する

Code Coverage WindowAuto Generate Reportのチェックボックスをオンにしている状態でTest Runnerでテストを実行してみてください。

無事に実行が終わるとResults Locationで指定したパスにindex.htmlを含めたファイル群が生成されているはずです。index.htmlをChromeなどのブラウザで開くことで結果を見ることができます。

開いている様子

またReport History Locationで指定したパスには2024-02-18_20-47-46_CoverageHistory.xmlのような形式でファイルが生成され、以下のように結果が書き込まれています。

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<coverage version="1.0" date="2024-02-18_20-47-46" tag="">
  <assembly name="Tests">
    <class name="SampleTest" coveredlines="27" coverablelines="30" totallines="99" coveredbranches="0" totalbranches="0" />
  </assembly>
</coverage>