Junit5（spek）+mockk+jacoco+bitriseを始めるのは簡単だったよという話（割と新人向け）

## まえふり
ども、八流エンジニアです。
早速ですが、昨今の開発現場の実態として、テストを書いてないプロダクトも世にはありますし、
テストは書いてあるけれども、さまざまな理由でメンテナンスされておらず、
今は動かされていない・・なんてことがあります。

僕個人としては~~テスト作るのめんどくさいのでテスターにぶん投げたいという本音がありますが、~~
テストコードは`書けた方が得`なので、若い人々は書けるようになりましょう。
（テストコード書く利点は、運用保守以外にも設計などにも関わってくるんですが、その話は誰かに聞いてください）w


## 目的
* テストクラスが気軽に作れるというのを伝える
* テスト実行もCIにやらせれば楽というのを伝える
* 自分の技術的関心のある、CodeCovを拝んでみたい


## 前提
* bitriseはアカウント作成を事前にしてください。
* codeDevはアカウント作成を事前にしてください。
* spekはライブラリだけでなく、即実行するためにIDE上にプラグイン(Spek Framework)を入れてください。
* 迷ったら参考資料みてやっているんで、参考資料をみてください 草


## やったこと
* 週末にテストクラス作る
* 対象は、以前土日に作ったサンプルアプリに実装する
* ついでにbitriseとjacocoにも手を出す


## 結果
#### 成果物
https://github.com/tomotakasg/DISampe/blob/master/README.md

#### 試行錯誤して失敗しまくりましたが、どうにかなりましたw
![スクリーンショット 2021-03-21 13.38.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1133878/ac95e991-a7e1-698c-3129-88bbafbf3420.png)

ログも載せようと思ったのですが、あまりに長いので、割愛します。
やったことは、標準のworkFlowに、Scriptと、CodeCovを追加しただけです。
![スクリーンショット 2021-03-22 1.57.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1133878/92974c63-ee8d-ac89-3761-b39bb1cda134.png)

### 作成したテストクラスを元に、テストクラスの見やすさをアピール
今までテストクラスを見たことも、書いたことない人には、大変伝わりにくいけど・・・
とにかく、可読性が上がって見通しやすくなったし、スマートに書けるようになりました。

以下のコード見てもらって、それがなんとなく伝わればいいなと思う。

```kotlin
class MainViewModelTest : Spek({

    // SpekによりboforeEachとか、いらない。アノテーションもいらなくなった！
    val usecase by memoized {
        mockk<TopAction>()
    }

    val viewModel by memoized {
        MainViewModel(usecase, mockk())
    }

    describe("MainViewModel#request") {
        context("normal pattern") {
            it("success") {
                // coEveryは、suspendに使う
                coEvery {
                    usecase.invoke(mockk(), mockk())
                } returns Unit // 戻りなしはUnitで済ませる
                //実際テストすること
                viewModel.request()
                //想定結果
                coVerify {
                    usecase.invoke(mockk(), mockk())
                }
            }
        }
    }
})
```

### すごいざっくりまとめる
spekの機能で、説明書いています。
`describe`,`contest`,`it`
「このテストはなんのための、どういう意図のテストなのか」みたいな感じです。

テスト内容と実際の確認はmockkが担っています。
モック(`mockk`）したものを、検査（`coVerify`）しているだけです。

このテスト内容で確認したかったことは、
`viewModel.request()`を実行すると`usecase.invoke(mockk(), mockk())`が、
実行されることを確認したい。
というシンプルなことです。
実際`usecase#invoke`は呼ばれているため、想定通り、ということになりました。（テストクリア）

テストクラス開発中はいいけど、
いざ動かしていると、１つずつテストクラス実行するのも面倒臭いので、CI(Bitrise）に任せる。
というのをしました。
bitriseは難しいことなく、基本ポチポチするだけで終わるので、あまり言いたいことないですね。

他の方の記事通りやって、
割とスムーズに環境用意できたし、テストも実施できたし、
テストもかなり可読性のいいものになったと思います。

何が言いたかったかというと、
サンプルアプリを作れるレベルの方なら、テストクラスも作れると思いますよ。
テストクラス作れるなら、簡単なCI/CD導入くらいならできると思いますよ。
という事です。


ここで記事終わってもいいんですが、まだできそうな事とかが残っているので、以下にメモ残します。


## ハマったこと
* jacocoの設定が動かない
    * 記事の手順書に従っても、うまくいかない
    * バージョンや環境が完全一致なため仕方ない
    * ログ見て地味に潰していく


##### `packagingOptions {}`を追加したり、logにそって修正を入れる
![スクリーンショット 2021-03-21 11.40.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1133878/cd8e7269-f354-18b4-a459-0a785e946891.png)



## 実はまだハマっているw
* CodeCov連携ができていない。
    * テスト結果がうまく反映されていない模様
    * junit5との相性が悪い？issueが上がっていたがどうなったんだろう・・
    * 今回得たかった、bitriseからCodeCov呼び出すはできたから良しとする

## 拡張できそうだけどやってないこと
* fastlaneの導入
    * ストアリリースまで想定するなら、androidでもfastlaneは使えるみたい
    * ただ、ストアリリースがないなら、無理に使う必要なさそう


## 参考資料
#### @sadashi を信じろ（敬称略）

https://qiita.com/sadashi/items/a5b93c9fc06e084456d2

https://qiita.com/sadashi/items/81c64583a0112cfe6f8d

https://qiita.com/sadashi/items/97913fa095e5d16d44d0

#### `memorized`が笑えるくらいスマートにかける

https://speakerdeck.com/hkusu/unit-test-for-viewmodel-and-livedata?slide=28
#### 拡張関数で対応するといい　`kotlinx-coroutines-test`

https://iwsksky.hatenablog.com/entry/2020/12/09/014603