dely engineering blog

レシピ動画サービス「kurashiru」を運営するdelyのテックブログ

Firebase Test labでiOSアプリのUnitTestとUITestを行う

こんにちは!クラシルのiOSアプリ開発を行っているtakaoです。

今回はiOSアプリのテストの実行に関する内容です。

現在のクラシルのテスト運用は、Bitrise上でfastlaneのrun_testsというActionを使ってテストの定期実行を行っていますが、結果の確認がしやすい状態とは言えません。特にUITestに関しては画面を確認するために、必要な場合はローカルで実行したりしています。
そこで、何やらFirebaseが提供している Firebase Test lab(以下、Test lab) というサービスを使えば、テスト結果をスクリーンショットや動画で確認することが出来るということだったので、試してみました。
この記事ではTest labでiOSアプリのテストを行う方法とTest labを使うとどういう結果が得られるのかをご紹介します。

準備

Firebase プロジェクトを作成する

Test labを使うためにFirebaseプロジェクトの追加を行っておきます。

サンプルアプリの作成

ボタンを押すとアラートが表示されるだけのサンプルアプリを作成しました。

f:id:takaoh717:20190328184920p:plain:w200 f:id:takaoh717:20190401094519p:plain:w200

UnitTestを書く

簡単なテストを書きます。

func testExample() {
       let model = TestLabSampleModel()
       model.updateTitle(new: "test")
       assert(model.titleLabel == "test")
}

UITestを書く

こちらもボタンをタップしてアラートを閉じるだけの簡単なテストを書きます。 UI Recordingを使ってさっと書きました。

func testExample() {
    let app = XCUIApplication()
    app.buttons["Button"].tap()
    app.alerts["(^o^)"].buttons["close"].tap()
}

アプリのXCTestをビルドする

Test labを利用するためにはXCTestのビルドを行う必要があります。 ビルドされたXCTestを使って、UnitTestとUITestを行います。

XCTest Apple公式ドキュメント

① DerivedData格納場所を確認・変更(任意)

公式のドキュメントの手順では「プロジェクトの Derived Data の場所を構成する」が必要だと説明されていますが、こちらの設定は任意です。 Test labを頻繁に利用する場合に、ビルドされたファイルにアクセスしやすいようにするための設定なので、初回の場合やCIなどでテストを自動化する場合は不要です。

② テストファイルをビルドする

Xcode上でXCTestのビルドを行います。
ナビゲーションから【Product】→【Build For】→【Testing】の順に選択します。

③ アップロード用にテストファイルを圧縮する

Test labにアップロードするために、必要なファイルをまとめて圧縮します。
ファイルはDerivedDataの中にありますが、Xcodeから簡単にアクセスできます。
【File】→【Workspace Settings...】の順に進んで、DerivedDataの箇所にある矢印ボタンをクリックすると、Finderが開きます。

f:id:takaoh717:20190328183523p:plain:w200

その中から以下のファイルを選択して圧縮します。

  • Debug-iphoneos
  • PROJECT_NAME_iphoneosDEVELOPMENT_TARGET-arm64.xctestrun

Firebaseコンソールでテストを実行する

Test labのコンソール画面で圧縮したファイルをアップロードします。
アップロードが完了するとテストの設定を選択する画面になります。

端末の選択

端末のバリエーションが豊富で、タブレットを選択することも出来ます。

f:id:takaoh717:20190327193416p:plain:w300f:id:takaoh717:20190327193451p:plain:w300

画面の向きやロケールも選択可能になっているため、横画面に対応しているアプリや多言語対応アプリなどは全部のパターンを手動でテストするのは大変なので嬉しいと思います。

f:id:takaoh717:20190327193612p:plain:w500

利用可能な端末の種類とOSについても随時更新されていくようです。

Available devices in Test Lab

テスト結果を確認する

テスト結果はこのような感じで表示されます。

f:id:takaoh717:20190327193715p:plain:w400 

サンプルアプリだとスクリーンショットの情報が出なかったため、クラシルのアプリで試してみました。 テスト結果は実行した端末・OSごとに確認することが出来ます。

iPhoneSE

f:id:takaoh717:20190328163743p:plain:w400

iPhoneX

f:id:takaoh717:20190328163800p:plain:w400

また、UITestを動画タブで実行している際の動画を確認することが出来ますが、こちらはかなりざっくりしたコマ送り動画のような状態になっており、さらに、全てのテストの結果が一つの動画にまとめられているので、テストの数が多い場合は確認が難しそうです。。。

f:id:takaoh717:20190401101620g:plain:w200

Firebaseコンソール以外での実行方法

Bitriseでテストを実行する

今回は確認していませんが、BitriseのWorkflowを使用すると、簡単にテストの実行が出来るようです。 実行結果もちゃんとBitrise上で確認出来るようになっているので、Bitriseを導入しているプロダクトの場合はこっちを使うのが良さそうです。

Device testing for iOS - Bitrise DevCenter

f:id:takaoh717:20190327192859p:plain
Bitrise画面

gcloud コマンドラインでテストを実行する

こちらも今回は試していませんが、CLI上でテストを実行することも出来るみたいです。 実行結果はFirebaseのコンソール上で確認出来ます。Firebaseのコンソール画面で確認したい場合はCLIを使って定期実行するのが良いかもしれません。

まとめ

Firebaseのサービスはアプリに設定ファイルやSDKを追加しないといけないものが多いですが、Test labに関してはプロジェクトの追加を行うだけで他に特別なことをしなくて良いため、比較的導入がしやすいと思います。 また、端末の種類が充実していたり、画面の向きやロケールなどの設定を変更したりなども容易に出来るのが良かったです。 Bitriseを使えばCI環境でもすぐに導入できると思うので、テスト実行を行うための環境をまだ作っていないプロジェクトなどでは役立つと思います、ぜひお試しください。