読者です 読者をやめる 読者になる 読者になる

sos の 作業メモ

プログラミングや英会話学習、マイルや旅行、日常生活など。最近はWebFormなASP.NETのお守りがお仕事です。

日々の生活にhappyをプラスする|ハピタス Gポイント

「Androidアプリ テスト技法」第3章その3

読書 android

Androidアプリテスト技法

Androidアプリテスト技法

前回の続き

バックグラウンド

非同期で動作するServiceとAsyncLoaderのテスト方法

ServiceTestCase

Serviceをテストするためのテストケース。 startServiceやbindService, shutdownServiceといったメソッドを持っている。

LoaderTestCase

Honycomb(API 11)で導入されたLoaderをテストするためのテストケースクラス。LoaderTestCase#getLoaderResultSynchronously()は、本来非同期実行されるLoaderの処理を同期実行して結果を返してくれる。

外部要因の影響を受けるときのテスト方法

SQLite

SQLiteでのデータアクセスのテストを行うときは、setUpでデータベースを初期化し、テストに必要なデータを登録できるようにしておく。

Fixture

テストを実行し、成功させるために、データを準備したりすることをFixtureと呼ぶ

RenamingDelegatingContext

第二引数の文字列を対象プロジェクトで使用するデータベース名やファイル名の前に付加して、 テスト専用データベースやファイルを作成するためのContext。 SQLiteOpenHelperを作成するときのContextにはこれを使うとよい。

mockitoによる依存オブジェクトの置き換え

外部のデータや実行するたびに値が変化するような DOC(Depended-on Component)は、常に一定の値を返すオブジェクトに置き換えると対象のテストが容易になる。

ただし、依存オブジェクトの置き換えは、容易な場合と困難な場合があるため、 あらかじめ置き換えやすいように対象アプリを設計しておく必要がある。

間接入力

when()で指定されたメソッドの呼び出しの結果を、thenReturn()で指定した値に置き換えるテストスタブ を定義できる

間接出力

依存オブジェクトに対して値を設定する部分の検証が可能。厳密にテストしようとすると、テスト対象のロジックをトレースするようなテストコードになりやすい(ロジックに依存しやすい)ため、テストの容易性を向上させることを検討したほうがよいらしい

InOrderによる間接出力の厳密な検証

InOrder()を使うと、メソッド呼び出し順の検証も可能

Spyによる依存オブジェクト本来の振る舞いの再現

Mockito.mock()で作ったモックオブジェクトは、when()で定義されていないメソッドについてはnullを返す。 特定のメソッドを除いて本来の振る舞いをして欲しい時や、全てのメソッドが本来の振る舞いをした上で、verify()さえできればよい時には、Mockito.spy()で作ったオブジェクトを使うとよい。

モックオブジェクトの制限

言語仕様上、以下のケースではモックオブジェクトを生成できない

  • finalクラス
  • finalメソッド
  • staticメソッド(クラスメソッド)
  • equals() hashCode()のオーバーライド

HTTP通信のテスト

HTTP通信のユニットテスト

mockitoを使ってHttpClientオブジェクトをモックに置き換えて、高速で安定したユニットテストを行うようにする。

Webサービスからのレスポンスは、テストプロジェクトの/assetsに静的なファイルとして用意しておくと良い。

HTTP通信のユニットテスト(異常系)

HTTPステータスを返すメソッドを置き換えたり、 Mockito#thenThrow()で例外の発生を定義したりしてテストする。

HTTP通信のシステムテスト

開発者目線でのテストの他に、ユースケースやシナリオテストにおける異常系の項目を検出することで、以下 ような問題を検出できる可能性がある。

  • 異常時の表示メッセージやリトライ処理は適切か
  • UIへの操作(表示)をUIスレッド以外でしていないか

HTTP通信の接続先をテスト用のものに切り替える手段としては、以下のような手段がある。プロジェクトによって最適な方法を採用するとよい

  • アプリ内のリソースを書き換えたテスト用ビルドを作る
  • プロキシを利用してアクセス先を変更する

想定外の通信断のテスト

通信が不安定な環境を作り、ストレステストを実施するとよい

  • ビルの地下等電波の届きにくい場所に端末を持ち込む
  • 端末を電子レンジに入れる
  • 端末をアルミホイルで包む

不安定な状態をテストするため、作業方法自体が不安定となる。テストにかけられるコストと相談して実施するとよい。


モックオブジェクトによる応答の固定化。そのためのモックオブジェクトの生成。 そして便利なフレームワークと、ユニットテストに対する見方がだいぶ変わって来ました。 今度からちゃんとテストを書けるような気がするw

さぁ、残り50ページ。この本の記事もあと2回くらいで終わりかな?

次回へ続く