KotlinによるAndroidアプリ開発環境にユニットテスト導入

# やること
Andoidアプリ開発環境にJUnit、jacocoを利用することによって
ユニットテストの実施と、その結果、及び、カバレッジのレポート出力を行う。

テストコードを書くより、その環境構築の方が大変だったので記録を残す。

# 環境
Kotlin 1.3.72-release-Studio4.0-1
Android Studio 4.0

導入したもの
JUnit4.0
jacoco

# 手順
## テストコードの作成
対象のクラスファイルを開き、クラス名にフォーカスを当てて
Ctrl + Shift + t を押下するとクラスファイルが作成出来る。

ここでライブラリはJUnit4 を選択し、
テスト対象のクラスを選択した上でボタンを押下して次へ進む。
![tempsnip7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/78260216-8a8a-b8cb-51e0-06a3be792866.png)



すると、出力先ディレクトリを聞かれる。
似たようなパスが二つ提案され「androidTest」と「test」という違いのみだが、ここは必ず<font color=red>testの方を選ぶ</font>↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/fa4db4df-db36-1e11-4126-c133d0642c4b.png)

これで指定先にテストコードが作成される。
テストコードの記載方法は割愛する。

## jacocoを入れてカバレッジレポートを出力
デフォルトではカバレッジのレポートを出力しない為、
Gradleからjacocoを入れる。

```gradle.json
    buildTypes {
        debug {                      // 追加
            testCoverageEnabled true // 追加
        }                            // 追加
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'![tempsnip5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/49fe0ab5-3147-7f96-7e00-82dd22ead24a.png)

        }
    }

    buildFeatures {
        dataBinding true
    }

    testOptions {                           // 追加
        unitTests {                         // 追加
            includeAndroidResources = true  // 追加
            unitTests.returnDefaultValues = true // 追加
        }                                   // 追加
    }                                       // 追加
}

```
 

これでgradleを再読み込みすると、
gradleのウインドウに新しくCreateDebugCaverageReportという項目が出来ている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/0c1a5331-3efb-890b-60d6-dd9e3fb4ad71.png)

ユニットテストを完了した後で、この項目をダブルクリックするとカバレッジレポートが下記パスで作成される↓
\app\build\reports\coverage\debug\index.html

![tempsnip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/a0d211c8-f6c0-bbec-f3e9-32f182cba59e.png)

## ユニットテスト結果を出力
ユニットテストは各プロジェクト or クラス or メソッド単位で右クリックから出力出来る。
![tempsnip8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/540d6b84-8757-95e5-4cf6-4ae045ecea16.png)

デバッグウインドウにはテスト結果が出力され、さらに下記のボタン押下からその結果をHTMLファイルにエクスポートすることが出来る
![tempsnip4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/7d6207d6-c016-8564-bf75-21cd4292ae78.png)

ボタン押下後、ダイヤログが開かれて出力先を聞かれるので、任意のディレクトリを選択してボタン押下すると
そこにまたindex.htmlが吐かれる。
各クラス、メソッド毎に実施したテストのログが残されている↓
![tempsnip5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504562/ea2fa392-f0b3-378f-4120-d25136ab9e73.png)


## 追記 UnitTestでContextが必要なとき
ユニットテストを進めるにあたり、
試験対象のメソッドにContextを渡すときに困ったのでその備忘録も記載する。

ざっくり言ってしまえばRobolectricを利用で解決する。

1. build.gradleで下記の様に記載してインポート

```
// Robolectric
    testImplementation 'org.robolectric:robolectric:4.3.1'
```

2. テストクラスにて、classの上に下記の2行を追加

```SampleUnitTest.kt
@RunWith(RobolectricTestRunner::class)
@Config(sdk = [Build.VERSION_CODES.O_MR1])
class DateUtilTest {
    // コンテキスト取得
    val context: Context = RuntimeEnvironment.application
    // **************
　　// **************
　　// **************

}
```

[参考記事](https://stackoverflow.com/questions/56821193/does-robolectric-require-java-9)


以上。