Testing
Testing
Dalam dunia Android terdapat test code yang berfungsi untuk menguji
aplikasi. Test code merupakan kumpulan kode untuk melakukan sejumlah
proses pengujian terhadap jalannya aplikasi dan memastikan ia berjalan
sesuai kebutuhan. Sebuah test code terbagi menjadi 2 bagian, yakni Unit
Test dan Instrumentation Test.
Berikut detail dari kedua test code di atas:
1. Unit Test
Unit test adalah tahapan testing yang menguji suatu komponen/unit
dari aplikasi secara individu. Individual komponen/unit di sini bisa
diartikan sebagai suatu class, satu method, atau bahkan satu
module. Lalu, bagaimana caranya jika Anda ingin menguji sebuah
method/fungsi supaya berjalan sesuai rencana? Caranya cukup
mudah, yakni dengan memberikan input dan melihat hasilnya
apakah sesuai dengan ekspektasi atau tidak.
2. UI Test
UI Test merupakan sebuah mekanisme di mana aplikasi akan diuji
sesuai dengan kondisi user/pengguna ketika berinteraksi pada
sebuah aplikasi. Ia biasanya dihubungkan dengan beberapa
skenario perjalanan pengguna dalam aplikasi. Diharapkan segala
bentuk interaksi pengguna terhadap aplikasi dapat diprediksi pada
ranah UI Test.
Unit test berfungsi untuk menguji logika bisnis dalam sebuah aplikasi.
Dengan demikian kita harus menuliskannya hanya untuk menguji fungsi
kecil/unit kode demi memastikan apakah logika kerjanya sudah sesuai
dengan yang diharapkan. Misalnya, menguji apakah hasil dari (3 x 3)
sama dengan 9.
Kita akan menggunakan library JUnit untuk melakukan unit test. Library
ini secara otomatis sudah ditambahkan ketika kita membuat proyek baru
pada Android Studio. JUnit hanya digunakan untuk menjalankan tes,
sehingga ia tidak akan di-compile ketika aplikasi dijalankan pada
perangkat Android atau emulator. Tentunya ini bisa mengurangi ukuran
dari APK.
1. testImplementation 'junit:junit:4.12'
Kotlin
Java
1. object Utils {
2. @SuppressLint("SimpleDateFormat")
5. }
6. }
Fungsi di atas bisa kita gunakan untuk mengubah date menjadi string
dengan format yang sudah ditentukan. Sekarang kita akan menambahkan
sebuah unit test pada fungsi tersebut untuk menguji apakah hasilnya
sesuai atau tidak dengan yang kita harapkan. Untuk menambahkan unit
test, tekan SHIFT + CTRL + T pada fungsi tersebut dan pilih Create
new test ..., maka akan muncul dialog seperti berikut:
Berikan tanda centang dan klik OK maka akan muncul sebuah dialog baru
untuk memilih tujuan penyimpanan dari kelas pengujian yang akan
dibuat.
Karena ini adalah sebuah unit test, maka Anda harus memilih folder
../test/.. untuk menyimpannya. Silakan pilih folder tersebut dan klik OK.
Android Studio secara otomatis akan membuatkan Anda sebuah kelas
testing dengan nama UtilsTest yang di dalamnya sudah terdapat test
function dari fungsi sebelumnya. Anda bisa mengubah nama dari fungsi
tersebut sesuai keinginan Anda.
Kotlin
Java
1. class UtilsTest {
2. @Test
3. fun toSimpleString() {
4. }
5. }
Kotlin
Java
1. @Test
2. fun toSimpleString() {
5. try {
6. date = dateFormat.parse("02/28/2018")
8. e.printStackTrace()
9. }
11. }
Coba perhatikan lagi hasil pengujian yang tertera pada konsol di atas. Di
sana terdapat log error yang menunjukan bahwa nilai yang kita harapkan
adalah Wed, 28 Feb 2018, sedangkan nilai yang dihasilkan oleh fungsi
toSimpleString() adalah Wed, 28 02 2018. Dengan demikian, kita bisa
memastikan di dalam fungsi toSimpleString() terdapat kode yang kurang
tepat.
Sekarang coba kita buka kembali kelas Utils dan temukan letak
kesalahan pada fungsi toSimpleString(). Di sana kita menentukan sebuah
pola (pattern) dari SimpleDateFormat dengan "EEE, dd MM yyy", di mana
MM tersebut akan menghasilkan output dari Month dengan format angka,
misal: 02. Format tersebut berbeda dengan format yang kita harapkan,
dan menyebabkan pengujian gagal. Silakan ubah pola dari
SimpleDateFormat menjadi "EEE, dd MMM yyy":
Kotlin
Java
1. @SuppressLint("SimpleDateFormat")
4. }
Pada Codelab kali ini Anda akan menggunakan Junit untuk melakukan
testing pada aplikasi Cuboid atau Balok. Poin penting yang tercakup
dalam materi ini adalah bagaimana cara menggunakan Junit untuk Unit
Test.
Alur Latihan
Berikut alur yang akan kita lakukan dalam latihan kali ini:
Skenario Pengujian
Berikut ini adalah skenario pengujian Unit Test yang akan dilakukan di
Codelab Unit Test menggunakan Mockito:
Language Kotlin/Java
1. android {
2. ...
3.
4. buildTypes {
5. ...
6. }
7.
8. buildFeatures {
9. viewBinding true
10. }
11. }
2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3. xmlns:tools="http://schemas.android.com/tools"
4. android:layout_width="match_parent"
5. android:layout_height="match_parent"
6. android:orientation="vertical"
7. android:padding="16dp"
8. tools:context=".MainActivity">
9.
10. <TextView
11. android:layout_width="match_parent"
12. android:layout_height="wrap_content"
14.
15. <EditText
16. android:id="@+id/edt_length"
17. android:layout_width="match_parent"
18. android:layout_height="wrap_content"
19. android:layout_marginBottom="16dp"
20. android:inputType="numberDecimal"
22.
23. <TextView
24. android:layout_width="match_parent"
25. android:layout_height="wrap_content"
27.
28. <EditText
29. android:id="@+id/edt_width"
30. android:layout_width="match_parent"
31. android:layout_height="wrap_content"
32. android:layout_marginBottom="16dp"
33. android:inputType="numberDecimal"
35.
36. <TextView
37. android:layout_width="match_parent"
38. android:layout_height="wrap_content"
40.
41. <EditText
42. android:id="@+id/edt_height"
43. android:layout_width="match_parent"
44. android:layout_height="wrap_content"
45. android:layout_marginBottom="16dp"
46. android:inputType="numberDecimal"
48.
49. <Button
50. android:id="@+id/btn_save"
51. android:layout_width="match_parent"
52. android:layout_height="wrap_content"
54.
55. <LinearLayout
56. android:layout_width="match_parent"
57. android:layout_height="wrap_content"
58. android:layout_marginBottom="16dp"
59. android:orientation="horizontal">
60.
61. <Button
62. android:id="@+id/btn_calculate_volume"
63. android:layout_width="match_parent"
64. android:layout_height="wrap_content"
65. android:layout_weight="1"
66. android:text="@string/calculate_volume"
68.
69. <Button
70. android:id="@+id/btn_calculate_circumference"
71. android:layout_width="match_parent"
72. android:layout_height="wrap_content"
73. android:layout_weight="1"
74. android:layout_marginStart="8dp"
75. android:layout_marginEnd="8dp"
76. android:text="@string/calculate_circumference"
78.
79. <Button
80. android:id="@+id/btn_calculate_surface_area"
81. android:layout_width="match_parent"
82. android:layout_height="wrap_content"
83. android:layout_weight="1"
84. android:text="@string/calculate_surface_area"
86. </LinearLayout>
87.
88.
89. <TextView
90. android:id="@+id/tv_result"
91. android:layout_width="match_parent"
92. android:layout_height="wrap_content"
93. android:layout_marginBottom="16dp"
94. android:gravity="center"
95. android:text="@string/result"
96. android:textSize="24sp"
98.
99. </LinearLayout>
1. <resources>
2. <string name="app_name">MyUnitTest</string>
3. <string name="width">Lebar</string>
4. <string name="result">Hasil</string>
8. <string name="height">Tinggi</string>
9. <string name="length">Panjang</string>
11. </resources>
Setelah itu buatlah kelas baru dan beri nama CuboidModel dan ketikkan kode
berikut:
Kotlin
Java
1. class CuboidModel {
5.
7.
12.
14. }
15.
17.
22. }
23. }
Lalu buatlah kelas baru dan beri nama MainViewModel dan ketikkan kode
berikut:
Kotlin
Java
3.
5.
7.
9. cuboidModel.save(w, l, h)
10. }
11. }
Kotlin
Java
2.
5.
7. super.onCreate(savedInstanceState
8.
9. activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
10. setContentView(activityMainBinding.root)
11.
13.
14. activityMainBinding.btnSave.setOnClickListener(this)
15.
activityMainBinding.btnCalculateSurfaceArea.setOnClickListener(this)
16.
activityMainBinding.btnCalculateCircumference.setOnClickListener(this)
17. activityMainBinding.btnCalculateVolume.setOnClickListener(this)
18. }
19. }
Selanjutnya tambahkan aksi ketika btnSave dan beberapa button lainnya diklik
dan beri response-nya ketika berhasil. Sehingga MainActivity menjadi seperti
berikut:
Kotlin
Java
2.
5.
7. super.onCreate(savedInstanceState)
8.
9. activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
10. setContentView(activityMainBinding.root)
11.
14. activityMainBinding.btnSave.setOnClickListener(this)
15. activityMainBinding.btnCalculateSurfaceArea.setOnClickListener(this)
16.
activityMainBinding.btnCalculateCircumference.setOnClickListener(this)
17. activityMainBinding.btnCalculateVolume.setOnClickListener(this)
18. }
19.
24.
25. when {
28. }
31. }
34. }
35.
40.
44. visible()
45. }
47. activityMainBinding.tvResult.text =
mainViewModel.getCircumference().toString()
48. gone()
49. }
51. activityMainBinding.tvResult.text =
mainViewModel.getSurfaceArea().toString()
52. gone()
53. }
55. activityMainBinding.tvResult.text =
mainViewModel.getVolume().toString()
56. gone()
57. }
58. }
59. }
60. }
61. }
62.
64. activityMainBinding.btnCalculateVolume.visibility =
View.VISIBLE
65. activityMainBinding.btnCalculateCircumference.visibility =
View.VISIBLE
66. activityMainBinding.btnCalculateSurfaceArea.visibility =
View.VISIBLE
68. }
69.
71. activityMainBinding.btnCalculateVolume.visibility =
View.GONE
72. activityMainBinding.btnCalculateCircumference.visibility =
View.GONE
73. activityMainBinding.btnCalculateSurfaceArea.visibility =
View.GONE
75. }
76. }
o Kotlin
o Java
1. ...
2. dependencies {
3. ...
4.
5. testImplementation 'org.mockito:mockito-core:3.6.0'
6. testImplementation 'org.mockito:mockito-inline:3.6.0'
7. }
Kotlin
Java
1. class MainViewModelTest {
2.
5.
6. @Before
7. fun before() {
8. cuboidModel = mock(CuboidModel::class.java)
9. mainViewModel = MainViewModel(cuboidModel)
10. }
11. }
Selanjutnya Anda akan menguji metode untuk menghitung volume dari
sebuah balok dengan membuat fungsi yang beranotasi @Test,
masukkanlah kode berikut:
Kotlin
Java
1. class MainViewModelTest {
2.
5.
9.
11.
12. @Before
16. }
17.
18. @Test
25. }
26. }
Gagal! Unit test gagal dan menunjukan indikator berwarna merah serta letak
erornya. Terlihat bahwa 'Expected = 500.0' dan 'Actual = 504.0'. Apa
artinya?
Pengujian Anda gagal, sebab ekspektasi mengenai hasil dari volume tersebut
adalah '500.0' sementara hasil sebenarnya adalah '504.0'.
Kotlin
Java
1. private val dummyVolume = 504.0
Catatan:
Angka 0.0001 pada parameter ketiga dalam assertEquals() adalah angka delta
yang merupakan selisih range di belakang koma bilangan double.
Akan ada indikator berwarna hijau. Pesan tests passed menandakan bahwa Unit
Test berhasil.
Kotlin
Java
1. class MainViewModelTest {
2.
5.
9.
13.
14. ...
15.
16. @Test
23. }
24.
25. @Test
32. }
33. }
Kotlin
Java
1. class MainViewModelTest {
2.
3. ...
4.
5. @Test
6. fun testMockVolume() {
7.
`when`(mainViewModel.getVolume()).thenReturn(dummyVolume)
9. verify(cuboidModel).getVolume()
11. }
12.
13. @Test
15.
`when`(mainViewModel.getCircumference()).thenReturn(dummyCi
rcumference)
16. val circumference = mainViewModel.getCircumference()
17. verify(cuboidModel).getCircumference()
19. }
20.
21. @Test
23.
`when`(mainViewModel.getSurfaceArea()).thenReturn(dummySurf
aceArea)
25. verify(cuboidModel).getSurfaceArea()
27. }
28. }
Selesai sudah testing yang dilakukakan, mari kita masuk ke bagian bedah
kode.
Bedah Kode
Anda sudah melewati beberapa latihan untuk melakukan unit test. Pada
Bedah Kode ini Anda akan mendapat penjelasan yang lebih dalam terkait
kode-kode yang digunakan pada latihan unit test.
Kotlin
Java
1. testImplementation 'junit:junit:4.13.2'
2. testImplementation "org.mockito:mockito-core:3.6.0"
3. testImplementation 'org.mockito:mockito-inline:3.6.0'
Dependencies yang digunakan pada latihan tadi adalah JUnit dan Mockito.
JUnit digunakan untuk melakukan unit test, sedangkan Mockito
digunakan sebagai mock object.
Fungsi dari mock object adalah mereplika objek yang digunakan oleh
objek yang sedang di-test. Tujuannya agar test yang dilakukan hanya
dilakukan pada unit yang berada dalam jangkauan objek yang sedang di-
test tanpa memengaruhi objek di luar jangkauan.
1. @Before
Fungsinya untuk menginisialisasi method sebelum melakukan test.
Method yang diberi anotasi @Before ini akan dijalankan sebelum
menjalankan semua method dengan anotasi @Test. Selain anotasi
@Before, dalam melakukan Unit Test juga ada anotasi @After yang
berfungsi sebaliknya dari anotasi @Before, yaitu untuk menginisialisai
method yang akan dijalankan setelah method dengan anotasi @Test.
2. @Test
Anotasi ini digunakan pada method yang akan dites.
1. mock()
Fungsinya untuk membuat obyek mock yang akan menggantikan obyek
yang asli.
2. when()
Digunakan untuk menandakan event di mana Anda ingin memanipulasi
behavior dari mock object.
3. thenReturn()
Digunakan untuk memanipulasi output dari mock object.
4. verify()
Digunakan untuk memeriksa metode dipanggil dengan arguman yang
diberikan. Verify merupkan fungsi dari framework Mockito
5. assertEquals()
Fungsi ini merupakan fungsi dari JUnit yang digunakan untuk memvalidasi
output yang diharapkan dan output yang sebenarnya.
Salah satu titik krusial dalam sebuah proses pengembangan aplikasi, baik
itu pada platform web, desktop, bahkan mobile adalah pada proses
pengujiannya. Pengujian yang baik akan menentukan hasil yang baik
pula.
Ini berpengaruh pada kualitas aplikasi yang dihasilkan. Kita tidak ingin
saat aplikasi sudah ada di tangan pengguna, aplikasi tersebut memberi
pengalaman yang tidak menyenangkan. Terlebih lagi, ketika aplikasinya
mengalami masalah, baik itu force closed maupun application not
responding. Ingat! Aplikasi mobile memiliki biaya akuisisi (acquisition
cost) yang sangat mahal. Meminta atau membuat pengguna mengunduh
dan menggunakan aplikasi bukanlah sesuatu yang murah.
Espresso
1. androidTestImplementation 'androidx.test:rules:1.4.0'
2. androidTestImplementation 'androidx.test:runner:1.4.0'
3. androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
Selain dependensi di atas, konfigurasi lain yang telah ditambahkan adalah
testInstrumentationRunner pada defaultConfig.
1. testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
Supaya materi ini lebih mudah dipahami, mari kita buat skenario
pengujian menggunakan sebuah kasus sederhana. Mari ngoding!
Latihan UI Test Menggunakan Espresso
Tujuan
Pada codelab kali ini Anda akan menguji antar muka dari aplikasi
menggunakan Espresso. Tujuannya agar UI dan UX aplikasi dapat berjalan
dengan benar. Hasil dari codelab kali ini akan menjadi seperti berikut:
Alur Latihan
Berikut alur yang akan kita lakukan dalam latihan kali ini:
1. androidTestImplementation 'androidx.test:runner:1.4.0'
2. androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
3. androidTestImplementation 'androidx.test:rules:1.4.0'
4. androidTestImplementation 'androidx.test.ext:junit:1.1.3'
Kotlin
Java
1. @RunWith(AndroidJUnit4ClassRunner::class)
2. class MainActivityTest {
3. private val dummyVolume = "504.0"
11.
12. @Before
14. ActivityScenario.launch(MainActivity::class.java)
15. }
16. }
Setelah itu, lakukan pengujian keliling balok seperti yang ada di skenario di atas.
Kotlin
Java
1. ...
2. import androidx.test.espresso.Espresso.onView
3. import androidx.test.espresso.action.ViewActions.*
4. import androidx.test.espresso.assertion.ViewAssertions.matches
5. import androidx.test.espresso.matcher.ViewMatchers.*
6.
7. @RunWith(AndroidJUnit4ClassRunner::class)
8. class MainActivityTest {
9. ...
10.
11. @Test
13. onView(withId(R.id.edt_length)).perform(typeText(dummyLength),
closeSoftKeyboard())
14. onView(withId(R.id.edt_width)).perform(typeText(dummyWidth),
closeSoftKeyboard())
15. onView(withId(R.id.edt_height)).perform(typeText(dummyHeight),
closeSoftKeyboard())
16.
17. onView(withId(R.id.btn_save)).check(matches(isDisplayed()))
18. onView(withId(R.id.btn_save)).perform(click())
19.
20.
onView(withId(R.id.btn_calculate_circumference)).check(matches(isDispl
ayed()))
21. onView(withId(R.id.btn_calculate_circumference)).perform(click())
22.
23. onView(withId(R.id.tv_result)).check(matches(isDisplayed()))
24.
onView(withId(R.id.tv_result)).check(matches(withText(dummyCircumfer
ence)))
25. }
26. }
Kotlin
Java
Kemudian pilih import sesuai dengan keterangan di atas.
Lalu pilih peranti yang terhubung dan akan menjadi tempat pengujian
aplikasi.
Perhatikan peranti Anda selama pengujian berlangsung.
Setelah berjalan, perhatikan monitor panel yang aktif di bagian bawah Android
Studio . Panel tersebut berisi informasi progress pengujian. Jika semua pengujian
yang dilakukan berhasil, layar akan menampilkan hasil sukses seperti berikut:
1. @RunWith(AndroidJUnit4ClassRunner::class)
2. class MainActivityTest {
3. ...
4.
5. @Test
6. fun assertGetSurfaceArea() {
7. onView(withId(R.id.edt_length)).perform(typeText(dummyLength),
closeSoftKeyboard())
8. onView(withId(R.id.edt_width)).perform(typeText(dummyWidth),
closeSoftKeyboard())
9. onView(withId(R.id.edt_height)).perform(typeText(dummyHeight),
closeSoftKeyboard())
10.
11. onView(withId(R.id.btn_save)).check(matches(isDisplayed()))
12. onView(withId(R.id.btn_save)).perform(click())
13.
14.
onView(withId(R.id.btn_calculate_surface_area)).check(matches(isDispla
yed()))
15. onView(withId(R.id.btn_calculate_surface_area)).perform(click())
16.
17. onView(withId(R.id.tv_result)).check(matches(isDisplayed()))
18.
onView(withId(R.id.tv_result)).check(matches(withText(dummySurfaceAr
ea)))
19. }
20.
21. @Test
24. onView(withId(R.id.edt_width)).perform(typeText(dummyWidth),
closeSoftKeyboard())
25. onView(withId(R.id.edt_height)).perform(typeText(dummyHeight),
closeSoftKeyboard())
26.
27. onView(withId(R.id.btn_save)).check(matches(isDisplayed()))
28. onView(withId(R.id.btn_save)).perform(click())
29.
30.
onView(withId(R.id.btn_calculate_volume)).check(matches(isDisplayed())
)
31. onView(withId(R.id.btn_calculate_volume)).perform(click())
32.
33. onView(withId(R.id.tv_result)).check(matches(isDisplayed()))
34.
onView(withId(R.id.tv_result)).check(matches(withText(dummyVolume)))
35. }
36.
38. @Test
41. onView(withId(R.id.edt_length)).perform(typeText(emptyInput),
closeSoftKeyboard())
42.
43. onView(withId(R.id.btn_save)).check(matches(isDisplayed()))
44. onView(withId(R.id.btn_save)).perform(click())
45.
46.
onView(withId(R.id.edt_length)).check(matches(hasErrorText(fieldEmpty
)))
47. onView(withId(R.id.edt_length)).perform(typeText(dummyLength),
closeSoftKeyboard())
48.
50. onView(withId(R.id.edt_width)).perform(typeText(emptyInput),
closeSoftKeyboard())
51.
52. onView(withId(R.id.btn_save)).check(matches(isDisplayed()))
53. onView(withId(R.id.btn_save)).perform(click())
54.
55.
onView(withId(R.id.edt_width)).check(matches(hasErrorText(fieldEmpty)
))
56. onView(withId(R.id.edt_width)).perform(typeText(dummyWidth),
closeSoftKeyboard())
57.
59. onView(withId(R.id.edt_height)).perform(typeText(emptyInput),
closeSoftKeyboard())
60.
61. onView(withId(R.id.btn_save)).check(matches(isDisplayed()))
62. onView(withId(R.id.btn_save)).perform(click())
63.
64.
onView(withId(R.id.edt_height)).check(matches(hasErrorText(fieldEmpty
)))
65. onView(withId(R.id.edt_height)).perform(typeText(dummyHeight),
closeSoftKeyboard())
66.
67. onView(withId(R.id.btn_save)).check(matches(isDisplayed()))
68. onView(withId(R.id.btn_save)).perform(click())
69. }
70. }
Kotlin
Java
1. edtWidth = findViewById(R.id.edt_width)
Coba jalankan kode test seperti cara sebelumnya. Seharusnya proses pengujian
akan gagal. Anda dapat mengetahui pesan dan penyebab kegagalan pada
monitor panel seperti berikut:
3.
4. with id: com.dicoding.picodiploma.myunittest:id/btn_save'.
5. at
android.support.test.espresso.PerformException$Builder.build(PerformExc
eption.java:82)
6. ...
7. at
android.support.test.espresso.ViewInteraction.perform(ViewInteraction.jav
a:114)
8. at
com.dicoding.picodiploma.myunittest.MainActivityTest.assertSurfaceArea(
MainActivityTest.java:58)
9. at java.lang.reflect.Method.invoke(Native Method)
10. ...
11. at
android.app.Instrumentation$InstrumentationThread.run(Instrumentation.j
ava:2145)
13. at
com.dicoding.picodiploma.myunittest.MainActivity.onClick(MainActivity.jav
a:46)
14. at android.view.View.performClick(View.java:6597)
Bedah Kode
Espresso
Sebelumnya, kita perlu ingat kembali tiga komponen utama dari Espresso:
Kita akan membedah kode yang baru saja kita buat berdasarkan skenario
yang kita buat.
Kotlin
Java
1. @Before
2. fun setup(){
3. ActivityScenario.launch(MainActivity::class.java)
4. }
Kotlin
Java
1. onView(withId(R.id.edt_length)).perform(typeText(dummyLength),
closeSoftKeyboard())
Perhatikan kode di atas, jika kode di atas dibaca maka jadi seperti
ini: Sebuah view dengan id edt_length diberi tindakan input dengan
sebuah teks dummyLength dan menutup secara berlahan keyboard
Android. Jadi terdapat banyak aksi di dalam komponen Espresso.
Kotlin
Java
1. onView(withId(R.id.btn_save)).check(matches(isDisplayed()))
Jika kode di atas dibaca akan menjadi seperti ini: Memastikan sebuah
view dengan id btn_save dalam keadaan tampil.
Kotlin
Java
1. onView(withId(R.id.btn_save)).perform(click())
Jika kode di atas dibaca, akan menjadi seperti ini: Sebuah view dengan
id btn_save diberi aksi klik.
Kotlin
Java
1. onView(withId(R.id.tv_result)).check(matches(withText(dummyCircumference)))
Jika kode di atas dibaca, akan menjadi seperti berikut: Memastikan
sebuah view dengan id tv_result mempunyai teks yang sama
dengan dummyCircumference.
Perhatikan juga kode berikut yang berfungsi untuk mengecek eror pada
EditText:
Kotlin
Java
1. onView(withId(R.id.edt_length)).check(matches(hasErrorText(fieldEmpty)))
Apalagi bila Anda menulis kode test sebelum kode aplikasi. Proses
pengembangan aplikasi Anda dijamin jauh lebih baik dan mampu
menghasilkan produk yang lebih berkualitas! Proses pengujian otomatis di
atas masih sangatlah sederhana. Kami tantang Anda untuk
mengeksplorasi lebih jauh kemampuan Espresso lainnya!
Seperti biasa, agar Anda lebih paham tentang materi ini, kami sarankan
untuk membaca referensi dari beberapa tautan berikut:
Espresso Testing
Espresso Test Recorder
Running Espresso Test
UI Testing with Espresso