Gradle Pluginのテスト/カバレッジ環境構築 & ドッグフーディング

最近、[Androidアプリのカバレッジを自動チェックするGradleプラグイン](http://qiita.com/shikato/items/9869719ab5e22ee9d061)を書いたのですが、カバレッジをチェックするプラグインにも関わらず、プラグイン自身のカバレッジが :zero: という惨憺たる状況だったのでテスト/カバレッジ環境を構築してみました。
Groovyでテストコードを書いたりするのは初めてだったのですが、案外すぐに環境を構築することができました。

## テストについて
### 環境構築
とりあえず以下のようなディレクトリ構成にするのみでOKでした。

```zsh
src
 |-- main
 |    |-- groovy/{{packageName}} 
 |-- test
      |-- groovy/{{packageName}} # テストコードdir
```
[実際のディレクトリ](https://github.com/shikato/gradle-android-coverage-check/tree/develop/src)

### テストコード&実行&結果
Groovyといえば元祖PowerAssertということで（確か）、以下のようなテストコードを書いて実行すると、PowerAssertな結果を表示してくれます。

```groovy
class ShikatoTest {

    @Test
    void sum1() {
        def expected = 2;
        assert 1 + 1 == expected;
    }

    @Test
    void sum2() {
        // あえて失敗させる
        def expected = 2;
        assert 1 + 2 == expected;
    }
}
```


```zsh:実行
# --infoオプションをつけないとコンソール上でPowerAssertな結果は表示してくれなかった
#（--infoなくてもhtmlレポート上ではPowerAssertな結果を表示してくれる）
./gradlew test --info
```
![スクリーンショット 2016-02-09 1.58.00.png](https://qiita-image-store.s3.amazonaws.com/0/47437/c612f1b3-b829-5a9c-0acb-0687e743a4e6.png)

```zsh:HTMLレポート
# 以下に出力されるはず
build/reports/tests/index.html 
```
![スクリーンショット 2016-02-09 2.00.51.png](https://qiita-image-store.s3.amazonaws.com/0/47437/275751ae-8af0-48fa-b12f-f8ce96bbcbbc.png)

**良い感じですね** :bangbang::smile: 



## カバレッジについて
### JaCoCo
テストを書くための環境ができたので、次はカバレッジを計測できるようにしてみます。
計測には[JaCoCo](http://eclemma.org/jacoco/)を使用しました。
JaCoCoを選んだ理由は以下の3点です。

* [Gradleの標準でプラグインが用意されている](https://docs.gradle.org/current/userguide/jacoco_plugin.html)
* [Android Gradle Pluginでもサポートされている](http://tools.android.com/tech-docs/new-build-system)
* [AndroidCoverageCheckプラグイン](https://github.com/shikato/gradle-android-coverage-check)でドッグフーディングできそうだったから

3つ目に関しては後の項目で触れます。

### 環境構築
上で述べたようにGradleの標準でプラグインが用意されているため、以下のように宣言するのみで使用可能です。

```groovy:build.gradle
apply plugin: 'jacoco'
```
加えて今回はXMLレポート機能を有効にします([AndroidCoverageCheckプラグイン](https://github.com/shikato/gradle-android-coverage-check)で使用するため)。

```groovy:build.gradle
jacocoTestReport {
    reports {
        xml.enabled = true
    }
}
```
[実際のbuild.gradle](https://github.com/shikato/gradle-android-coverage-check/blob/develop/build.gradle)
### 実行
```zsh:実行
# レポートを生成するだけならjacocoTestReportタスクのみでOK
./gradlew test jacocoTestReport 
```
### 結果
```zsh:HTMLレポート
# 出力先を変更していなければ以下に出力されるはず
build/reports/jacoco/test/html/index.html 
```
![スクリーンショット 2016-02-09 2.25.39.png](https://qiita-image-store.s3.amazonaws.com/0/47437/276d76ac-40f9-12ee-884e-81f946f4f9ca.png)

**良い感じですね** :bangbang::smile: 

## AndroidCoverageCheckプラグインのドッグフーディングについて
自分のアプリでドッグフーディングするのは勿論ですが、AndroidCoverageCheckプラグイン自身の開発でもドッグフーディングできるに越したことはないので、その設定をしました。

### AndroidCoverageCheckプラグインの設定
XMLレポートのデフォルト出力先が、Android Gradle PluginからJaCoCoを使用した時と違うので、以下のように指定しました。

```groovy:build.gradle
String[] reportXmlPath = ["**/jacoco/**/jacocoTestReport.xml"];

androidCoverageCheck {
    isBuildFailure false
    instruction 80
    branch 80
    reportXml reportXmlPath
}
```
[実際のbuild.gradle](https://github.com/shikato/gradle-android-coverage-check/blob/develop/build.gradle)
AndroidCoverageCheckプラグインの詳細な導入手順は[こちら](https://github.com/shikato/gradle-android-coverage-check)を参照していただければと思います。
### 実行
```zsh:実行
# テストとカバレッジレポート生成とカバレッジチェックを実行
./gradlew test jacocoTestReport androidCoverageCheck
```
### 結果
![スクリーンショット 2016-02-09 2.38.35.png](https://qiita-image-store.s3.amazonaws.com/0/47437/5eba9d45-ae69-d016-c5a3-7af819e28f8b.png)

**良い感じですね** :bangbang::smile: 
（まだ、かなり赤いですが、とりあえずこの記事では環境を構築するところまでとしているので、今後に期待です :innocent: ）

## さいごに
とりあえず、テスト/カバレッジ環境が構築できたので、ドッグフーディングしながらテストを増やしていければと思います :octocat: