Remote TestKit + React Native + Expo(EAS build)で実機デバッグを加速する

この記事は、「Qiita Engineer Festa 2022」に参加するために執筆した記事です。

https://qiita.com/official-events/f0e8b25feb05af6326b3

# TL;DR
* リモートで実機テストができるRemote TestKitを使ってみた
* React Native + expoだと実機デバッグが手間な面もあるが、EAS buildでapkを作成してRemote TestKitと組み合わせるとサクッと実機で確認できる。
* リモートだけでなく自分で持っている端末も同様に操作が可能なので、画面キャプチャや録画が簡単になる。
* React NativeのようなIDEを使わない開発とRemote TestKitを組み合わせるととても便利。

# 挨拶と前置き
こんにちは、[株式会社dott](https://thedott.io/)でエンジニャー🐱をしているHALと申します。

会社ではWEBエンジニャーとして働いていますが、プライベートで個人開発をしており、そちらではReact Nativeを用いたスマホアプリ開発を主にやっています。

https://twitter.com/HAL1986____/status/1281795884842270722?s=20&t=irNzj_Jw9c9VDg4qJb2Ajw

React NativeではiPhone / Androidのアプリを（ほぼ）同一のソースコードから作れるのが魅力なわけですが、どうしてもiPhoneとAndroidでは動作や表示が異なる部分が出てきます。
そのため、シミュレーターや実機での動作の確認が必要になるのですが、実機の確認が少し問題になります。
当然ながらいくつかの機種で動作の確認をしたいわけですが、手元にそんなにたくさんの端末はありません。
また、端末が複数あったとしても、それぞれにテスト用のアプリをインストールするだけでも手間がかかります。

そんなわけで、正直なところアプリの動作確認は自分で持っている一部の端末のみで、ほとんど実機確認はできていないのが現状です。
今回、Remote TestKitというサービスの存在を知りましたので、その実機確認の部分について、改善できないか試してみようと思います。

# Remote TestKitとは
ネットワーク経由で**実機上で**アプリなどの動作の検証を行えるサービスです。
GoogleのFirebaseで提供されているFirebase Test Labと同様のものになりますが、Remote TestKitは圧倒的な対応機種・バージョンの多さが魅力です。

* Firebase Test Lab：Androidのみ65種類、多いもので８つのOSバージョン（ほとんどが１バージョンのみ提供）
* Remote TestKit：iOS / Androidの全部で1000以上の機種×OSの組み合わせ

ほとんど無い組み合わせは無いと思っていいくらいのラインナップです。
これなら、一部のユーザーでしか発生しないような不具合であっても、対象の端末を借りて再現試験などが実施できますね。

また、Firebase Test Labは基本的には自動テストから利用することを想定していますが、Remote TestKitでは、PCからスマホの画面を見ながら操作することが可能です。
そのため、テストを作るのは難しいような手の混んだパターンなどを画面上で確認していくことも可能です。
さらに、画面キャプチャや画面録画もPC上でそのまま実施できるため、実機でキャプチャしたものを転送する、といった操作も不要になります。

当然ながら自動テストと連携してのテスト実行も可能ですが、何よりも**柔軟に多くの実機を利用できる**、というところがRemote TestKitの強みではないかと思います。

# Remote TestKitのソフトウェア版をインストールする

Remote TestKitにはインストール不要なWeb版とソフトウェア版があります。
[機能的な違い](https://appkitbox.com/testkit/spec/#feature-013)がいくつかありますが、Web版はソフトウェア版の一分機能が使えないという感じになります。
基本的にはソフトウェア版を選び、どうしてもインストールができない環境の場合にはWeb版を使う、と考えれば良いと思います。



ソフトウェア版のダウンロードは以下の画面から行います。

https://appkitbox.com/testkit/download/

Windows版とMac版がありますので必要な方をダウンロードしてインストールします。
ちなみに自分はMac版ですが、M1で動作するかどうかは確認できませんでした。

とりあえず起動するとこんな画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571256/d535003f-41c7-5fc6-9ab8-d729b3eb0914.png)

上の空いているエリアが今自分が使える端末（レンタルした端末＋USB接続している手元の端末）になります。
下に大量に表示されているのがレンタル可能な端末のリストです。
「レンタル状況」が「利用可」になっていればレンタルできます。
「オフライン」や「レンタル中」はレンタルできないので時間を空けて確認してみましょう。

まずは左下の「ログイン」からログインすることでレンタルできる状態になります。
※今回はトライアル用のアカウントを払い出してもらいました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571256/0cc870b1-59e4-8a58-fe3f-987a1f757fc0.png" width="500" />

# 端末をレンタルしてみる

端末の一覧は各項目でソートも可能なので、発売日の降順などで並び替えて目当ての端末を探してみます。
（やはり、新しい端末はレンタル中や要人気端末パック対象のものが多かったです）

レンタルしたい端末が見つかったら、対象をダブルクリックすると、レンタルダイアログがポップアップします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571256/be048823-6476-b5c7-f0af-3c4ad025db79.png" width="400" />

ここで利用時間を選択して「レンタル」をクリックすればレンタルできてしまいます。
レンタルされると、上のエリアに対象の端末が表示されるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571256/bc128b0e-0299-e5d2-659b-139e8d8f1d75.png)

また、使用する準備が整うと、端末の画面が表示されます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571256/9205f8fc-e298-aa83-7dc6-8c182372c672.png" width="400" />

あとはもうこの画面をマウスでドラッグしたりクリックしたりすれば、実際に実機を動かすことができる、というわけです。

![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571256/d3dfd768-cd10-3e03-ca7d-98f711602ec0.gif)

動かしてみた感想としては、ネットワーク越しなので若干のもたつきは感じるものの、全然問題のないレベルと言えます。
なんならエミュレータの方がもたつくときもあるので、こちらのほうがサクサクできるくらい・・・。

# React Native + Expo（EAS build）で作ったアプリを動かしてみる

## インストール用ファイルの準備
続いて、実際にReact Nativeで作成したアプリを動かしてみましょう。
React Nativeで作ったアプリをEAS buildでビルドした場合、Expoのサイトからビルドしたアプリをダウンロードすることができます。

https://expo.dev/

ビルド結果の画面の「Download」ボタンからダウンロードすることが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571256/8f28c951-3e7a-9a24-b734-1c45d717dcdd.png)

iPhoneの場合はここからダウンロードしたファイルをそのままインストールが可能です。
ただ、Androidの場合はここでダウンロード可能なのは（標準では）AABファイルになります。
残念ながらRemote TestKitはAPKファイルでのインストールが必要なのでこのファイルは使用できません。
そこで、EAS buildでビルドだけでなくPlay StoreへのSubmitまでやってしまい、Play Consoleからダウンロードしましょう。

※EAS buildでReact NativeアプリをBuild & Submitする方法については、こちらなど参考にしてください。

https://zenn.dev/hal1986/articles/20211225-eas-build-and-submit

Play ConsoleでのAPKファイルのダウンロードは以下のような手順です。

![タイトルなし２.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571256/42addf16-e31e-2fba-fd1a-6a18d9a0f037.gif)

1. EAS Submitすると「内部テスト」に登録されるので、「内部テスト」を開きます
1. 「リリースの詳細を表示」をクリックします
1. 「新しいApp Bundle」の→アイコンをクリックします
1. 「ダウンロード」タブを開きます。
1. 「署名済みのユニバーサル APK」のダウンロードアイコンをクリックします。

これでAABファイルから作成されたAPKファイルをダウンロードできます。

もちろん、Android Studioなどでローカルでビルドしたファイルを使用しても構いません。
ただ、Expo Managed Workflowの場合は、クラウドビルドだとIDE不要でビルドできてしまうので、自分はそちらの方が好きです。

## 端末へのインストール

端末へのインストールは簡単です。
端末の表示されているウインドウの「アプリ」をタップして、ダウンロードしたAPKファイルを選択してやります。
インストールを始めるとアップロード画面が表示され・・・

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571256/9205f8fc-e298-aa83-7dc6-8c182372c672.png" width="400" />

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571256/9667d2fd-44a1-0171-394b-fd5ccc09c94b.png" width="400" />

インストールが完了するとアプリが起動します。
メニューを見てもアプリのアイコンがちゃんと表示されています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571256/b7616259-5ecc-56f3-61f9-54eab7bdabb6.png" width="400" />

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571256/1eebaea8-0997-7a96-6671-bfa82d063740.png" width="400" />

サクッと終わってしまいました。
あとは借りている時間をたっぷり使って動作確認ができますね。

# 手元の端末にRemote TestKitで繋ぐ
もう一つ、個人的には目玉機能なのでは？と思っているのが、手元にある端末をRemote TestKitで接続できる機能です。
PCとスマホをデータ転送可能なUSBで接続するだけで、Remote TestKitが端末を検出して接続してくれます。
うまく認識すると、上の一覧に「端末の場所」が「USB」として表示されます。

![スクリーンショット 2022-07-14 22.53.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571256/87e68cc9-a1d9-ef92-21a9-064495484842.png)

さらに端末の画面表示も起動します。
（自分の環境だとなぜかウインドウが２つ表示されてしまいますが、一つ閉じれば特に問題はありませんでした）

こちらは手元の端末とPC画面上の表示を並べたものです。
かなりサクサクと表示されますし、操作はPC側で行っていますが、実機側もレスポンス良く動いています。

![タイトルなし3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571256/e2c46ea3-ea8f-92c6-d416-fb2ec12b5db8.gif)

この状態で一番嬉しいのが、「実機側を操作した結果をPC側にも表示できる」という点です。
操作している画面の録画をしたいという場合に、実機側で録画してPCに転送する、という方法でもいいですが、若干手間です。
また、実機での録画機能はiPhoneではかなり前の機種から使えますが、Androidの場合はAndroid 11以降でないと標準では使えません。
僕の持っているOppo AX7も画面キャプチャは可能ですが、画面録画はできない機種になります。
しかし、Remote TestKitだと、PC側で画面の録画が可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/571256/fbc8e8b1-b4b7-2210-6ae5-a5d3f8a9d434.png)

メニューの「記録」から「録画開始」を選ぶことで端末の画面の動画を取ることができます。
つまり、PC上で録画を開始して、実際の操作は実機の方を指で動かして録画する、といったことが可能なわけです。

どうしてもPCのシミュレータ等で録画をすると、マウス＆キーボードでの操作になるため、実際の実機の操作とは異なる操作になってしまうことがあります。
しかしこの方法の場合、録画はPC側で行うものの、操作は実際に利用する場合とどうように行っているところを取ることができます。
さらに録画結果の転送も不要なので手間が軽減されます。
これは結構嬉しいんじゃないかなぁと個人的には思っています。

また、リモートの端末をレンタルした場合も、手元の端末を利用する場合も、同じインターフェースで確認ができるため、自動化を行うようなときにもメリットがあります。
リモートの端末は自動化できるけど、手元の端末は自動化できない、みたいなことになると、せっかく手元にあるのにもったいないです。
そういった問題もRemote TestKitなら解消してくれます。

何より、レンタルはお金がかかりますが、手元の端末はユーザー登録も不要で、**ソフトウェア版をインストールしさえすれば無料で利用**することができます。
NTTレゾナントさん的には困るかもしれませんが、これを活用しない手はないと思います。
「ちょっとレンタルするにはお金がなぁ・・・」と思うような方も、一度ソフトをダウンロードして手元の端末で何ができるか、確認してみてもいいと思います。

# 終わりに
Remote TestKitに触ってみて、さらにReact Nativeで作成したアプリをインストールしてみることができました。
Remote TestKitはとても簡単に導入できてしまうので、どうしても用意できない端末でバグが出ているらしい、というようなときに重宝しそうです。

また、React Nativeはその仕組み上IDEを使用せずに開発をすすめることができます。
実機での動作確認に関してはIDEを繋ぐかExpo Goアプリを利用する必要があったりしましたが、EAS buildでビルドしたアプリをRemote TestKitからインストールすることで（クラウドビルドで時間はむしろ増加しますが）手間は軽減可能なことがわかりました。
個人的にはIDE起動せずに開発が完結できるというのがちょっとうれしいです。

サービスの特性上個人開発で採用することはなかなか難しいですが、業務等でスマホアプリ開発をしているような場合、実機での確認作業の負荷を軽減することができるRemote TestKitは、価格相応の価値を提供してくれるサービスだなと感じました。