The Android Developer Challenge is back! Submit your idea before December 2.

Menguji fragmen aplikasi Anda

Fragmen berfungsi sebagai penampung yang dapat digunakan kembali dalam aplikasi, yang 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.

Mengubah status fragmen.

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

Mengonfigurasi lokasi artefak pengujian

Untuk menggunakan FragmentScenario seperti yang diinginkan, tentukan artefak pengujian fragmen di APK pengujian aplikasi Anda, seperti yang ditunjukkan dalam cuplikan kode berikut:

app/build.gradle

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

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

Membuat fragmen

FragmentScenario menyertakan metode untuk meluncurkan jenis fragmen berikut:

Metode ini juga mendukung jenis fragmen berikut:

  • Fragmen grafis, yang berisi antarmuka pengguna. Untuk meluncurkan jenis fragmen ini, panggil launchFragmentInContainer(). FragmentScenario melampirkan 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 melampirkan jenis fragmen ini ke aktivitas yang sepenuhnya kosong, yang tidak memiliki tampilan root.

Setelah meluncurkan salah satu jenis fragmen ini, FragmentScenario mengganti status fragmen yang sedang diuji ke RESUMED. Status ini 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 memiliki sedikit resource, sistem mungkin mengakhiri aktivitas yang memuat fragmen Anda, yang mengharuskan aplikasi 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()
        }
    }
    

Saat class FragmentScenario membuat fragmen yang sedang diuji, fragmen akan kembali ke status siklus prosesnya sebelum dibuat ulang.

Mengubah status fragmen ke yang baru

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

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

Contoh penggunaan moveToState() terlihat 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 perlu memanggil metode pada fragmen itu sendiri, seperti merespons pemilihan pada menu opsi, Anda dapat dengan aman melakukannya dengan menerapkan 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 merupakan instance dari fragmen grafis, gunakan metode launchFragment() sehingga elemen dialog diisi dalam dialog itu sendiri, bukan dalam aktivitas yang meluncurkan dialog.

Cuplikan kode berikut 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())
            }
        }
    }