Pengujian lokal berjalan langsung di workstation Anda sendiri, bukan di Android perangkat atau emulator. Oleh karena itu, VM ini menggunakan Java Virtual Machine (JVM) lokal Anda, bukan perangkat Android untuk menjalankan pengujian. Dengan pengujian lokal, Anda dapat mengevaluasi logika aplikasi Anda dengan lebih cepat. Namun, tidak dapat berinteraksi dengan Framework Android membuat batasan pada jenis pengujian yang dapat Anda jalankan.
Pengujian unit memverifikasi perilaku bagian kecil kode, yaitu unit di bawah uji coba. Hal ini dilakukan dengan mengeksekusi kode tersebut dan memeriksa hasilnya.
Pengujian unit biasanya sederhana, tetapi penyiapannya dapat menjadi masalah saat unit yang sedang diuji tidak dirancang dengan mempertimbangkan kemampuan pengujian:
- Kode yang ingin Anda verifikasi harus dapat diakses dari pengujian. Sebagai misalnya, Anda tidak dapat menguji metode pribadi secara langsung. Sebagai gantinya, Anda menguji class menggunakan API publiknya.
- Untuk menjalankan pengujian unit secara isolasi, dependensi unit dalam pengujian harus diganti dengan komponen yang Anda kontrol, seperti komponen palsu atau pengujian ganda lainnya. Hal ini terutama bermasalah jika kode Anda bergantung pada framework Android.
Untuk mempelajari strategi pengujian unit yang umum di Android, baca Yang harus dilakukan uji coba.
Lokasi pengujian lokal
Secara default, file sumber untuk pengujian unit lokal ditempatkan di
module-name/src/test/
. Direktori ini sudah ada saat Anda membuat
project menggunakan Android Studio.
Menambahkan dependensi pengujian
Anda juga perlu mengonfigurasi dependensi pengujian untuk project Anda agar dapat menggunakan API standar yang disediakan oleh framework pengujian JUnit.
Untuk melakukannya, buka file build.gradle
modul aplikasi Anda dan tentukan hal berikut
library sebagai dependensi. Gunakan fungsi testImplementation
untuk menunjukkan
yang mereka terapkan ke set sumber pengujian lokal, dan bukan aplikasi:
dependencies {
// Required -- JUnit 4 framework
testImplementation "junit:junit:$jUnitVersion"
// Optional -- Robolectric environment
testImplementation "androidx.test:core:$androidXTestVersion"
// Optional -- Mockito framework
testImplementation "org.mockito:mockito-core:$mockitoVersion"
// Optional -- mockito-kotlin
testImplementation "org.mockito.kotlin:mockito-kotlin:$mockitoKotlinVersion"
// Optional -- Mockk framework
testImplementation "io.mockk:mockk:$mockkVersion"
}
Membuat class pengujian unit lokal
Anda akan menulis class pengujian unit lokal sebagai class pengujian JUnit 4.
Untuk melakukannya, buat kelas yang berisi satu atau beberapa metode pengujian, biasanya dalam
module-name/src/test/
. Metode pengujian dimulai dengan anotasi @Test
dan
berisi kode untuk dijalankan dan memverifikasi satu aspek dari komponen yang
yang ingin Anda uji.
Contoh berikut menunjukkan cara menerapkan class pengujian unit lokal. Tujuan
metode pengujian emailValidator_correctEmailSimple_returnsTrue()
mencoba memverifikasi
isValidEmail()
,yang merupakan metode dalam aplikasi. Fungsi pengujian akan menampilkan
benar (true) jika isValidEmail()
juga menampilkan benar (true).
Kotlin
import org.junit.Assert.assertFalse import org.junit.Assert.assertTrue import org.junit.Test class EmailValidatorTest { @Test fun emailValidator_CorrectEmailSimple_ReturnsTrue() { assertTrue(EmailValidator.isValidEmail("name@email.com")) } }
Java
import org.junit.Test; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; class EmailValidatorTest { @Test public void emailValidator_CorrectEmailSimple_ReturnsTrue() { assertTrue(EmailValidator.isValidEmail("name@email.com")); } }
Anda harus membuat pengujian dapat dibaca yang mengevaluasi apakah komponen dalam
menampilkan hasil yang diharapkan. Sebaiknya gunakan library pernyataan seperti
sebagai junit.Assert, Hamcrest, atau
Kebenaran. Cuplikan di atas adalah contoh cara menggunakan
junit.Assert
.
Library Android tiruan
Saat menjalankan pengujian unit lokal, Plugin Android Gradle akan menyertakan yang berisi semua API framework Android, sesuai dengan yang digunakan dalam project Anda. {i>Library<i} menyimpan semua metode publik dan dari API tersebut, tetapi kode di dalam metode telah dihapus. Jika ada dari metode diakses, pengujian akan menampilkan pengecualian.
Hal ini memungkinkan pengujian lokal dibangun saat mereferensikan class di Android
seperti Context
. Lebih penting lagi, ini memungkinkan
Anda menggunakan {i>mockup<i}
Google Cloud dengan kelas Android.
Tiruan dependensi Android
Masalah umumnya adalah mengetahui bahwa class menggunakan resource string. Anda dapat
mendapatkan resource string dengan memanggil metode getString()
di Context
. Namun, pengujian lokal tidak dapat menggunakan Context
atau metodenya karena
termasuk dalam framework Android. Idealnya, panggilan ke getString()
adalah
dikeluarkan dari kelas, tetapi hal ini tidak selalu praktis. Solusinya adalah
buat tiruan atau stub Context
yang selalu menampilkan nilai yang sama saat
Metode getString()
dipanggil.
Dengan library Android Mockable dan framework tiruan seperti Mockito atau MockK, Anda dapat memprogram perilaku tiruan class Android dalam pengujian unit Anda.
Untuk menambahkan objek tiruan ke pengujian unit lokal Anda menggunakan Mockito, ikuti tradisional:
- Sertakan dependensi library Mockito dalam file
build.gradle
Anda, sebagai yang dijelaskan dalam Menyiapkan lingkungan pengujian Anda. - Di awal definisi class pengujian unit, tambahkan
anotasi
@RunWith(MockitoJUnitRunner.class)
. Anotasi ini memberi tahu {i>Mockito test runner<i} untuk memvalidasi bahwa penggunaan framework Anda sudah benar dan menyederhanakan inisialisasi objek tiruan Anda. - Untuk membuat objek tiruan untuk dependensi Android, tambahkan anotasi
@Mock
sebelum deklarasi {i>field<i}. - Untuk menghentikan perilaku dependensi, Anda dapat menentukan kondisi dan
tampilkan nilai saat kondisi terpenuhi dengan menggunakan
when()
danthenReturn()
metode.
Contoh berikut menunjukkan cara membuat pengujian unit yang menggunakan tiruan
Objek Context
di Kotlin yang dibuat dengan Mockito-Kotlin.
import android.content.Context
import org.junit.Assert.assertEquals
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.junit.MockitoJUnitRunner
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
private const val FAKE_STRING = "HELLO WORLD"
@RunWith(MockitoJUnitRunner::class)
class MockedContextTest {
@Mock
private lateinit var mockContext: Context
@Test
fun readStringFromContext_LocalizedString() {
// Given a mocked Context injected into the object under test...
val mockContext = mock<Context> {
on { getString(R.string.name_label) } doReturn FAKE_STRING
}
val myObjectUnderTest = ClassUnderTest(mockContext)
// ...when the string is returned from the object under test...
val result: String = myObjectUnderTest.getName()
// ...then the result should be the expected one.
assertEquals(result, FAKE_STRING)
}
}
Untuk mempelajari lebih lanjut cara menggunakan framework Mockito, lihat Mockito API
referensi dan class SharedPreferencesHelperTest
di
kode contoh. Coba juga Android Testing Codelab.
Error: "Metode ... tidak ditiru"
Library Android Mockable menampilkan pengecualian jika Anda mencoba mengakses
metode dengan pesan Error: "Method ... not mocked
.
Jika pengecualian yang ditampilkan bermasalah untuk pengujian, Anda dapat mengubah
sehingga metode akan mengembalikan nol atau nol, tergantung pada
jenis nilai yang ditampilkan. Untuk melakukannya, tambahkan konfigurasi berikut ke file
file build.gradle
level teratas di Groovy:
android {
...
testOptions {
unitTests.returnDefaultValues = true
}