[Kotlin] 初学者がテストの勉強した話

#きっかけ
独学でandroidアプリを開発しています。
アプリを実際に動かすことはできても、テストには触れてきませんでした。
参考にしていた本にも載っていなかったので、ググりながら勉強して行きます。
#テストって何？
テストの目的は以下の通り
>不具合を発見する
>仕事が完了したことを確認する
>システムをより優れたものに改良する

（引用元）https://www.techscore.com/tech/Java/Others/JUnit/1/

なるほどなるほど。
動いているからOK、というものではないのですね。
#テストの種類
テストは大きく３種類
**小規模テスト**・・・クラスごと
**中規模テスト**・・・モジュールレベル
**大規模テスト**・・・複数のモジュールを跨いだテスト

今回は小規模テスト（Unitテスト）をやって行きます。Unitテストの中にも２種類あります
##ローカル単体テスト
**module-name/src/test/java/** に書き込む。
・JVMで実行
・androidフレームワークの依存関係が含まれないとき
・時間を最小限に抑えられる

##インストゥルメント化単体テスト
**module-name/src/androidTest/java/** に書き込む
・ハードウェア　エミュレータで実行
・androidフレームワークの依存関係が含まれるとき
・時間がかかる

基本的にはローカル単体テストで、実機テストの際にインスト（以下略）を行うと良いそうです。
#単体テストの準備

```build.gradle(app)
dependencies {
        // JUnit 4 のフレームワーク
        testImplementation 'junit:junit:4.12'
    }
```
ローカル単体テストならこれだけでOK
Android Studioでアプリ作成をすると初めから入力されていました。

#実行手順
・テストクラスを作成
・テストメソッドを作成
・Run
##テストしたいクラスを作成
○クラス名にカーソルを合わし、``shift+Command+T``
``Create New Test``を選択する
○クラス名を右クリックからの``Go to`` から選んでもOK
今回は最初に作られるメインアクティビティからテストクラスを作成しました。
<img width="659" alt="スクリーンショット 2020-07-25 9.11.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611160/9b725335-4707-a857-bc3b-2c68165a8acc.png">
Create Testでライブラリーを選択します。
<img width="525" alt="スクリーンショット 2020-07-24 20.31.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611160/a9ef78ae-f6d6-ce1f-c62a-3d9d26c06085.png">
Testing libraryからJunit４を選択しました。
##Junitって？
引用
>JUnitはJavaプログラム単体テスト用のフレームワークです。みんなが共通のテストフレームワークをもつことで、他人のテストプログラムの修正を容易にします。

選べるバージョンは３〜５までですが、ここでは４を選択します。
一番上のGroovy JUnitはこの方の記事が参考になりました。
[工数削減！GroovyでJUnitをシンプルに](https://www.casleyconsulting.co.jp/blog/engineer/171/)

<img width="479" alt="スクリーンショット 2020-07-24 20.33.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611160/7e7fdb54-a43d-1960-8772-71b32eaaf440.png">

Generateの項目にチェックを入れると、あらかじめ以下のメソッドを作成してくれます。

○setUp/@ Before
各メソッドの呼び出し前に実行
○tearDown/@ after
各メソッドの終了後に実行

テストメソッドで重複する項目がある場合に使用します。

##テストメソッドをかく
assert〜で始まるメソッドが用意されています。[どんな種類があるかはこちら](https://github.com/junit-team/junit4/wiki/Assertions)

[参考：Junit５との違い](https://qiita.com/gengogo5/items/317b6f260b6fecc184fc)

#クラスからメソッドを引っ張る

```
class MainActivityTest {

    @Test
    fun testAddCalculate() {
　　　　//テストしたいクラスをインスタンス化
　　　　val main = MainActivity()

　　　　//Mainクラス内のaddCalculateメソッドを使用する
       val addNum = main.addCalculate(3,2)
        Assert.assertEquals(7, addNum)
    }
}
```
想定される答えや真偽と合えばテストは成功、違えばメッセージが表示されます
<img width="833" alt="スクリーンショット 2020-07-25 9.03.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611160/356cb9eb-a10d-84cd-effd-f82d4eba5db0.png">
<img width="827" alt="スクリーンショット 2020-07-25 9.04.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611160/1274fc62-13b8-7475-8a88-344f5c6d8518.png">

#参考
[テストの基礎](https://developer.android.com/training/testing/fundamentals#medium-tests)
[ローカル単体テストを作成する](https://developer.android.com/training/testing/unit-testing/local-unit-tests?hl=ja)
[TECHSCORE](https://www.techscore.com/tech/Java/Others/JUnit/index/)
[テストエンジニア](https://qiita.com/jun2014/items/f655471a289955ce3cfa)
[工数削減！GroovyでJUnitをシンプルに](https://www.casleyconsulting.co.jp/blog/engineer/171/)
[JUnit5 使い方メモ](https://qiita.com/opengl-8080/items/efe54204e25f615e322f)

単体テストを実行するまでの流れはわかりました。
実戦に耐えうるテストにするにはどうすれば良いか、引き続き加筆修正していきます。