(1)Android 網羅的単体テスト編 - 準備（備忘録）　


やりたいこと

(1) Android 網羅的単体テスト編（まだちゃんとできてないけど）
(2) 網羅率測定 -> https://qiita.com/halsuguro/items/5bf3f7c8c3c577ac616f
(3) CircleCI統合（作成中）
(4) AppiumでUI部分実装（作成中）

# 環境
AndroidStudio 4.0.1
macOS Catalina, version 10.15.6, CPU 1.6GHz, Mem 16G


# Setup(簡単なアプリを作る)

まずEmpty Activityを作ってみましょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680371/2d4b25a6-06f7-9b46-e58c-e4f99b6b4308.png" width=50%>

まず最初にひっかかりそうなのが、このフォルダー構造。
![Screen Shot 2020-07-25 at 16.26.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680371/7b7b0619-28e3-27f3-7329-11dd50dcf39d.png)

``` 
src/androidTest
src/test
``` 

なんやねん、Google曰く
**src/androidTest**「ディレクトリには、実際のデバイスまたは仮想デバイスで実行するテストを配置します。この種のテストには、統合テストとエンドツーエンド テストに加えて、JVM だけではアプリの機能を検証できない場合のテストがあります。」

**src/test**「ディレクトリには、単体テストなど、ローカルマシンで実行するテストを配置します。」

ふむふむ、ここではテストスクリプトのメンテナンス性を損なうGUIからのテストはしないので、とりあえずsrc/androidTestは無視して、src/testにスクリプトを追加していく。余談だが、同じページに以下のような図があった。
![Screen Shot 2020-07-25 at 16.39.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680371/261ab07d-907d-6266-0d3e-732b8ffc4d74.png)

さらに以下引用
「図 2 に示すテスト ピラミッドは、3 つのテストカテゴリ（小規模、中規模、大規模）について、アプリで扱うべき程度を示しています。
**小規模テスト**は、1 つのクラスごとにアプリの動作を検証する単体テストです。
**中規模テスト**は、モジュール内のスタックレベルでのインタラクション、または関連するモジュール間のインタラクションを検証する統合テストです。
**大規模テスト**は、アプリの複数のモジュールにまたがってユーザーが経験する過程を検証するエンドツーエンド テストです。
小規模テストから大規模テストへとピラミッドの段階が上がるにつれて、各テストの再現性は向上しますが、実行時間と保守およびデバッグの労力が増大します。したがって、統合テストより単体テストを増やし、エンドツーエンド テストより統合テストを増やす必要があります。各カテゴリのテストの割合はアプリのユースケースに応じて異なりますが、一般的には、小規模テスト 70%、中規模テスト 20%、大規模テスト 10% の割合でテストを作成することをおすすめします。」
なかなかいいこと書いてある、小規模テスト、中規模テスト、大規模テストという言い方は気に食わないが。。。


# 単体テストのセットアップ
ここはちとめんどくさいおまじないがいくつかある、めげずにググりながら進めてほしい。
build.gladleに「classpath "de.mannodermaus.gradle.plugins:android-junit5:1.4.2.0」を追加する

![Screen Shot 2020-07-25 at 17.11.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680371/26864a5f-1f49-3185-80b5-37f2f90b1cca.png)

appのbuild.gradleに

```
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
```
を追加する。

![Screen Shot 2020-07-25 at 17.15.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680371/b3ff33a8-92f9-ec34-910a-43e5b6b67d55.png)

# 単体テストを作る
正しい単体テストは境界値条件を考える必要がある（次章で展開）。
複数の境界値の入れ方をどう考えるかは。「単体テスト」再入門！ 開発の現場でバグを確実に洗い出す最適な手法と、テストケースの作り方」
https://employment.en-japan.com/engineerhub/entry/2019/10/03/103000
を参照。ここではまず簡単なコードまずテストしてみる

```
c = a + b
c = a/b
```

![Screen Shot 2020-07-25 at 17.30.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680371/ad8b6c86-bd30-f5a6-e0aa-9eb704acb7fc.png)

calにカーソルをあてて、右クリック
![Screen Shot 2020-07-26 at 7.13.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680371/58fa48a0-b0ed-a157-86ed-0fac247f7936.png)

![Screen Shot 2020-07-26 at 7.03.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680371/0ca45f80-dbe6-4d72-2064-f7966e60dd8c.png)

上記のような画面がでてくるので、Testing libraryで***JUnit5***を選択(2020年7月ではJunit 3, 4, 5, Groovy JUnitが選べるがここではあまり、手法については解説しないので、以下を参照していただきたい）。
JUnit4を選択し、といあえずplusのテストだけ作成してみる。

![Screen Shot 2020-07-26 at 7.25.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680371/94540ee8-304b-3ad7-7d35-9a7f550f9f1a.png)

OKを押すといかのようなものが生成される。
![Screen Shot 2020-07-26 at 7.30.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680371/57dc56c5-5dc8-601b-26a2-4355dcdb3d73.png)

とりあえず失敗テストを追加してみる、4 = 1 + 2 ではない。

```
assertEquals(4, mcalc.plus(1,2),0 );  //Added test code
```

画面上ではこんな感じ
![Screen Shot 2020-07-26 at 7.43.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680371/6b7cfbed-815c-8ea7-50d0-f16262b51db6.png)

実行してみる
![Screen Shot 2020-07-26 at 7.46.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680371/44343934-065e-42df-8e46-18bff82e5a0a.png)

当然failでかえってくる
![Screen Shot 2020-07-26 at 7.50.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680371/6ffa68ed-7fc8-3413-fe1e-6226a9bde069.png)

```
assertEquals(3, mcalc.plus(1,2),0 );  //Added test code
```

正しい結果で定義してみる、当然assertは起こらない、でも"PASS!おめでとう!"とも言ってくれない。次章ではここに分岐コードを加えてcode coverageを測定してみる。


# 参考
https://www.capa.co.jp/archives/27328    （AndroidStudioでの単体テストが詳細に記述されている）
https://qiita.com/izuki_y/items/d784529c301af2883b85