Android Emulator を使ってユーザ環境に近い状況でテストを実行する

概要

Android Emulator には CPU や Network に制限を加える機能が提供されており、高速なマシン上でもユーザ環境に近い状態でテストを実行することが出来る。 CI サーバ上でユーザ環境に近い状態のテストを実行することによって、低速で劣悪な環境でしか再現しない不具合を素早く見つけることが出来るだろう。

なぜ Emulator を遅くするのか?

開発者は、手元で実行する自動テストは早く動作すればするほど良いと考えている。その為に、高速なエミュレータや高速なマシン、高速なインターネットを利用して開発・テストを行なっている。

だが、現実世界の携帯端末やネットワークはそんなに早くない。ユーザはスペックの低い携帯端末を使い、劣悪な通信環境でアプリケーションを実行している。

開発者が日頃からスペックの高い環境でアプリケーションを開発していると、実際にユーザが利用する環境ではアプリケーションが上手く動作しないことがある。また、不具合にならなくともストレスフルなアプリケーションになってしまうことがある。その為、多くの開発者は "検証用端末" というスペックの悪い端末を用意したり、あえて通信環境の悪い状況を作ってテストを行なっている。

ユーザにとってそうであるように、開発者にとって劣悪なスペックや通信環境での作業は非常にストレスフルであり、開発効率が著しく低下する。そのような事情があり、大抵は "検証用端末" が利用されるのはリリース直前などであることが多い。

しかし、リリース直前に、劣悪な環境でのみ発生する不具合を見付けた場合どうするだろうか。大抵はクリティカルな状態 (アプリケーションが落ちる・ユーザデータが壊れる) にならないのならば無視するだろう。ユーザにエラーメッセージを通知するよう改修すれば良い方である。

こういった場合に有用なのが Jenkins といった CI サーバである。しかし、開発者が手元で実行するテストと同様に CI サーバ上のテストも高速に終わることが好ましいので、 CI サーバは高速なマシンを利用し、高速なインターネットのある環境で動作しているだろう。そのような場合でも、低スペックで劣悪な環境を再現する方法が Android Emulator では提供されている。

CPU を遅くしたい

emulator -cpu-delay <delay>
  • には 0-1000 の整数を指定することができる
    • 数値が大きいほど CPU は遅くなる
  • CPU をどの程度遅くするかという相対的な指定
    • 実行するホストマシンの性能に依存する
  • delay の指定によって Emulator の起動が遅い場合は snapshot をつかうようにすると良い

ネットワークのレイテンシを遅くしたい

emulator -net-delay <delay>

ネットワークの速度を遅くしたい

emulator -net-speed <speed>