やらなイカ?

たぶん、iOS/Androidアプリの開発・テスト関係。

JetBrains Rider 2019.3でUnityテストのカバレッジを採取する

JetBrains製のC# IDEであるRiderには、テスト実行時にステートメントカバレッジを採取するdotCoverプラグインが提供されています。

これまで、dotCoverプラグインはUnity Test Framework*1に対応していませんでしたが、2019.3からEdit Mode tests実行時のカバレッジを採取・表示できるようになりました。

www.jetbrains.com

dotCoverプラグインの有効化

dotCoverプラグインは、一般のプラグインと同様、Preferences... > Plugins から有効化できます。 ただし使用するには、"ReSharper Ultimate + Rider" または "All Products Pack" のライセンスが必要です(30日間の試用あり)。

また、計測対象のUnityプロジェクトには、JetBrains Rider Editorパッケージの1.2.0以降が必要です。バージョンが古い場合は、UnityエディタのPackage Managerでアップデートしてください。

本稿では以下のバージョンで動作を確認しています。

  • JetBrains Rider 2019.3.1
  • Unity 2019.3.0f1
  • JetBrains Rider Editor 1.2.1
  • Test Framework 1.1.9

カバレッジ採取の準備

dotCoverプラグインカバレッジを採取するには、以下の準備が必要です。

1. Unityエディタを "Start Unity with Coverage" で起動する

RiderでUnityテストを実行するにはUnityエディタとのコネクトが必要ですが、dotCoverを使用するときには通常とは異なる方法でコネクトします。 Unityエディタは一旦閉じ、RiderのUnityツールバー左端にあるUnityロゴをクリックして "Start Unity with Coverage" で起動します。

f:id:nowsprinting:20200111201900p:plain

もしほかの方法で起動したUnityエディタとコネクトした状態でカバレッジを採取しようとすると、下図のアラートが表示されます*2

f:id:nowsprinting:20200111201903p:plain

2. 実行環境にEdit Modeを選択する

カバレッジの採取は、"Unit Tests"タブにあるプルダウンで"Unity Editor - Edit Mode"を選択した状態で実行する必要があります。

f:id:nowsprinting:20200111204832p:plain

つまり必然的に、Play Mode testsのカバレッジは採取できません。

カバレッジの採取

カバレッジは、以下の手順でテスト実行することで採取できます。

  1. Riderのエディタでテストコードを開き、テストメソッド定義にカーソルを置いて alt + enter*2 でContext Actionsメニューを表示します
  2. すると下図のように "Cover" が選択できますので、enterを押下すると当該メソッドが実行されます

f:id:nowsprinting:20200111202202p:plain

もしくは、Rider下部の"Unit Tests"ウィンドウにある"Explorer"タブでEdit Modeテストのアセンブリを選択し、左にある"Cover"アイコンをクリックすると、すべてのEdit Modeテストを実行できます*3

f:id:nowsprinting:20200111215057p:plain

Coverを実行すると、テスト実行結果が"Unit Tests"ウィンドウに表示されるほか、"Unit Tests Coverage"ウィンドウにステートメントカバレッジが表示されます。

カバレッジの見かた

"Unit Tests Coverage"ウィンドウでは、テスト対象のステートメント数と、テスト実行によって通過した/していないステートメント数、またその割合が確認できます。

f:id:nowsprinting:20200111201855p:plain

また、この状態でテスト対象ソースコードをエディタタブで開くと、通過した/していないステートメントを確認できます。 グリーンでマークされた行(下図16〜19, 25行目)は通過したステートメント、グレーでマークされた行(同22〜23行目)は通過していないステートメントです。

f:id:nowsprinting:20200111201857p:plain

ステートメントカバレッジの使いどころ

ステートメントカバレッジとは、ユニットテストによってテスト対象コードの全ステートメントのうち何%がテストされているかを示すメトリクスです。命令網羅、C0とも呼ばれます。

カバレッジ」には、ほかに、デシジョンカバレッジ、条件カバレッジなどが使われます。 上の例では19行目が通過していることしか確認できませんが、デシジョンカバレジを満たすには a == 0 のテストケースと、a != 0 かつ b == 0 のテストケースが必要です。

また、ステートメントが実行されたことは確認できますが、それが正しい実行結果であるかはアサーションで適切に判定されている必要があります。

以上の観点から、ステートメントカバレッジは品質の指標として信頼度の高いものとは言えず、あくまで「めやす」くらいにとどめるのが良いでしょう。

関連記事

www.nowsprinting.com

www.nowsprinting.com

関連書籍

IntelliJ IDEA パーフェクトガイド

IntelliJ IDEA パーフェクトガイド

仮面ライダーゼロワン 変身ベルト DXエイムズショットライザー

仮面ライダーゼロワン 変身ベルト DXエイムズショットライザー

  • 発売日: 2019/08/31
  • メディア: おもちゃ&ホビー

*1:Unity 2019.2以降パッケージ化された名称。詳しくは https://www.nowsprinting.com/entry/2019/09/28/132800 を参照

*2:Rider 2019.3.1から表示されるようになった模様

*3:Play Modeテストが存在しないのであれば、Tests > Cover All Tests from Solution でもすべてのテストを実行できます