2015年2月8日日曜日

コードカバレッジを使って、視覚的/統計的にテスト状況を確認する

build.gradleの設定

Code Coverage機能を使用するために、app直下のbuild.gradleに追加します。

android {
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }

+        debug {
+            testCoverageEnabled = true
+        }
    }
}

複数のProjectをImportしている場合、各モジュールのbuild.gradleにtestCoverageEnabledを追加します。

Code Coverageの実行

Terminalから次のコマンドを実行します。

./gradlew createDebugCoverageReport

createDebugCoverageReportを実行すると、自動的にandroidTestを行います。
デバイス(or エミュレータ)が起動していない場合、次のようなエラーが表示されます。

:app:connectedAndroidTest FAILED          
              
FAILURE: Build failed with an exception.
              
* What went wrong:
Execution failed for task ':app:connectedAndroidTest'.
> com.android.builder.testing.api.DeviceException: java.lang.RuntimeException: No connected devices!

必ずデバイスかエミュレータを起動して、androidTestを実行できる環境にしておきましょう。

レポートの観覧

createDebugCoverageReportが成功すると、各モジュールのOutputにレポートを保存します。
[PROJECT]/app/build/outputs/reports/coverage/debug/index.html

次のような表が出力されます。コードの全ライン数に対して、テストが実行されたラインが統計的に確認する事ができます。



次のように視覚的に、どのコードがテストされていないか確認することも可能です。

2 件のコメント:

  1. いつも参考にしております。突然の質問で恐縮ですが、
    espressoやuiautomatorをJUnit4ベースで実行した場合にコードカバレッジが取得できない
    (網羅率0%でカウントされる)現象に陥ります。こちらについて解決策はご存知でしょうか。

    jacoco version = '0.7.2.201409121644'
    AndroidStudioは1.2、uiautomator-v18:2.1.0、espresso-core:2.1
    を使用しています。

    TestCaseを継承した一般的なテストケースの場合は問題ないのですが...
    AndroidJUnitRunnerの指定が引き金になっているのではないかと思っています。

    もしご存知でしたらご教授いただけると幸いです。

    返信削除
    返信
    1. すみません。自己解決しました。
      espresso-core:2.1とappcompat-v7:22.1.1の組み合わせでconflict解消のため
      ライブラリの依存性記述を弄っていたところに問題があったようです。
      espresso-core:2.0とすることでカバレッジが正常に取得できました。

      お騒がせしました。

      削除