ビルドタイプだけを指定してまとめてテストする方法

## 概要 ##
この記事ではAndroid Gradle Pluginで特定のビルドタイプのすべてのプロダクトフレーバーをまとめてテストする方法を説明します。
この方法で、以下のようにビルドタイプだけを指定してテストできるようになります。
```
$ ./gradlew testDebug
```

## 詳細 ##

Android Gradle Plugin(現行バージョン1.3.1)でテストを実行する場合、以下の組み合わせしか指定できません。

* 全ビルドバリアント
* 個別のビルドバリアント

例えば、プロジェクトが以下のように２つのプロダクトフレーバー'internal', 'production'を持つ場合を見てみましょう。

```
buildTypes {
  debug
  release
}

productFlavors {
  internal
  production
}
```

このプロジェクトで実行可能なテストは以下のようになります。

```
$ ./gradlew tasks
test - Run unit tests for all variants.
testInternalDebugUnitTest - Run unit tests for the internalDebug build.
testInternalReleaseUnitTest - Run unit tests for the internalRelease build.
testProductionDebugUnitTest - Run unit tests for the productionDebug build.
testProductionReleaseUnitTest - Run unit tests for the productionRelease build.
```

全ビルドバリアントをテストする'test'UnitTestタスク、および2つのビルドタイプ'debug'、'release'と2つのプロダクトフレーバー'internal'、'production'の組み合わせである4つのUnitTestタスクです。

これらのタスクをビルドタイプ毎にまとめるためのタスクを作成し、そのタスクの依存に個々のテストを追加します。


```
afterEvaluate {

    project.android.applicationVariants.all {
        def buildTypeName = it.buildType.name.capitalize()
        def taskName = "test${buildTypeName}"

        // ビルドタイプ毎のタスクを作成する（すでに作成していれば再利用する）
        def task = project.tasks.find { it.name == taskName }
        if (!task) {
            task = project.task(taskName, group: 'verification', description: "Run unit tests for all ${it.buildType.name} variants.")
        }

        // ビルドタイプ毎のタスクの依存にビルドバリアントのテストタスクを追加する
        def variantName = it.name.capitalize()
        task.dependsOn(project.tasks["test${variantName}UnitTest"])
    }
}
```


タスクを見てみると'testDebug'、'testRelease'が追加されていることがわかります。

```
$ ./gradlew tasks
... 省略
testDebug - Run unit tests for all debug variants.
testRelease - Run unit tests for all release variants.
```

以下のように、testDebugタスクを実行すると'testInternalDebugUnitTest'、'testProductionDebugUnitTest'が実行されます。


```
$ ./gradlew testDebug

:app:preBuild UP-TO-DATE
:app:preInternalDebugBuild UP-TO-DATE
:app:checkInternalDebugManifest
:app:preInternalReleaseBuild UP-TO-DATE
:app:preProductionDebugBuild UP-TO-DATE
:app:preProductionReleaseBuild UP-TO-DATE
:app:prepareComAndroidSupportAppcompatV72301Library UP-TO-DATE
:app:prepareComAndroidSupportDesign2301Library UP-TO-DATE
:app:prepareComAndroidSupportRecyclerviewV72221Library UP-TO-DATE
:app:prepareComAndroidSupportSupportV42301Library UP-TO-DATE
:app:prepareComCrashlyticsSdkAndroidAnswers132Library UP-TO-DATE
:app:prepareComCrashlyticsSdkAndroidBeta113Library UP-TO-DATE
:app:prepareComCrashlyticsSdkAndroidCrashlytics252Library UP-TO-DATE
:app:prepareComCrashlyticsSdkAndroidCrashlyticsCore235Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBase830Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesBasement830Library UP-TO-DATE
:app:prepareComGoogleAndroidGmsPlayServicesMaps830Library UP-TO-DATE
:app:prepareComGoogleMapsAndroidAndroidMapsUtils04Library UP-TO-DATE
:app:prepareComJakewhartonThreetenabpThreetenabp102Library UP-TO-DATE
:app:prepareComSothreeSlidinguppanelLibrary320Library UP-TO-DATE
:app:prepareIoFabricSdkAndroidFabric136Library UP-TO-DATE
:app:prepareIoReactivexRxandroid101Library UP-TO-DATE
:app:prepareInternalDebugDependencies
:app:compileInternalDebugAidl UP-TO-DATE
:app:compileInternalDebugRenderscript UP-TO-DATE
:app:generateInternalDebugBuildConfig UP-TO-DATE
:app:generateInternalDebugAssets UP-TO-DATE
:app:mergeInternalDebugAssets UP-TO-DATE
:app:generateInternalDebugResValues UP-TO-DATE
:app:generateInternalDebugResources UP-TO-DATE
:app:mergeInternalDebugResources UP-TO-DATE
:app:processInternalDebugManifest UP-TO-DATE
:app:fabricGenerateResourcesInternalDebug
:app:processInternalDebugResources
:app:generateInternalDebugSources
:app:processInternalDebugJavaRes UP-TO-DATE
:app:compileInternalDebugJavaWithJavac UP-TO-DATE
:app:compileRetrolambdaInternalDebug
:app:compileInternalDebugGroovyWithGroovyc UP-TO-DATE
:app:preInternalDebugUnitTestBuild UP-TO-DATE
:app:prepareInternalDebugUnitTestDependencies
:app:processInternalDebugUnitTestJavaRes UP-TO-DATE
:app:compileInternalDebugUnitTestJavaWithJavac
:app:compileInternalDebugUnitTestSources
:app:mockableAndroidJar UP-TO-DATE
:app:assembleInternalDebugUnitTest
:app:testInternalDebugUnitTest
:app:checkProductionDebugManifest
:app:prepareProductionDebugDependencies
:app:compileProductionDebugAidl UP-TO-DATE
:app:compileProductionDebugRenderscript UP-TO-DATE
:app:generateProductionDebugBuildConfig UP-TO-DATE
:app:generateProductionDebugAssets UP-TO-DATE
:app:mergeProductionDebugAssets UP-TO-DATE
:app:generateProductionDebugResValues UP-TO-DATE
:app:generateProductionDebugResources UP-TO-DATE
:app:mergeProductionDebugResources UP-TO-DATE
:app:processProductionDebugManifest UP-TO-DATE
:app:fabricGenerateResourcesProductionDebug
:app:processProductionDebugResources
:app:generateProductionDebugSources
:app:processProductionDebugJavaRes UP-TO-DATE
:app:compileProductionDebugJavaWithJavac UP-TO-DATE
:app:compileRetrolambdaProductionDebug
:app:compileProductionDebugGroovyWithGroovyc UP-TO-DATE
:app:preProductionDebugUnitTestBuild UP-TO-DATE
:app:prepareProductionDebugUnitTestDependencies
:app:processProductionDebugUnitTestJavaRes UP-TO-DATE
:app:compileProductionDebugUnitTestJavaWithJavac
:app:compileProductionDebugUnitTestSources
:app:assembleProductionDebugUnitTest
:app:testProductionDebugUnitTest
:app:testDebug

```

以上。