Slide 1

Slide 1 text

KOTLIN でテストを書く KOTLIN でテストを書く

Slide 2

Slide 2 text

Android の2 つのテスト jvm で実行されるテストと Android のデバイスやエミュレーターで 実行されるテストがある それぞれ、メリット・デメリットがあり場合に応じて使い分ける

Slide 3

Slide 3 text

jvm で実行するテスト ソースコードの置き場: 開発をしている端末(パソコン)の jvm で実行される 起動や動作がAndroid の端末と比べて速い Android のAPI を利用することはデフォルトではできない。外部の ライブラリを利用すればできる 端末依存、機種依存のバグの発見は難しい 画面遷移のテストができない

Slide 4

Slide 4 text

Android のデバイスで実行するテスト ソースコードの置き場: 開発をしている端末に接続をしているAndroid のデバイスやエミュ レーターで実行される Android の API や、UI 操作をコードで行うことができる 起動や実行にかかる時間がjvm と比べて遅い

Slide 5

Slide 5 text

2 つのテストの使い分け jvm のテスト: 単体機能のテストに利用する。外部のライブラリを 使ってAndroid のAPI をある程度利用できるようにしておくことが 前提。 Android デバイスのテスト: UI の操作を含むシナリオテストに利用 をする。

Slide 6

Slide 6 text

プロジェクトの設定 を選択してプロジェクトで kotlin が利用 できるようにする。

Slide 7

Slide 7 text

app/build.gradle android { defaultConfig { testInstrumentationRunner( "android.support.test.runner.AndroidJUnitRunner") } testOptions { unitTests.returnDefaultValues = true } } dependencies { // 省略 testImplements 'junit:junit:4.12' }

Slide 8

Slide 8 text

app/build.gradle : Android でテストを実行するときの テストランナー : jvm でテストするときに Android のライブラリに default value を返すようにする jUnit: 単体テストを実行するためのフレームワーク、ライブラリ。 kotlin でテストを書くときにもこれを使う 以外はプロジェクトを作ったときに勝手に追 加されているはず。

Slide 9

Slide 9 text

テストの書き方 に追加する import org.hamcrest.CoreMatchers.`is` import org.junit.Assert.assertThat import org.junit.Test class CalculatorTest { @Test // 1 fun 足 算 () { // 2 val a = 1 val b = 2 val sum = a + b assertThat(sum, `is`(3)) // 3 } }

Slide 10

Slide 10 text

テストの書き方 1. テストで実行をするメソッドには アノテーションを付ける 2. テストメソッドの名前は再利用性よりも分かりやすさを優先す る。ここでは、日本語を使うことで何をテストするのかがひと目 で分かるようにしている 3. 値のチェックは メソッドを利用。第1 引数に実際の 値、第2 引数には「どういう状態であって欲しいのか」を意味す る をパラメータに与える Matcher には様々な種類がある。 は第1 引数の値と等しいこと を確認する ちなみに は kotlin の予約語なので で囲む必 要がある

Slide 11

Slide 11 text

テストを実行する テストクラスやメソッドの横にある ▲ をクリックする

Slide 12

Slide 12 text

テストを書けるようにする class UntestableClass { fun findUserByID(id: Long): User? { val users = getUserFromInternet() // 1 return users.find { it.id == id } } }

Slide 13

Slide 13 text

テストを書けるようにする 1. 実装が外部の環境(ここではインターネット)に依存しているた め、テストを書くことができない テストを実行するときに、ネットワークの状態や接続先の状態 などにテスト結果が左右される テストに失敗したときに純粋にコードのミスなのか、環境の問 題なのかの切り分けができない

Slide 14

Slide 14 text

テストを書けるようにする interface UserAPI { fun getUserFromInternet(): List } class TestableClass(val api: UserAPI) { // 1 fun findUserByID(id: Long): User? { val users = api.getUserFromInternet() return users.find { it.id == id } } }

Slide 15

Slide 15 text

テストを書けるようにする 1. 外部の環境への接続方法をコンストラクタで指定できるようにな ったため、テストが書ける テストのときはネットワークに接続詞ないスタブを指定するこ とができる テストに失敗してもコードにミスが有ることが特定できる このあたりの事情が Dagger2 を利用した DI とかにつながってい く

Slide 16

Slide 16 text

宣伝 本を書きました。今回の資料に含まれるような内容のことも書いて あります。 Android アプリ開発のためのKotlin 実践プログラミング