質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.95%

Android向けライブラリをGradle+JaCoCoでカバレッジを取得したい。

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 2,965

score 8

初めて記載させていただきます。どうぞよろしくお願いいたします。

システム前提条件

・Gradle 2.13
・Androidビルドツール 23.0.2
・実機Android OS 5.0
・Gradle実行環境:Windows7 64bit
・開発環境 AndroidStudio 2.1.2

・プロジェクト構成

testProject
 ├─.settings
 ├─build
 │  └─jacoco
 │      └─testProject
 │          └─hoge.ahe.testProject ★ここにHTMLを出力したい
 ├─gen
 │  └─省略
 └─src
     ├─androidTest
     │  └─java
     │      └─hoge
     │          └─ahe
     │              └─testProject
     ├─main
     │  ├─assets
     │  ├─java
     │  │  └─hoge
     │  │      └─ahe
     │  │          └─testProject
     │  └─res
     │      └─省略
     └─test
         └─java
             └─hoge
                 └─ahe
                     └─testProject

実現したいこと

・1)JaCoCoを使用したコードカバレッジを出力したい。
⇒ HTML形式を想定する。
・2)connectedCheckタスクを使用して、実機でUnitテストを実行し、その結果のコードカバレッジの取得を想定

発生している問題・エラーメッセージ

1)のHTML出力について
現状、モジュール側のbuild.gradleにJaCoCoの記載をしてそれとなくHTMLは出力されているのですが、実際のテストコード部分のカバレッジが緑になりません。
AndroidUnitテストで実行した結果は、緑になるのですが、、、、

2)connectedCheckを使用した場合
以下のようなエラーが出力されます。

java.lang.IllegalStateException: JaCoCo agent not started.


エージェントを起動したいのですが、起動方法がわかりません。。。

該当のソースコード

apply plugin: 'com.android.application'
apply plugin: 'jacoco'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    lintOptions {
        abortOnError false
    }

    compileOptions {
        encoding "UTF-8"
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
    defaultConfig {
        applicationId "hoge.ahe.testproject"
        minSdkVersion 19
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
        }
        debug {
            testCoverageEnabled = true
        }
    }

    testOptions { 
        unitTests.returnDefaultValues = true
        unitTests.all {
            jvmArgs '-XX:MaxPermSize=256m'
        }
    }
    (android.hasProperty('applicationVariants')
            ? android.'applicationVariants'
            : android.'libraryVariants').all { variant ->

        def autoGenerated = ['**/R.class',
                             '**/R$*.class',
                             '**/Manifest*.*',
                             'android/**/*.*',
                             '**/BuildConfig.*',
        ]

        def variantName = variant.name.capitalize()

        def coverageSourceDirs = [ 
            "src/androidTest/java",
            "src/test/java", 
            "src/main/java", 
        ] 
        def coverageClassesDirs = [ 
            fileTree(dir: "build/intermediates/classes/test", excludes: autoGenerated),
        ] 

       task("jacoco${variantName}Report", type: JacocoReport,
               dependsOn: "test${variantName}UnitTest") {
           group 'Reporting'
           description "Generate ${variantName} Jacoco coverage reports."

           reports {
               xml.enabled = true
               html.enabled = true
               html {
                   destination "${buildDir}/jacoco/${project.name}"
               } 
           }

           additionalSourceDirs = files(coverageSourceDirs) 
           sourceDirectories = files(coverageSourceDirs)
           executionData =
                   files("${buildDir}/jacoco/test${variantName}UnitTest.exec")
           classDirectories = files(coverageClassesDirs)
       }
    }
}

dependencies {
    compile 'com.android.support:appcompat-v7:23.0.1'
    compile 'com.android.support:support-annotations:23.1.1'
    testCompile 'junit:junit:4.12'
    androidTestCompile 'com.android.support.test:runner:0.5'
    androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2'

}


テストコード

package hoge.ahe.testpackage;

import static org.hamcrest.CoreMatchers.*;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import android.test.ActivityInstrumentationTestCase2;

public class SampleTest extends ActivityInstrumentationTestCase2<TestActivity> {

    public SampleTest() {
        super(TestActivity.class);
    }

    @Before
    public void setUp() throws Exception {
}

    @Test
    public void add() {
        assertThat(8, is(8));
    }

    @Test
    public void testString() {
        assertThat("AndroidTestSample", is("AndroidTestSample"));
    }

    @After
    public void tearDown() throws Exception {
        super.tearDown();
    }

}

試したこと

・RunWith(AndroidJUnit4.class)のJUnit4に対応させた形にしたら、AndroidTestでInitializationErrorが発生。
⇒ JUnit3形式にする。
・実機接続しない形でJaCoCoのレポート出力『gradle jacocoDebugReport』実行
⇒ setUpメソッドと、tearDownメソッドしか実行されない。
⇒ @Testやメソッド名「test~~~()」にしてもNG

補足情報(言語/FW/ツール等のバージョンなど)

より詳細な情報

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.95%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る