Menguji aplikasi

Android Studio didesain untuk menyederhanakan pengujian. Hanya dengan beberapa kali klik, Anda dapat menyiapkan pengujian JUnit yang dijalankan pada JVM lokal, atau pengujian berinstrumen yang dijalankan pada perangkat. Tentu saja, Anda dapat memperluas kemampuan pengujian Anda dengan mengintegrasikan framework pengujian seperti Mockito untuk menguji panggilan Android API di pengujian unit lokal, dan Espresso atau UI Automator untuk menjalankan interaksi pengguna di pengujian berinstrumen Anda. Anda dapat membuat pengujian Espresso secara otomatis menggunakan Espresso Test Recorder.

Halaman ini memberikan informasi dasar cara menambah pengujian baru ke aplikasi Anda dan menjalankannya dari Android Studio.

Untuk panduan cara kerja selengkapnya terkait menulis pengujian, lihat Menguji aplikasi di Android.

Jenis dan lokasi pengujian

Lokasi kode pengujian Anda bergantung pada jenis pengujian yang Anda tulis. Android Studio menyediakan direktori kode sumber (set sumber), untuk dua jenis pengujian berikut:

Pengujian unit lokal

Berlokasi di module-name/src/test/java/.

Semua pengujian ini dijalankan pada Java Virtual Machine (JVM) lokal mesin Anda. Gunakan pengujian ini untuk meminimalkan waktu eksekusi saat pengujian Anda tidak memiliki dependensi framework Android atau saat Anda dapat meniru dependensi framework Android.

Saat waktu proses, pengujian ini dijalankan terhadap versi android.jar yang dimodifikasi, dengan semua pengubah final yang telah dihilangkan. Hal ini memungkinkan Anda menggunakan library tiruan populer, seperti Mockito.

Pengujian berinstrumen

Berlokasi di module-name/src/androidTest/java/.

Ini adalah pengujian yang berjalan pada perangkat hardware atau emulator. Pengujian ini memiliki akses ke API Instrumentation, memberi Anda akses ke informasi seperti Context aplikasi yang sedang Anda uji, dan memungkinkan Anda mengontrol aplikasi yang sedang diuji dari kode pengujian Anda. Gunakan pengujian ini saat menulis pengujian UI fungsional dan integrasi untuk mengotomatiskan interaksi pengguna, atau saat pengujian Anda memiliki dependensi Android yang tidak dapat dipenuhi oleh objek tiruan.

Karena pengujian berinstrumen di-build ke dalam APK (terpisah dari APK aplikasi Anda), pengujian tersebut harus memiliki file AndroidManifest.xml sendiri. Namun, Gradle akan otomatis menghasilkan file ini selama proses build sehingga tidak terlihat dalam set sumber project Anda. Jika perlu, Anda dapat menambahkan file manifes sendiri, misalnya untuk menetapkan nilai berbeda bagi `minSdkVersion` atau mendaftarkan pemroses run khusus untuk pengujian Anda. Saat mem-build aplikasi Anda, Gradle akan menggabungkan beberapa file manifes ke dalam satu manifes.

Build Gradle menginterpretasikan set sumber pengujian ini dengan cara yang sama seperti untuk project set sumber aplikasi project Anda, yang memungkinkan Anda membuat pengujian berdasarkan varian build.

Saat Anda membuat project baru atau menambahkan modul aplikasi, Android Studio akan membuat beberapa set sumber pengujian yang dicantumkan di atas dan menyertakan contoh file pengujian dalam setiap set. Anda dapat melihatnya di jendela Project seperti yang ditampilkan dalam gambar 1.

Gambar 1. (1) Pengujian berinstrumen dan (2) pengujian JVM lokal project Anda dapat dilihat di tampilan Project (kiri) atau Android (kanan).

Menambahkan pengujian baru

Untuk membuat pengujian unit lokal atau pengujian berinstrumen, Anda dapat membuat pengujian baru untuk class atau metode tertentu dengan mengikuti langkah-langkah ini:

  1. Buka file Java yang berisi kode yang ingin diuji.
  2. Klik class atau metode yang ingin Anda uji, lalu tekan Ctrl+Shift+T (⇧⌘T).
  3. Pada menu yang muncul, klik Create New Test.
  4. Pada dialog Create Test, edit sembarang kolom, pilih metode yang akan dibuat, lalu klik OK.
  5. Pada dialog Choose Destination Directory, klik set sumber yang sesuai dengan jenis pengujian yang ingin Anda buat: androidTest untuk pengujian berinstrumen atau test untuk pengujian unit lokal. Lalu, klik OK.

Atau, Anda dapat membuat file Java generik dalam set sumber pengujian yang sesuai seperti berikut:

  1. Pada jendela Project di sebelah kiri, klik menu drop-down dan pilih tampilan Project.
  2. Luaskan folder modul yang sesuai dan folder src bertingkat. Untuk menambahkan pengujian unit lokal, perluas folder test dan folder java bertingkat; untuk menambahkan pengujian berinstrumen, perluas folder androidTest dan folder java bertingkat.
  3. Klik kanan pada direktori paket Java dan pilih New > Java Class.
  4. Beri nama file, lalu klik OK.

Pastikan juga Anda menentukan dependensi library pengujian dalam file build.gradle modul aplikasi Anda:

dependencies {
        // Required for local unit tests (JUnit 4 framework)
        testImplementation 'junit:junit:4.12'

        // Required for instrumented tests
        androidTestImplementation 'com.android.support:support-annotations:24.0.0'
        androidTestImplementation 'com.android.support.test:runner:0.5'
    }
    

Untuk dependensi library opsional lainnya dan informasi selengkapnya terkait cara menulis pengujian, lihat Mem-build pengujian unit lokal dan Mem-build pengujian unit berinstrumen.

Menyelesaikan konflik antara aplikasi dan APK pengujian

APK aplikasi dan APK pengujian Anda memiliki classpath yang sama. Jadi, Anda bisa mendapatkan error build jika kedua APK bergantung pada library yang sama namun berbeda versi. Jika Gradle tidak dapat mendeteksi konflik versi ini, aplikasi Anda mungkin menampilkan perilaku yang tidak terduga atau terjadi error saat waktu proses.

Untuk mempelajari lebih lanjut, baca Memperbaiki error resolusi dependensi.

Membuat pengujian berinstrumen untuk varian build

Jika project Anda menyertakan varian build dengan beberapa set sumber unik, maka Anda mungkin memerlukan beberapa set sumber pengujian berinstrumen yang sesuai. Membuat pengujian berinstrumen di set sumber yang sesuai dengan varian build akan membantu menjaga kode pengujian tetap teratur dan memungkinkan Anda menjalankan hanya pengujian yang berlaku bagi varian build tertentu.

Untuk menambahkan set sumber pengujian bagi varian build Anda, ikuti langkah-langkah ini:

  1. Pada jendela Project di sebelah kiri, klik menu drop-down dan pilih tampilan Project.
  2. Dalam folder modul yang sesuai, klik kanan folder src, lalu klik New > Directory.
  3. Untuk nama direktori, masukkan "androidTestNamaVarian". Misalnya, jika Anda memiliki varian build yang bernama "MyFlavor", nama direktori harus "androidTestMyFlavor." Lalu, klik OK.
  4. Klik kanan direktori baru, lalu klik New > Directory.
  5. Masukkan "java" sebagai nama direktori, lalu klik OK.

Sekarang Anda dapat menambahkan pengujian ke set sumber baru ini dengan mengikuti langkah-langkah untuk menambahkan pengujian baru di atas. Saat Anda mencapai dialog Choose Destination Directory, pilih set sumber pengujian varian baru.

Pengujian berinstrumen pada set sumber src/androidTest/ digunakan bersama oleh semua varian build. Saat mem-build APK pengujian untuk varian "MyFlavor" aplikasi Anda, Gradle menggabungkan set sumber src/androidTest/ dan src/androidTestMyFlavor/.

Misalnya, tabel berikut menampilkan cara menempatkan file uji instrumentasi dalam set sumber yang sesuai dengan set sumber kode aplikasi.

Jalur class aplikasi Jalur class uji instrumentasi yang sesuai
src/main/java/Foo.java src/androidTest/java/AndroidFooTest.java
src/myFlavor/java/Foo.java src/androidTestMyFlavor/java/AndroidFooTest.java

Sama seperti yang dilakukan pada set sumber aplikasi Anda, build Gradle menggabungkan dan menggantikan semua file dari set sumber pengujian yang berbeda. Dalam hal ini, file AndroidFooTest.java dalam set sumber "androidTestMyFlavor" mengganti versi dalam set sumber "androidTest". Untuk informasi selengkapnya mengenai cara penggabungan set sumber, lihat Mengonfigurasi build Anda.

Alasan lain Anda harus menggunakan varian build untuk aplikasi Anda dan set sumber pengujian adalah untuk membuat pengujian hermetic melalui dependensi tiruan. Anda dapat membuat ragam produk untuk aplikasi yang berisi implementasi tiruan dependensi (misalnya permintaan jaringan atau data sensor perangkat yang biasanya tidak stabil), lalu menambahkan set sumber pengujian tiruan yang sesuai. Untuk informasi selengkapnya, lihat postingan blog tentang memanfaatkan ragam produk untuk pengujian Hermetic.

Mengonfigurasi setelan manifes instrumentasi

Saat mem-build APK pengujian Anda, Gradle secara otomatis menghasilkan file AndroidManifest.xml dan mengonfigurasinya dengan node <instrumentation>. Salah satu alasan Gradle mengonfigurasi node ini untuk Anda adalah untuk memastikan bahwa properti targetPackage menentukan nama paket yang benar dari aplikasi yang sedang diuji. Anda dapat mengubah beberapa setelan lain untuk node ini dengan membuat file manifes lain di set sumber pengujian atau mengonfigurasi file build.gradle level modul, seperti yang ditunjukkan pada contoh kode berikut.

    android {
      ...
      // Each product flavor you configure can override properties in the
      // defaultConfig {} block. To learn more, go to Configure product flavors.
      defaultConfig {
        ...
        // Specifies the application ID for the test APK.
        testApplicationId "com.test.foo"
        // Specifies the fully-qualified class name of the test instrumentation runner.
        testInstrumentationRunner "android.test.InstrumentationTestRunner"
        // If set to 'true', enables the instrumentation class to start and stop profiling.
        // If set to false (default), profiling occurs the entire time the instrumentation
        // class is running.
        testHandleProfiling true
        // If set to 'true', indicates that the Android system should run the instrumentation
        // class as a functional test. The default value is 'false'
        testFunctionalTest true
      }
    }
    ...
    

Mengubah jenis build pengujian

Secara default, semua pengujian dijalankan terhadap jenis build debug. Anda dapat mengubahnya ke jenis build lain dengan menggunakan properti testBuildType dalam file build.gradle level modul. Misalnya, jika Anda ingin menjalankan pengujian terhadap jenis build "staging", edit file tersebut seperti yang ditampilkan dalam cuplikan berikut.

android {
        ...
        testBuildType "staging"
    }
    

Mengonfigurasi opsi pengujian Gradle

Plugin Android untuk Gradle memungkinkan Anda menentukan opsi tertentu untuk semua atau beberapa pengujian unit Anda. Pada file build.gradle level modul, gunakan blok testOptions {} untuk menentukan opsi yang mengubah cara Gradle menjalankan semua pengujian Anda.

    android {
      ...
      // Encapsulates options for running tests.
      testOptions {
        // Changes the directory where Gradle saves test reports. By default, Gradle saves test reports
        // in the path_to_your_project/module_name/build/outputs/reports/ directory.
        // '$rootDir' sets the path relative to the root directory of the current project.
        reportDir "$rootDir/test-reports"
        // Changes the directory where Gradle saves test results. By default, Gradle saves test results
        // in the path_to_your_project/module_name/build/outputs/test-results/ directory.
        // '$rootDir' sets the path relative to the root directory of the current project.
        resultsDir "$rootDir/test-results"
      }
    }
    

Untuk menentukan opsi hanya untuk pengujian unit lokal, lakukan konfigurasi blok unitTests {} di dalam testOptions {}.

    android {
      ...
      testOptions {
        ...
        // Encapsulates options for local unit tests.
        unitTests {
          // By default, local unit tests throw an exception any time the code you are testing tries to access
          // Android platform APIs (unless you mock Android dependencies yourself or with a testing
          // framework like Mockito). However, you can enable the following property so that the test
          // returns either null or zero when accessing platform APIs, rather than throwing an exception.
          returnDefaultValues true

          // Encapsulates options for controlling how Gradle executes local unit tests. For a list
          // of all the options you can specify, read Gradle's reference documentation.
          all {
            // Sets JVM argument(s) for the test JVM(s).
            jvmArgs '-XX:MaxPermSize=256m'

            // You can also check the task name to apply options to only the tests you specify.
            if (it.name == 'testDebugUnitTest') {
              systemProperty 'debug', 'true'
            }
            ...
          }
        }
      }
    }
    

Menggunakan modul pengujian terpisah untuk pengujian berinstrumen

Jika ingin memiliki modul yang dikhususkan untuk pengujian berinstrumen dan memisahkan kode lainnya dari pengujian, Anda dapat membuat modul pengujian terpisah dan mengonfigurasi build-nya mirip dengan build untuk modul library. Untuk membuat modul pengujian, lakukan langkah berikut:

  1. Buat modul library.
  2. Dalam file build level modul, terapkan plugin com.android.test, bukan com.android.library.
  3. Sinkronkan project Anda.

Setelah membuat modul pengujian, Anda dapat menyertakan kode pengujian dalam set sumber utama atau varian (misalnya, src/main/java atau src/variant/java). Jika modul aplikasi Anda menentukan beberapa ragam produk, Anda dapat membuat ulang ragam tersebut dalam modul pengujian, dan menggunakan pengelolaan dependensi yang berbasis varian, modul pengujian mencoba menguji ragam yang cocok dalam modul target.

Secara default, modul pengujian hanya berisi dan menguji varian debug. Namun, Anda dapat membuat jenis build baru agar sesuai dengan project aplikasi yang diuji. Agar modul pengujian menguji jenis build yang berbeda, dan bukan build debug, gunakan VariantFilter untuk menonaktifkan varian debug dalam project pengujian, seperti yang ditampilkan di bawah:

android {
        variantFilter { variant ->
            if (variant.buildType.name.equals('debug')) {
                variant.setIgnore(true);
            }
        }
    }
    

Jika Anda ingin modul pengujian hanya menargetkan ragam atau jenis build tertentu dari suatu aplikasi, Anda dapat menggunakan properti matchingFallbacks agar hanya menargetkan varian yang ingin Anda uji. Cara ini juga mencegah modul pengujian mengonfigurasi varian tersebut untuk pengujian itu sendiri.

Menjalankan pengujian

Untuk menjalankan pengujian, ikuti langkah berikut:

  1. Pastikan project Anda disinkronkan dengan Gradle dengan mengklik Sync Project di toolbar.
  2. Jalankan pengujian Anda dengan salah satu cara berikut:
    • Di jendela Project, klik kanan pengujian, lalu klik Run .
    • Di Code Editor, klik kanan class atau metode di file pengujian, lalu klik Run untuk menguji semua metode dalam class tersebut.
    • Untuk menjalankan semua pengujian, klik kanan direktori pengujian, lalu klik Run tests .

Secara default, pengujian Anda dijalankan menggunakan konfigurasi run default Android Studio. Jika ingin mengubah beberapa setelan run seperti opsi runner dan deployment instrumentasi, Anda dapat mengedit konfigurasi run pada dialog Run/Debug Configurations (klik Run > Edit Configurations).

Melihat cakupan pengujian

Alat cakupan pengujian tersedia untuk pengujian unit lokal guna melacak persentase dan area kode aplikasi yang dicakup oleh unit pengujian Anda. Gunakan alat ini untuk menentukan apakah Anda telah menguji elemen, class, metode, dan baris kode yang membentuk aplikasi Anda secara memadai.

Ada beberapa cara untuk menjalankan pengujian unit, seperti yang dijelaskan pada halaman Menjalankan Pengujian dengan Cakupan di IntelliJ. Prosedur berikut ini menunjukkan cara menjalankan pengujian unit secara inline dari editor:

  1. Klik dua kali pengujian unit yang ingin Anda jalankan.
  2. Di editor, tempatkan kursor di baris yang ingin Anda jalankan dengan cakupan.
    • Jika Anda menempatkan kursor di deklarasi class, semua metode pengujian di class tersebut akan dijalankan.
    • Jika Anda menempatkan kursor di deklarasi metode, semua kode dalam metode tersebut akan dijalankan.
    • Jika Anda menempatkan kursor pada baris tertentu dalam metode, hanya baris yang ditempati kursor yang akan dijalankan.
  3. Klik kanan baris tempat Anda meletakkan kursor.
  4. Pada menu konteks, pilih Run nama-pengujian with coverage.

    Jendela alat cakupan akan muncul.

Gambar 2 menunjukkan jendela alat cakupan untuk pengujian unit kalkulator yang menguji penambahan, pengurangan, perkalian, dan pembagian.

Gambar 2. Lihat persentase cakupan kode untuk aplikasi Anda.

Untuk informasi selengkapnya tentang pengujian unit lokal, lihat Mem-build pengujian unit lokal.

Melihat hasil tes

Saat Anda menjalankan JUnit atau pengujian berinstrumen, hasilnya akan ditampilkan di jendela Run. Batang hijau berarti semua pengujian berhasil dan batang merah berarti setidaknya satu pengujian gagal. Gambar 3 menunjukkan pengujian yang berhasil.

Gambar 3. Hasil pengujian ditampilkan di jendela Run.

Jendela Run menampilkan pengujian dalam tampilan hierarki di sebelah kiri, serta hasil dan pesan untuk rangkaian pengujian saat ini di panel output di sebelah kanan. Gunakan toolbar, menu konteks, dan ikon status untuk mengelola hasil pengujian, sebagai berikut:

  1. Gunakan toolbar run untuk menjalankan ulang pengujian saat ini, menghentikan pengujian saat ini, menjalankan ulang pengujian yang gagal (tidak ditampilkan karena hanya tersedia untuk pengujian unit), menjeda output, dan membuang thread.
  2. Gunakan toolbar pengujian untuk memfilter dan mengurutkan hasil pengujian. Anda juga dapat meluaskan atau menciutkan node, menampilkan cakupan pengujian, dan mengimpor atau mengekspor hasil pengujian.
  3. Klik menu konteks untuk melacak pengujian yang sedang berjalan, menampilkan statistik inline, men-scroll ke stacktrace, membuka kode sumber sebagai pengecualian, men-scroll otomatis ke sumber, dan memilih pengujian pertama yang gagal saat pengujian yang dijalankan selesai.
  4. Ikon status pengujian menunjukkan apakah pengujian mengalami error, diabaikan, gagal, sedang berlangsung, telah lulus, dijeda, dihentikan, atau tidak berjalan.
  5. Klik kanan baris dalam tampilan hierarki untuk menampilkan menu konteks yang memungkinkan Anda menjalankan pengujian dalam mode debug, membuka file kode sumber pengujian, atau melompat ke baris dalam kode sumber yang sedang diuji.

Untuk informasi selengkapnya mengenai jendela Run, toolbar-nya, dan menu konteks, lihat halaman Tab Test Runner di IntelliJ.

Melihat statistik inline

Untuk mengetahui berapa lama pengujian berjalan, lakukan hal berikut:

  1. Klik ikon roda gigi .
  2. Di menu drop-down, pilih Show Inline Statistics.

    Waktu yang berlalu ditampilkan (dalam milidetik) di sebelah kanan pengujian.

Membandingkan string

Jika pengujian unit berisi kegagalan assertEquals() saat membandingkan dua objek string, Anda dapat melihat perbedaan antara kedua objek string tersebut untuk mengetahui penyebab kegagalan, seperti berikut:

  1. Di panel output, klik link Click to see difference.
  2. Di Differences viewer, pelajari perbedaannya seperti yang dijelaskan di halaman IntelliJ, Differences viewer for files.

Mengekspor hasil pengujian

Anda dapat mengekspor hasil pengujian dalam format XML atau HTML, sebagai berikut:

  1. Klik Export Test Results .
  2. Di dialog Export Test Results, berikan informasi format dan output, lalu klik OK.

    Hasil pengujian yang telah diekspor akan disimpan ke folder yang ditentukan.

Mengimpor hasil pengujian

Anda dapat mengimpor hasil pengujian yang telah diekspor, sebagai berikut:

  1. Klik Import Test Results .
  2. Di menu drop-down, pilih file yang ingin Anda impor.

    Hasil tes yang diimpor akan muncul di jendela Run.