(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を作ってみましょう。

まず最初にひっかかりそうなのが、このフォルダー構造。

src/androidTest
src/test

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

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

ふむふむ、ここではテストスクリプトのメンテナンス性を損なうGUIからのテストはしないので、とりあえずsrc/androidTestは無視して、src/testにスクリプトを追加していく。余談だが、同じページに以下のような図があった。

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

単体テストのセットアップ

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

appのbuild.gradleに

androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'

を追加する。

単体テストを作る

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

c = a + b
c = a/b

calにカーソルをあてて、右クリック

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

OKを押すといかのようなものが生成される。

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

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

画面上ではこんな感じ

実行してみる

当然failでかえってくる

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