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 API Android 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 selengkapnya mengenai panduan cara kerja 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

Terletak 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 memalsukan dependensi Android framework.

Saat runtime, pengujian ini dijalankan terhadap versi android.jar yang dimodifikasi, dengan semua pengubah final yang telah dihilangkan. Ini memungkinkan Anda menggunakan library peniruan populer, seperti Mockito.

Pengujian berinstrumen

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

Ini adalah pengujian yang berjalan pada perangkat hardware atau emulator. Pengujian ini memiliki akses ke Instrumentation API, 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 palsu.

Karena pengujian berinstrumen dibuat ke dalam APK (terpisah dari APK aplikasi), 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 berjalan khusus untuk Anda. Saat membuat aplikasi Anda, Gradle akan menggabungkan beberapa file manifes ke dalam satu manifes.

Build Gradle menafsirkan 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 bidang apa pun dan 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. Selanjutnya, 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 yang disarangkan. Untuk menambahkan pengujian unit lokal, luaskan folder test dan folder java bersarang; untuk menambahkan pengujian berinstrumen, luaskan 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 di 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 Membuat pengujian unit lokal dan Membuat 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 versi berbeda dari library yang sama. Jika Gradle tidak dapat mendeteksi konflik versi ini, aplikasi Anda mungkin menampilkan perilaku yang tidak terduga atau mendapatkan 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 yang 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 pada folder src dan klik New> Directory.
  3. Untuk nama direktori, masukkan "androidTestNamaVarian". Misalnya, jika Anda memiliki varian build bernama "MyFlavor", maka nama direktori harus "androidTestMyFlavor". Lalu klik OK.
  4. Klik kanan pada direktori baru dan 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 di atas untuk menambahkan tes baru. Saat Anda mencapai dialog Choose Destination Directory, pilih set sumber pengujian varian baru.

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

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

Lokasi class aplikasi Lokasi class pengujian 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 kasus ini, file AndroidFooTest.java di 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 meningkatkan ragam produk untuk pengujian Hermetic.

Mengonfigurasi setelan manifes instrumentasi

Saat Gradle membuat 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 tingkat modul Anda, seperti yang ditunjukkan dalam 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 di file build.gradle tingkat modul Anda. 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. Dalam file build.gradle tingkat modul, gunakan blok testOptions {} untuk menentukan opsi yang akan mengubah cara Gradle menjalankan pengujian.

    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 bagi pengujian unit lokal saja, 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 Anda 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 di set sumber utama atau varian (misalnya src/main/java atau src/variant/java). Jika modul aplikasi Anda menentukan berbagai ragam produk, Anda dapat membuat ulang ragam itu di 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 ditunjukkan di bawah ini:

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 sebuah aplikasi, Anda dapat menggunakan properti matchingFallbacks untuk hanya menargetkan varian yang ingin diuji. Hal ini juga mencegah modul pengujian mengonfigurasi varian tersebut untuk modul 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. Untuk menjalankan pengujian, lakukan salah satu cara berikut:
    • Pada jendela Project, klik kanan pengujian, lalu klik Run .
    • Di Code Editor, klik kanan class atau metode dalam file pengujian, lalu klik Run untuk menguji semua metode di class.
    • 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

Fitur cakupan pengujian tersedia untuk pengujian unit lokal guna melacak persentase dan area kode aplikasi yang dicakup oleh unit pengujian Anda. Gunakan fitur 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. Dalam menu konteks, pilih Run nama-pengujian with coverage.

    Jendela coverage tool akan muncul.

Gambar 2 menunjukkan jendela coverage tool 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 Membuat 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 pada 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, 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, sebagai berikut:

  1. Di panel output, klik link Click to see difference.
  2. Pada Differences viewer, pelajari perbedaannya seperti yang dijelaskan di halaman IntelliJ, Penampil perbedaan untuk file.

Mengekspor hasil pengujian

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

  1. Klik Export Test Results .
  2. Dalam 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 pengujian yang diimpor akan muncul di jendela Run.