OpenSTFでAndroid端末のリモートテストを簡単にする

アイスタイルAdvent Calenderの4日目の記事です。

Androidエンジニアをしているverysleepygoatです。
2018年11月に入社し、@cosmeのAndroidアプリや、iOS/AndroidアプリのバックエンドAPIの開発を担当しています。

新型コロナウイルスの影響で、当たり前のように毎日オフィスに通うという働き方に変化が生まれました。
アイスタイルでも原則在宅勤務になるなど、様々な変化がありました。
議題は色々ありますが、ここではAndroidエンジニアとしての話をしたいと思います。

「Android端末持ってないです」問題

「アプリの改修が終わりました。テストをお願いします!」
「iPhoneは自分のものがあるんですが、Androidは持っていなくて……」
「ぐぬぬ」

在宅勤務が始まってから、幾度となく同じやり取りを繰り返しました。
どういうわけか、弊社ディレクター・デザイナー陣はiPhoneユーザーが大多数を占めています。(以下、とあるテスト実施時の所持端末一覧。none…)

同じ境遇のAndroidエンジニアも、世の中にはたくさんいるのではないかと思います。

Androidアプリの動作確認をするのに毎回出社しなければならないというのは、新型コロナの状況を踏まえると難しい面があります。
かといって、検証端末の数に限りがあるため、全員がAndroid端末を持ち帰るのは現実的ではありません。また、複数端末や複数OSでのテストをどうするかといった問題も出てきます。

そこで登場するのが、記事タイトルにもある OpenSTF です。

OpenSTFとは

OpenSTF https://github.com/DeviceFarmer/stf

STFは Smartphone Test Farm の略で、PCにつないだAndroid実機を操作することができるWebアプリケーションです。
ロック解除、タップ、長押し、スワイプ、文字入力など一通りの操作が可能です。
Android実機のroot権限は不要で、OpenSTFを動かしているPCにUSBケーブルで繋げばすぐ使えるようになります。

弊社では、iMacに検証端末5台を接続し、在宅勤務下でもAndroid7~9の検証ができるようになりました。Android 10ももうすぐ用意できる予定です。

セットアップ

docker_compose.yml

version: '2'
services:
  db:
    image: rethinkdb
    command: rethinkdb --bind all
    restart: always
    ports:
      - 8082:8080
    volumes:
      - db_data:/data
  stf:
    image: devicefarmer/stf
    ports:
      - 7100:7100
      - 7110:7110
      - 7400-7700:7400-7700
    links:
      - db
    environment:
      - RETHINKDB_PORT_28015_TCP=tcp://db:28015
      - RETHINKDB_ENV_DATABASE=stf
    restart: always
    command: stf local --no-cleanup --allow-remote --public-ip xxx.xxx.xxx.xxx --adb-host docker.for.mac.localhost --auth-options '["--use-basic-auth", "--basic-auth-username", "username", "--basic-auth-password", "password"]'
volumes:
  db_data:

あとはブラウザで http://xxx.xxx.xxx.xxx:7100/ を開くだけです。
いくつかポイントだけ。

  • stf local
    きちんとやるなら ドキュメント に従うべきとは思いつつ、とりあえずこれで運用しています。
    stf localだと各種パラメータを弄るのが限定的になるので、細かいチューニングをしようとすると難しいのかなと思います。
    弊社では約半年以上このまま運用していますが、今のところは大きな問題にはなっていません。

  • –adb-host docker.for.mac.localhost
    Macで動かす場合、Dockerのadbだと正常動作しないため、Mac側のadbを使うようにしています。
    ホストPCがMac以外なら、adb部分もDockerにできるようです。

  • Macでの動作について
    今のところ問題は起きていませんが、READMEには以下のような記述があります。

    Note that while Mac OS can be used for development, it doesn’t provide a very reliable experience in production due to (presumed) bugs in ADB’s Mac OS implementation. We use CoreOS but any Linux or BSD distribution should do fine.

Chrome DevToolsは使える?

先日デザイナーから相談を受けて調べたところ、簡単に使うことができました。
OpenSTFの画面「Remote ~」にadb接続用のコマンド adb connect xxx.xxx.xxx.xxx:xxxx があるので、これを自分のPC上で実行すれば、adb接続が完了します。
あとは、USBケーブルで端末をつないだ場合と同様に chrome://inspect を開くだけです。

DevToolsの詳細については、こちらの記事を参照ください。
Webページ(Android端末)のデバッグの話:フロントエンド リモートワーク編

見えてきた課題

実際に運用してみると、いくつか課題が出てきました。掻い摘んで紹介します。

3台の検証端末をiMacに接続 → 数日後、3台中1台の霊圧が消える

3台の検証端末で運用を始めた数日後、突如1台が切断状態になりました。
リモートデスクトップでiMacを操作し、adbコマンドを実行するも、やはり霊圧はない。
こうなったらリモートでは何もできないので、物理出社が必要になります。

結論としては、給電不足によるバッテリーが干からびてました。悲しみ。

何台までいけるか、というのは環境依存になってしまうので、解決策としては「給電ができるUSBハブを用意する」が無難です。
READMEにスコアが載っています。
https://github.com/DeviceFarmer/stf#usb-hubs

弊社で購入したものはこちらですが、現在は購入できないようです。
Plugable USB 2.0 HighSpped 7 ポート急速充電ハブ、60ワット電源付、全7ポートで充電可能

「なんか重いんですけど……」

数日、あるいは数週間そのままにしておくと、段々Android端末の挙動がもっさりしてきます。
これは、非常に言いづらいことですが、OpenSTFのせいではありません。単純にAndroid端末が遅いだけでした。
定期的に再起動をしてあげることで多少緩和します。

なお、リモートで再起動する場合、再起動後に自動的にadb接続が復活しない端末があるため注意が必要です。
(弊社検証端末も、再起動後にロック解除しないとadb接続が復活しない)

最後に

OpenSTFについて紹介させていただきました。割と簡単に環境構築できるので、「Android端末持ってないです」に困っているAndroidエンジニアさんはぜひ試してみてください。

@cosmeアプリ、ゲートウェイAPIについては過去記事もありますのでぜひご覧ください。
そしてもし興味を持っていただけたなら、ぜひ!一緒に働きましょう!

中途採用 | istyle 株式会社アイスタイル

@cosmeのAndroidアプリと、@cosmeアプリ用ゲートウェイAPIの開発を担当しています。