Menguji fragmen aplikasi Anda

Fragmen berfungsi sebagai penampung yang dapat digunakan kembali dalam aplikasi Anda, memungkinkan Anda menyajikan tata letak antarmuka pengguna yang sama dalam berbagai aktivitas dan konfigurasi tata letak. Dengan keserbagunaan fragmen ini, sangatlah penting untuk memvalidasi bahwa fragmen tersebut memberikan pengalaman yang konsisten dan efisien akan resource:

  • Tampilan fragmen harus konsisten di seluruh konfigurasi tata letak, termasuk yang mendukung ukuran layar yang lebih besar atau orientasi perangkat lanskap.
  • Jangan membuat hierarki tampilan fragmen kecuali jika fragmen tersebut terlihat oleh pengguna.

Dokumen ini menjelaskan cara menyertakan API yang disediakan framework dalam pengujian yang mengevaluasi perilaku setiap fragmen.

Mengalihkan status fragmen

Guna membantu menyiapkan kondisi untuk melakukan pengujian ini, AndroidX menyediakan library, FragmentScenario untuk membuat fragmen dan mengubah statusnya.

Mendeklarasikan dependensi

Untuk menggunakan FragmentScenario sebagaimana dimaksudkan, definisikan artefak pengujian fragmen dalam APK pengujian aplikasi Anda seperti yang ditampilkan dalam cuplikan kode berikut:

app/build.gradle

    dependencies {
        def fragment_version = "1.2.4"
        // ...
        debugImplementation 'androidx.fragment:fragment-testing:$fragment_version'
    }
    

Untuk menampilkan versi saat ini library ini, lihat informasi tentang Fragmen pada halaman versi.

Membuat fragmen

FragmentScenario mencakup metode peluncuran jenis fragmen berikut:

Metode ini juga mendukung jenis fragmen berikut:

  • Fragmen grafis, yang berisi antarmuka pengguna. Untuk meluncurkan jenis fragmen ini, panggil launchFragmentInContainer(). FragmentScenario akan menyertakan fragmen ke pengontrol tampilan root aktivitas. Aktivitas penampung ini bernilai kosong.
  • Fragmen non-grafis (kadang disebut sebagai fragmen headless), yang menyimpan atau menjalankan pemrosesan jangka pendek atas informasi yang disertakan dalam beberapa aktivitas. Untuk meluncurkan jenis fragmen ini, panggil launchFragment(). FragmentScenario menyertakan jenis fragmen ini ke aktivitas yang sepenuhnya kosong dan tidak memiliki tampilan root.

Setelah meluncurkan salah satu jenis fragmen ini, FragmentScenario akan mengalihkan fragmen yang sedang diuji ke status RESUMED. Status ini akan menunjukkan bahwa fragmen sedang berjalan. Jika diuji, fragmen grafis juga akan terlihat oleh pengguna, sehingga Anda dapat mengevaluasi informasi tentang elemen UI-nya menggunakan pengujian UI Espresso.

Cuplikan kode berikut menunjukkan cara meluncurkan setiap jenis fragmen:

Contoh fragmen grafis

    @RunWith(AndroidJUnit4::class)
    class MyTestSuite {
        @Test fun testEventFragment() {
            // The "fragmentArgs" and "factory" arguments are optional.
            val fragmentArgs = Bundle().apply {
                putInt("selectedListItem", 0)
            }
            val factory = MyFragmentFactory()
            val scenario = launchFragmentInContainer<MyFragment>(
                    fragmentArgs, factory)
            onView(withId(R.id.text)).check(matches(withText("Hello World!")))
        }
    }
    

Contoh fragmen non-grafis

    @RunWith(AndroidJUnit4::class)
    class MyTestSuite {
        @Test fun testEventFragment() {
            // The "fragmentArgs" and "factory" arguments are optional.
            val fragmentArgs = Bundle().apply {
                putInt("numElements", 0)
            }
            val factory = MyFragmentFactory()
            val scenario = launchFragment<MyFragment>(fragmentArgs, factory)
        }
    }
    

Membuat ulang fragmen

Jika perangkat kekurangan resource, sistem mungkin akan merusak aktivitas yang berisi fragmen Anda, mengharuskan aplikasi Anda untuk membuat ulang fragmen saat pengguna kembali ke aplikasi Anda. Untuk menyimulasikan situasi ini, panggil recreate():

    @RunWith(AndroidJUnit4::class)
    class MyTestSuite {
        @Test fun testEventFragment() {
            val scenario = launchFragmentInContainer<MyFragment>()
            scenario.recreate()
        }
    }
    

Jika class FragmentScenario membuat ulang fragmen yang sedang diuji, fragmen tersebut akan kembali ke status siklus proses yang telah ada sebelum dibuat ulang.

Mengalihkan fragmen ke status baru

Dalam pengujian UI aplikasi, Anda hanya perlu meluncurkan dan membuat ulang fragmen yang sedang diuji. Namun, dalam pengujian unit yang lebih terperinci, Anda mungkin juga akan mengevaluasi perilaku fragmen saat transisi dari satu status siklus proses ke yang lain.

Untuk mengalihkan fragmen ke status siklus proses yang berbeda, panggil moveToState(). Metode ini mendukung status berikut sebagai argumen: CREATED, STARTED, RESUMED, dan DESTROYED. Tindakan ini akan menyimulasikan situasi ketika aktivitas yang berisi fragmen Anda mengubah statusnya karena terganggu oleh aplikasi lain atau tindakan sistem.

Contoh penggunaan moveToState() akan ditampilkan dalam cuplikan kode berikut:

    @RunWith(AndroidJUnit4::class)
    class MyTestSuite {
        @Test fun testEventFragment() {
            val scenario = launchFragmentInContainer<MyFragment>()
            scenario.moveToState(State.CREATED)
        }
    }
    

Memicu tindakan dalam fragmen

Untuk memicu tindakan dalam fragmen yang sedang diuji, gunakan matcher tampilan Espresso untuk berinteraksi dengan elemen dalam tampilan Anda:

    @RunWith(AndroidJUnit4::class)
    class MyTestSuite {
        @Test fun testEventFragment() {
            val scenario = launchFragmentInContainer<MyFragment>()
            onView(withId(R.id.refresh))
                    .perform(click())
        }
    }
    

Jika Anda perlu memanggil metode pada fragmen itu sendiri, seperti menanggapi pilihan di menu opsi, Anda dapat melakukannya secara aman dengan mengimplementasikan FragmentAction:

    @RunWith(AndroidJUnit4::class)
    class MyTestSuite {
        @Test fun testEventFragment() {
            val scenario = launchFragmentInContainer<MyFragment>()
            scenario.onFragment(fragment ->
                fragment.onOptionsItemSelected(clickedItem) {
                    // Update fragment's state based on selected item.
                }
            }
        }
    }
    

Menguji tindakan dialog

FragmentScenario juga mendukung pengujian dialog. Meskipun dialog adalah instance fragmen grafis, gunakan metode launchFragment() agar elemen dialog diisikan ke dalam dialog itu sendiri, bukan dalam aktivitas yang meluncurkan dialog.

Cuplikan kode berikut akan menguji proses penutupan dialog:

    @RunWith(AndroidJUnit4::class)
    class MyTestSuite {
        @Test fun testDismissDialogFragment() {
            // Assumes that "MyDialogFragment" extends the DialogFragment class.
            with(launchFragment<MyDialogFragment>()) {
                onFragment { fragment ->
                    assertThat(fragment.dialog).isNotNull()
                    assertThat(fragment.requireDialog().isShowing).isTrue()
                    fragment.dismiss()
                    fragment.requireFragmentManager().executePendingTransactions()
                    assertThat(fragment.dialog).isNull()
                }

                // Assumes that the dialog had a button
                // containing the text "Cancel".
                onView(withText("Cancel")).check(doesNotExist())
            }
        }
    }