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

Membuat Pengujian Unit Berinstrumen

Pengujian unit berinstrumen adalah pengujian yang berjalan pada perangkat fisik dan emulator, serta dapat memanfaatkan API framework Android dan API pendukung, seperti AndroidX Test. Pengujian berinstrumen memberikan lebih banyak fidelitas daripada pengujian unit lokal, tetapi pengujian ini berjalan jauh lebih lambat. Oleh karena itu, sebaiknya gunakan pengujian unit berinstrumen hanya dalam kasus di mana Anda harus menguji perilaku perangkat nyata. AndroidX Test menyediakan beberapa library yang memudahkan penulisan pengujian unit berinstrumen saat diperlukan. Misalnya, class Android Builder memudahkan pembuatan objek data Android yang sulit untuk dibuat.

Catatan: Jika pengujian Anda mengandalkan dependensi Anda sendiri, sediakan dependensi palsu atau tiruan Anda sendiri menggunakan framework tiruan, seperti Mockito.

Menyiapkan lingkungan pengujian Anda

Dalam project Android Studio, Anda harus menyimpan file sumber untuk pengujian berinstrumen di module-name/src/androidTest/java/. Direktori ini sudah ada saat Anda membuat project baru dan berisi contoh pengujian berinstrumen.

Sebelum memulai, Anda harus menambahkan AndroidX Test API, yang memungkinkan Anda membuat dan menjalankan kode pengujian berinstrumen dengan cepat untuk aplikasi Anda. AndroidX Test menyertakan runner pengujian JUnit 4 (AndroidJUnitRunner) dan API untuk pengujian UI fungsional (Espresso dan UI Automator).

Anda juga harus mengonfigurasi dependensi pengujian Android untuk project Anda untuk menggunakan runner pengujian dan API aturan yang disediakan oleh AndroidX Test. Untuk menyederhanakan pengembangan pengujian, sebaiknya sertakan juga library Hamcrest, yang memungkinkan Anda membuat pernyataan yang lebih fleksibel menggunakan API Hamcrest matcher.

Di file build.gradle tingkat teratas aplikasi, Anda harus menentukan library ini sebagai dependensi:

    dependencies {
        androidTestImplementation 'androidx.test:runner:1.1.0'
        androidTestImplementation 'androidx.test:rules:1.1.0'
        // Optional -- Hamcrest library
        androidTestImplementation 'org.hamcrest:hamcrest-library:1.3'
        // Optional -- UI testing with Espresso
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
        // Optional -- UI testing with UI Automator
        androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'
    }
    

Untuk menggunakan class pengujian JUnit 4, pastikan untuk menentukan AndroidJUnitRunner sebagai runner pengujian instrumentasi default di project Anda dengan menyertakan setelan berikut ke dalam file build.gradle tingkat modul aplikasi Anda:

    android {
        defaultConfig {
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        }
    }
    

Membuat class pengujian unit berinstrumen

Class pengujian unit berinstrumen Anda harus berupa kelas pengujian JUnit 4 yang serupa dengan class yang dijelaskan pada bagian tentang cara Membuat class pengujian unit lokal.

Untuk membuat class pengujian JUnit 4 berinstrumen, tentukan AndroidJUnit4 sebagai runner pengujian default Anda.

Catatan: Jika paket pengujian Anda bergantung pada campuran library JUnit3 dan JUnit4, tambahkan anotasi @RunWith(AndroidJUnit4::class) di awal definisi class pengujian Anda.

Contoh berikut menunjukkan cara yang dapat Anda lakukan untuk menulis pengujian unit berinstrumen guna memverifikasi bahwa antarmuka Parcelable diimplementasikan dengan benar untuk class LogHistory:

Kotlin

    import android.os.Parcel
    import android.text.TextUtils.writeToParcel
    import androidx.test.filters.SmallTest
    import androidx.test.runner.AndroidJUnit4
    import com.google.common.truth.Truth.assertThat
    import org.junit.Before
    import org.junit.Test
    import org.junit.runner.RunWith

    const val TEST_STRING = "This is a string"
    const val TEST_LONG = 12345678L

    // @RunWith is required only if you use a mix of JUnit3 and JUnit4.
    @RunWith(AndroidJUnit4::class)
    @SmallTest
    class LogHistoryAndroidUnitTest {
        private lateinit var logHistory: LogHistory

        @Before
        fun createLogHistory() {
            logHistory = LogHistory()
        }

        @Test
        fun logHistory_ParcelableWriteRead() {
            val parcel = Parcel.obtain()
            logHistory.apply {
                // Set up the Parcelable object to send and receive.
                addEntry(TEST_STRING, TEST_LONG)

                // Write the data.
                writeToParcel(parcel, describeContents())
            }

            // After you're done with writing, you need to reset the parcel for reading.
            parcel.setDataPosition(0)

            // Read the data.
            val createdFromParcel: LogHistory = LogHistory.CREATOR.createFromParcel(parcel)
            createdFromParcel.getData().also { createdFromParcelData: List<Pair<String, Long>> ->

                // Verify that the received data is correct.
                assertThat(createdFromParcelData.size).isEqualTo(1)
                assertThat(createdFromParcelData[0].first).isEqualTo(TEST_STRING)
                assertThat(createdFromParcelData[0].second).isEqualTo(TEST_LONG)
            }
        }
    }

    

Java

    import android.os.Parcel;
    import android.util.Pair;
    import androidx.test.filters.SmallTest;
    import androidx.test.runner.AndroidJUnit4;
    import com.google.common.truth.Truth.assertThat;
    import java.util.List;
    import org.junit.Before;
    import org.junit.Test;
    import org.junit.runner.RunWith;

    // @RunWith is required only if you use a mix of JUnit3 and JUnit4.
    @RunWith(AndroidJUnit4.class)
    @SmallTest
    public class LogHistoryAndroidUnitTest {

        public static final String TEST_STRING = "This is a string";
        public static final long TEST_LONG = 12345678L;
        private LogHistory mLogHistory;

        @Before
        public void createLogHistory() {
            mLogHistory = new LogHistory();
        }

        @Test
        public void logHistory_ParcelableWriteRead() {
            // Set up the Parcelable object to send and receive.
            mLogHistory.addEntry(TEST_STRING, TEST_LONG);

            // Write the data.
            Parcel parcel = Parcel.obtain();
            mLogHistory.writeToParcel(parcel, mLogHistory.describeContents());

            // After you're done with writing, you need to reset the parcel for reading.
            parcel.setDataPosition(0);

            // Read the data.
            LogHistory createdFromParcel = LogHistory.CREATOR.createFromParcel(parcel);
            List<Pair<String, Long>> createdFromParcelData
                    = createdFromParcel.getData();

            // Verify that the received data is correct.
            assertThat(createdFromParcelData.size()).isEqualTo(1);
            assertThat(createdFromParcelData.get(0).first).isEqualTo(TEST_STRING);
            assertThat(createdFromParcelData.get(0).second).isEqaulTo(TEST_LONG);
        }
    }
    

Membuat paket pengujian

Untuk mengelola pelaksanaan pengujian unit berinstrumen, Anda dapat mengelompokkan kumpulan class pengujian di class test suite dan menjalankan pengujian ini secara bersamaan. Test suite dapat disarangkan; test suite Anda dapat mengelompokkan test suite lain dan menjalankan semua class pengujian komponennya secara bersamaan.

Test suite termuat dalam paket pengujian, mirip dengan paket aplikasi utama. Berdasarkan konvensi, nama paket test suite biasanya diakhiri dengan akhiran .suite (misalnya, com.example.android.testing.mysample.suite).

Untuk membuat test suite untuk pengujian unit Anda, impor class RunWith dan Suite JUnit. Di test suite, tambahkan anotasi @RunWith(Suite.class) dan @Suite.SuitClasses(). Dalam anotasi @Suite.SuiteClasses(), cantumkan class pengujian individu atau paket pengujian sebagai argumen.

Contoh berikut menunjukkan cara menerapkan paket pengujian yang disebut UnitTestSuite yang mengelompokkan dan menjalankan class pengujian CalculatorInstrumentationTest dan CalculatorAddParameterizedTest secara bersamaan.

Kotlin

    import com.example.android.testing.mysample.CalculatorAddParameterizedTest
    import com.example.android.testing.mysample.CalculatorInstrumentationTest
    import org.junit.runner.RunWith
    import org.junit.runners.Suite

    // Runs all unit tests.
    @RunWith(Suite::class)
    @Suite.SuiteClasses(CalculatorInstrumentationTest::class,
            CalculatorAddParameterizedTest::class)
    class UnitTestSuite
    

Java

    import com.example.android.testing.mysample.CalculatorAddParameterizedTest;
    import com.example.android.testing.mysample.CalculatorInstrumentationTest;
    import org.junit.runner.RunWith;
    import org.junit.runners.Suite;

    // Runs all unit tests.
    @RunWith(Suite.class)
    @Suite.SuiteClasses({CalculatorInstrumentationTest.class,
            CalculatorAddParameterizedTest.class})
    public class UnitTestSuite {}
    

Menjalankan pengujian unit berinstrumen

Untuk menjalankan pengujian berinstrumen, ikuti langkah-langkah berikut ini:

  1. Pastikan project Anda disinkronkan dengan Gradle dengan mengklik Sync Project di toolbar.
  2. Jalankan pengujian dengan salah satu cara berikut:
    • Untuk menjalankan pengujian tunggal, buka jendela Project, lalu klik kanan pengujian dan klik Run .
    • Untuk menguji semua metode di suatu class, klik kanan class atau metode di file pengujian dan klik Run .
    • Untuk menjalankan semua pengujian di suatu direktori, klik kanan pada direktori dan pilih Run tests .

Plugin Android untuk Gradle mengompilasi kode pengujian berinstrumen yang terletak di direktori default (src/androidTest/java/), membuat APK pengujian dan APK produksi, menginstal kedua APK tersebut pada perangkat atau emulator yang terhubung, lalu menjalankan pengujian. Android Studio kemudian menampilkan hasil eksekusi pengujian berinstrumen di jendela Run.

Menjalankan pengujian Anda dengan Firebase Test Lab

Dengan Firebase Test Lab, Anda dapat menguji aplikasi secara bersamaan di berbagai perangkat Android dan konfigurasi ponsel yang populer (lokal, orientasi, ukuran layar, dan versi platform). Pengujian ini berjalan pada perangkat fisik dan virtual di pusat data Google jarak jauh. Anda dapat men-deploy aplikasi ke Test Lab langsung dari Android Studio atau melalui command line. Hasil pengujian memberikan log pengujian dan menyertakan detail kegagalan aplikasi.

Sebelum mulai menggunakan Firebase Test Lab, Anda harus melakukan langkah berikut kecuali Anda sudah memiliki akun Google dan project Firebase:

  1. Jika belum memiliki, buat akun Google.
  2. Di Firebase console, klik Create New Project.

    Pengujian aplikasi dengan Test Lab dapat dilakukan secara gratis asalkan tidak melebihi kuota gratis harian pada paket Spark.

Mengonfigurasi matriks pengujian dan menjalankan pengujian

Android Studio menyediakan fitur terintegrasi yang memungkinkan Anda mengonfigurasikan cara Anda ingin men-deploy pengujian ke Firebase Test Lab. Setelah membuat project Firebase dengan penagihan paket Blaze, Anda dapat membuat konfigurasi pengujian dan menjalankan pengujian:

  1. Dari menu utama, klik Run > Edit Configurations.
  2. Klik Add New Configuration dan pilih Android Tests.
  3. Dalam dialog konfigurasi Android Test:
    1. Masukkan atau pilih detail pengujian Anda, seperti nama pengujian, jenis modul, jenis pengujian, dan class pengujian.
    2. Dari menu drop-down Target di bagian Deployment Target Options, pilih Firebase Test Lab Device Matrix.
    3. Jika Anda tidak login, klik Connect to Google Cloud Platform dan izinkan Android Studio mengakses akun Anda.
    4. Di samping Cloud Project, klik tombol dan pilih project Firebase Anda dari daftar tersebut.
  4. Buat dan konfigurasikan matriks pengujian:
    1. Di samping menu drop-down Matrix Configuration, klik Open Dialog .
    2. Klik Add New Configuration (+).
    3. Di kolom Name, masukkan nama konfigurasi baru Anda.
    4. Pilih perangkat, versi Android, lokal, dan orientasi layar yang ingin diuji dengan aplikasi Anda. Firebase Test Lab akan menguji aplikasi Anda atas setiap kombinasi pilihan Anda saat membuat hasil pengujian.
    5. Klik OK untuk menyimpan konfigurasi Anda.
  5. Klik OK di dialog Run/Debug Configurations untuk keluar.
  6. Jalankan pengujian dengan mengklik Run .

Gambar 1. Membuat konfigurasi pengujian untuk Firebase Test Lab.

Menganalisis hasil pengujian

Saat Firebase Test Lab selesai menjalankan pengujian, jendela Run akan terbuka untuk menampilkan hasilnya, seperti yang ditunjukkan pada gambar 2. Anda mungkin perlu mengklik Show Passed untuk melihat semua pengujian yang dilakukan.

Gambar 2. Melihat hasil pengujian berinstrumen menggunakan Firebase Test Lab.

Anda juga dapat menganalisis pengujian di web dengan mengikuti link yang ditampilkan di awal log eksekusi pengujian di jendela Run.

Bacaan lebih lanjut

Untuk mempelajari lebih lanjut cara menafsirkan hasil web, lihat Menganalisis Hasil Firebase Test Lab for Android.

Referensi lainnya

Untuk informasi selengkapnya tentang menggunakan Espresso dalam pengujian Android, lihat referensi berikut.

Contoh

Codelab