話題の記事

Androidアプリの結合テスト

2012.10.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

スマホアプリの結合テストでは、スマホ特有の確認すべき点が数多くあります。 特に Android は端末の種類が多いですし、OSのカスタマイズもかなり自由度があるので思わぬバグが発生する可能性がかなり高いです。 ということで今回は 結合テストで確認したいチェック項目 をジャンルごとにまとめてみました。

端末

インストール先の違いによって動作しない処理がないか

Android OS バージョン 2.2 (APIレベル9) より、アプリをSDカードにインストールできるようになりました。それによって動作しない処理が発生する可能性があります(例えば、SDカードにインストールされている状態では再起動やSDカードマウントを BroadcastReciever で受け取れないなど)。

SDカードのマウント・アンマウントで異常な処理が発生しないか

Android はSDカードの有無によって保存先が変わってしまいます。ファイルの保存を行う処理がある場合、SDカードがアンマウント状態のときにも正常に保存処理が行えるか(またはエラーとして処理が正しく行われるか)確認する必要があります。

カメラなどのハードウェアを利用する場合に正常に動作しない端末はないか

カメラなどの標準的なハードウェアにおいても、端末によってはかなり独特な処理が行われているということがよくあります。画像ファイルが正常に保存されているか(Exif情報のOrientationなど)、ContentProviderに正常な形式で登録されているか(情報が抜けているとギャラリーが強制終了する場合もあります)、入念なチェックが必要になります。

ストレージ容量が不足しているときに動作するか

Android (特に 2.x 系以下の端末)の内部ストレージ容量は少ない場合が多いため、容量不足は頻繁に発生します。SQLiteデータベースへの書き込みやファイルの保存処理をおこなうときにストレージ容量が不足しているときのエラーが抜け漏れなくハンドリングされ、エラー処理が想定通り行われるか確認する必要があります。

バッテリーの消費が多くないか

スマホのバッテリーは多くありません。GLSurfaceView でゴリゴリな3Dグラフィックを描画したりするとCPU負荷が大きくなり、バッテリー消耗が激しくなってしまいます。開発時は常にUSB接続しているので、なかなか発見しづらいところだと思います。そのため、アプリ操作時にバッテリー消耗が激しくないか確認する必要があります。

操作

画面を回転させても問題が発生しないか

画面の回転に対して各Activityを縦固定にするか、横固定にするか、縦横自由にするか指定することができます。指定の抜け漏れがある可能性があるので、全画面で端末を回転させても問題ないか確認する必要があります。また縦画面と横画面で別々のレイアウトを指定することもできるので、配置しているコンポーネントの漏れはないか、操作時にエラーが発生しないか確認しなければいけません。

ハードウェアキー操作による想定外の挙動はないか

世の中にはガラケーライクなテンキーが付いている端末や、トラックボールが付いている端末などもあります。そのハードウェアキー操作によって「押せてはいけないところ」が押せてしまう場合があるので、1端末以上はテストする必要があります。

IMEアプリによって入力の動作に差異はないか

Android の IMEアプリはたくさんあります。OS独自のもの( Xperia標準搭載 の POBox Touch など)もあったりします。また手書き入力専用のもの( 7notes with mazec など)や独自の入力方式のもの( Google日本語入力の Godan キーボードなど )もあったりと、入力方法も様々です。アプリにテキスト入力が含まれている場合、どのようなIMEアプリでも正しく入力が行えるか確認する必要があります。とはいうものの、現実的にすべてのIMEアプリで試すことは無謀なので、「このIMEアプリでテストします」というようなエビデンスを予め決めておく必要があると思います。

Activityの破棄によって問題が発生しないか

Android はシステムのメモリが不足するとバックグランドで起動しているアプリのActivityを破棄してしまうことがあります。それによる想定外のバグが発生する可能性があります(変数が初期化されるなど)。Android 4.0 からは設定の「開発者向けオプション」の「アクティビティを保持しない」を有効にするとアプリがバックグラウンドにいったときに即座に破棄してくれるので、ぜひ有効活用しましょう。

レイアウト・デザイン

各画面解像度で正常に表示されるか

画面解像度は端末によって大きくグループ化されており、ldpi, mdpi, hdpi, xhdpi, tvdpi などに分けられています。その各解像度でレイアウトやアイコン、ボタンスキンなどが問題なく指定できているか確認する必要があります。最新機種はほとんど hdpi か xhdpi なので、確認項目が増えすぎるようでしたらアプリの対象端末を絞らなければいけないかも知れません。

設定変更によるレイアウトの崩れはないか

Android は設定からフォントサイズが変更できます。フォントサイズを sp 指定にしていると、設定内容によってアプリ側の文字サイズが変わってしまうので、レイアウトの崩れが発生することがあります。また多言語化対応している場合、文言の長さが変わってくるので日本語では一行で表示できるところも他の言語では表示できない場合があります。レイアウトによっては ScrollView を入れてスクロールできるようにする必要があるかも知れません。

ネットワーク

ネットワークの違いによる挙動の差異はないか

ネットワークの接続方法は、3G、LTE、Wi-Fiなど様々です。ネットワーク速度は環境によって極端に変化するので、開発時のネットワーク環境とユーザーのネットワーク環境はかなり差異があると思われます。実装によっては通信速度の違いによる挙動の差異が起こる可能性があるため、入念なテストが必要になります。

圏外などのネットワークの瞬断によって問題が発生しないか

データのダウンロード・アップロード中に圏外などでネットワークが瞬断されてしまうと、データが不正な状態でダウンロードされ、そのまま処理されてしまうなどの恐れがあります。また、ネットワークが繋がっているのにレスポンスが著しく遅延してしまうこともあります(3G回線などでよく発生します)。そのため、アプリが動作している様々な場面で「ネットワークを切断する」「電波の弱い場所に移動する」などといったテストは実施したほうが良いです。ネットワークを切断する簡単な方法は「機内モード」をオンにする、Wi-Fi接続をオフにするなどが挙げられます。

リリース

デバッグ版アプリになっていないか

Build.Debug を使うと「デバッグ時のみこの処理を行う」といった実装が可能ですが、eclipse の自動ビルドを有効にした状態でリリースビルドを行うとデバッグ版のアプリになってしまいます(SDKのバグかも知れません)。結合テストのときにはデバッグ時の処理が実行されていないか確認する必要があります(例えばアプリ起動時にログを出すなど)。

アップデートは正常に行えるか

アプリを更新版としてリリースするとき、リリースビルドのときの keystore が現行アプリの keystore と同一のものを使用していないとアップデートを行うことができません。現行のアプリがインストールされた状態で、新しいバージョンのアプリをアップデートとしてインストールできるか確認する必要があります。また versionName と versionCode が現行のアプリから更新されているか確認する必要もあります(現行アプリと同一だと GooglePlay へのアップロード時にエラーが発生します)。

対象端末は想定通りになっているか

AndroidManifest.xml にて対象端末(対象となる画面サイズや解像度など)指定が可能です。何も指定していない状態では全端末でインストールが可能になってしまうので、対象外の端末でアプリを使われてしまう可能性があります。対象端末を確認する簡単な方法は、マーケットに一度アップロードしてアプリ詳細を確認してみることです。対象端末の絞込みの方法はこちらにまとめてあるのでぜひ参考にしてください。

まとめ

アプリの種類によっては他にも注視したほうが良い確認項目は存在するとは思いますが、弊社の経験からチェックしたほうが良さそうな項目をリストアップしてみました。結合テストのテストケースをつくる上でぜひ参考にしていただければと思います。
端末固有のバグはどうしてもついてくるものですので、すべてのバグを取り切るのは難しいかも知れません。ですが、本記事にリストアップした確認項目のように、経験をベースに起こりうるパターンを見出すことはできます。
テストが不十分だと「ユーザーがテストする」という事態になってしまいます。Androidアプリは開発のしきいが低いぶん、そういうアプリを数多く見かけます。ユーザーレビューに上げられるバグによる酷評は、誰が見ても気持ちのよいものではありません。
リリース前にできる限りの最善は尽くし、ユーザーが気持ちよく使うことができる高品質なアプリを目指しましょう。