MoTLab -Mobility Technologies Engineering Blog-MoTLab -Mobility Technologies Engineering Blog-

UIテストを作ってFirebase Test Labで実行してみた話

行灯LaboAndroidテスト
December 24, 2018

💁🏻
※本記事は Mobility Technologies の前身である JapanTaxi 時代に公開していたもので、記事中での会社やサービスに関する記述は公開当時のものです。
An image from Notion

はじめに

JapanTaxiのアプリにはたくさんの機能があります。リリース前のテストは全て手動で行っているのですが、全部やるのは辛いのでUIテスト取り入れていきたいねというお話が出ました。今回はAndroidでUIテストをやってみた時のお話をします。

UIテストを作る

UIテストのフレームワークはいくつかありますが今回はEspressoを使います。シナリオとしてはアプリを起動→サインイン画面→乗車場所設定画面に遷移することにします。以下のようなコードを/src/androidTestフォルダ以下に置きます。


@RunWith(AndroidJUnit4::class)
class SplashActivityTest {

    @get:Rule val activityRule = ActivityTestRule(SplashActivity::class.java)
    
    @Test
    fun success_signIn() {
        val signInActivityMonitor = InstrumentationRegistry.getInstrumentation().addMonitor(SignInActivity::class.java.name, null, false)
        val pickupActivityMonitor = InstrumentationRegistry.getInstrumentation().addMonitor(PickupActivity::class.java.name, null, false)

        val signInActivity = signInActivityMonitor.waitForActivityWithTimeout(TimeUnit.SECONDS.toMillis(10))
        if (signInActivity != null) {
            onView(withId(R.id.email_address)).perform(click(), replaceText("example@gmail.com"))
                .perform(ViewActions.closeSoftKeyboard())
            onView(withId(R.id.password)).perform(ViewActions.typeText("example")).perform(ViewActions.closeSoftKeyboard())
            onView(withId(R.id.sign_in)).perform(click())
        } else {
            throw IllegalStateException("サインインに遷移していない")
        }

        val pickupActivity = pickupActivityMonitor.waitForActivityWithTimeout(TimeUnit.SECONDS.toMillis(10))
        if (pickupActivity != null) {
            onView(withId(R.id.bottom_sheet)).check(ViewAssertions.matches(isDisplayed()))
        } else {
            throw IllegalStateException("メイン画面に遷移していない")
        }
    }

}

サインインのActivityが起動してたらメールアドレス、パスワードをセットしてボタンを押して乗車場所設定画面に遷移するといったテストコードです。

Firebase Test Labで実行してみる

今回は「インストゥルメンテーション テストの実行」でテストを行っていきます。テストの設定でアプリのapkとテスト用のapkをセットします。テストのapkは ./gradlew assembledevDebugAndroidTest を叩くと作成できます。

An image from Notion

また複数の端末をまとめてテストすることもできます。

An image from Notion

試しに3つの端末をテスト実行してみると以下のようになりました。

An image from Notion

端末によって成功、失敗しているようです。まずは成功しているものをみてみましょう。

An image from Notion

パフォーマンスは以下のような感じです。

An image from Notion

どの辺でCPU, メモリが使われているかなどがわかります。

An image from Notion

あとは動画も見れます。

An image from Notion

動画を見ればわかりますが、アプリが起動してサインイン画面に遷移して乗車場所設定画面に遷移しているのがわかりますね。

次に失敗しているところをみてみましょう。

An image from Notion

上記を見ると該当するidがないよとのことで失敗しています。動画をみているとサインイン画面までは遷移できているのでidは検知できるはずですが、なぜこうなるのかわかってないので調べておきます。

まとめ

今回は「アプリを起動→サインイン画面→乗車場所設定画面に遷移する」のUIテストを行いました。他のシナリオも書いていけば手動でテストすることが減りますね。これからどんどんUIテストを取り入れていきたいです。

💁🏻
※本記事は Mobility Technologies の前身である JapanTaxi 時代に公開していたもので、記事中での会社やサービスに関する記述は公開当時のものです。

Mobility Technologies では共に日本のモビリティを進化させていくエンジニアを募集しています。話を聞いてみたいという方は、是非 募集ページ からご相談ください!