10

インストルメンテーション テストと Robolectric による単体テストを介してEspresso ( Double Espressoを使用) を実行しようとしています。私がこれまでに得たものは、主にdeccard-gradleの例に基づいています。

注: Gradle 1.10

buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:0.10.4'
    classpath 'org.robolectric.gradle:gradle-android-test-plugin:0.10.0'
  }
}

apply plugin: 'android'
apply plugin: 'android-test'

android {
  compileSdkVersion 19
  buildToolsVersion '19.0.3'

  defaultConfig {
    packageName = 'com.example.app'
    minSdkVersion 9
    targetSdkVersion 19
    versionCode 1
    versionName '1.0.0'
    testInstrumentationRunner "com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner"
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
  }

  buildTypes {
    debug {
      debuggable = true
      runProguard = false
    }

    release {
      debuggable = false
      runProguard = true
    }
  }

  sourceSets {
    androidTest {
      setRoot('src/test')
    }
  }

  packagingOptions {
    exclude 'LICENSE.txt'
  }
}

androidTest {
  include '**/*Test.class'
  exclude '**/espresso/**/*.class'
  maxHeapSize = "2048m"
}

repositories {
  mavenCentral()
}

dependencies {
  compile 'com.android.support:support-v4:19.1.0'

  androidTestCompile('com.jakewharton.espresso:espresso:1.1-r3')
  androidTestCompile('com.jakewharton.espresso:espresso-support-v4:1.1-r3') {
    exclude group: 'com.android.support', module: 'support-v4'
  }

  androidTestCompile('junit:junit:4.11') {
    exclude module: 'hamcrest-core'
  }
  androidTestCompile('org.robolectric:robolectric:2.3') {
    exclude module: 'classworlds'
    exclude module: 'maven-artifact'
    exclude module: 'maven-artifact-manager'
    exclude module: 'maven-error-diagnostics'
    exclude module: 'maven-model'
    exclude module: 'maven-plugin-registry'
    exclude module: 'maven-profile'
    exclude module: 'maven-project'
    exclude module: 'maven-settings'
    exclude module: 'nekohtml'
    exclude module: 'plexus-container-default'
    exclude module: 'plexus-interpolation'
    exclude module: 'plexus-utils'
    exclude module: 'wagon-file'
    exclude module: 'wagon-http-lightweight'
    exclude module: 'wagon-http-shared'
    exclude module: 'wagon-provider-api'
  }
  androidTestCompile 'com.squareup:fest-android:1.0.8'
}

私のディレクトリ構造は次のとおりです。 asおよびas としてcom.example.app.espresso実行する必要があります。connectedAndroidTestcom.example.app.datatest

ソース
|- デバッグ
|- メイン
|- リリース
|- テスト
   |- ジャワ
      |-コム
         |- 例
            |- アプリ
               |- エスプレッソ
                  |- HomeActivityTest.java
               |- データ
                  |- DataTest.java
   |- リソース
      |- data_input.json

そのため、 を実行するgradle clean testと、 の Espresso インポートを認識しないというエラーが表示されHomeActivityTest.javaます。

を実行すると、 ( )gradle clean connectedAndroidTest内の JUnit4 アノテーションを認識しないというエラーが発生します。DataTest.javaFailedToCreateTests.testSuiteConstructionFailed

どちらかの部分 (依存関係とソース) を取り除くと、もう一方は独立して正常に動作しますが、すべてが一緒に含まれているわけではありません。

注: Espresso jar をローカルにインポートしようとしました (Double Espresso ではありません)、deccard-gradle が行うのと同じ方法support-v4で、Espresso テストでライブラリから何かを使用するまで機能します (com.jakewharton.espresso:espresso-support-v4それを解決するように見えますが、ローカル jar の代替手段はありません)、次に爆発しFailedToCreateTests.testSuiteConstructionFailedます。

誰かがこの構造を機能させましたか?各ターゲットからソース パスを除外する方法はありますか?

解決策(完全または部分的)をいただければ幸いです。

4

3 に答える 3

5

これは、Double Espresso アーティファクトが .aar ファイルとして配布され、テストを実行するために Robolectric が生成するコンパイル タスクが、androidTestCompile 依存関係構成の一部である .aar ファイルをアンパッケージするタスクに依存しないために発生します。

通常、単体テストを実行するタスクの一部としてエスプレッソ テストを実行しないため、Robolectric プラグインによって生成されたコンパイル タスクからエスプレッソ テストを安全に除外できます。これを行うには、Robolectric プラグインによって生成されたコンパイル タスクへの依存関係を、ソース プロパティを修正する build.gradle に追加します。以下のコード例。robolectric によって生成されたコンパイル タスクの名前 (この例では「compileTestDebugJava」) と、必要に応じてエスプレッソ テストの「除外」を必ず修正してください。

tasks.whenTaskAdded { theTask ->
    if ("compileTestDebugJava".toString().equals(theTask.name.toString())) {
        def cleanupTask = "touchUpRobolectricSourceSet"
        project.task(cleanupTask) << {
            FileTree tree = fileTree(dir: 'src/test/java')
            tree.exclude '**/espresso/**/*.java'

            theTask.source = tree
        }
        theTask.dependsOn(cleanupTask)
    }
}
于 2014-07-11T20:58:17.787 に答える
1

最終的に、Double Espresso を使用するという考えを断念し、deccard-gradle が採用するアプローチ、つまりエスプレッソ jar の ( espressotestrunnerおよびtestrunner-runtime) を手動でインポートするというアプローチを採用しました。

Double Espresso が jar を aar としてラップしてホストする以上のことを行っているか、またはそれらが aar であるという事実が問題を引き起こしているようです。理由を知りたいです。

ローカルの依存関係を維持することを避けるために、Espresso jar を Maven リポジトリにアップロードし、それらをデイジー チェーン接続し (espresso依存関係testrunner-runtimetestrunner-runner依存testrunner関係)、すべてのサードパーティの依存関係 (Guava、Hamcrest、Dagger など) を POM に含めました。ホストされた Maven リポジトリがない場合は、GitHub をリポジトリとして使用できます: https://stackoverflow.com/a/14013645/818393

確かに、最善の解決策ではありませんが、うまくいきます。

于 2014-06-03T02:44:32.720 に答える