Pelajaran 6: Menguji UI Anda
Demo Testing Aplikasi menggunakan Espresso
6.1 Menggunakan Espresso
Tugas 1: Siapkan Espresso di proyek Anda
1.1 Periksa Android Support Repository
- Mulai Android Studio dan pilih Tools > Android > SDK Manager.
- Klik tab SDK Tools dan cari Support Repository.
1.2 Konfigurasi Espresso untuk proyek
- Buka proyek TwoActivities atau jika ingin, buat salinan proyek terlebih dulu lalu buka salinannya. Lihat Menyalin dan mengubah nama proyek di Apendiks untuk mendapatkan petunjuk.
- Buka file build.gradle (Module: app).
- Periksa apakah yang berikut ini disertakan (bersama dengan dependensi lain) di bagian dependencies file build.gradle (Module: app) proyek:
androidTestCompile
(‘com.android.support.test.espresso:espresso-core:2.2.2’, {
exclude group: ‘com.android.support’, module: ‘support-annotations’
})
testCompile ‘junit:junit:4.12’
- Android Studio 2.2 juga menambahkan pernyataan instrumentasi berikut di akhir bagian defaultConfig proyek baru:
testInstrumentationRunner
“android.support.test.runner.AndroidJUnitRunner”
- Kemudian klik Sync Now
- Hasil Akhir seperti berikut
1.3 Matikan animasi di perangkat pengujian Anda
- Cari Developer Options.
- Kemudian cari bagianDrawing. Di bagian ini, nonaktifkan opsi berikut:
- Skala animasi jendela
- Skala animasi transisi
- Skala durasi animator
Tugas 2: Lakukan pengujian pengalihan aplikasi dan
memasukkan teks
2.1 Definisikan kelas untuk pengujian dan siapkan aktivitas
- Luaskan com.example.android.twoactivities (androidTest), dan buka ExampleInstrumentedTest.
- Untuk membuat pengujian lebih mudah dipahami dan menjelaskan apa yang dilakukan, ganti nama kelas dari ExampleInstrumentedTest menjadi berikut: public class ActivityInputOutputTest
- Ubah definisi kelas menjadi berikut:
@RunWith(AndroidJUnit4.class)
public class ActivityInputOutputTest {
@Rule
public ActivityTestRule mActivityRule = new ActivityTestRule<>(
MainActivity.class);
}
Hasilnya akan seperti berikut:
2.2 Uji aktivitas pengalihan:
- Tambahkan metode activityLaunch() ke ActivityInputOutputTest untuk menguji apakah tampilan muncul saat mengeklik tombol sertakan notasi @Test pada baris tepat di atas metode:
@Test
public void activityLaunch() { … }
Anotasi @Test memberi tahu JUnit bahwa metode public void yang menjadi tempat pengaitan bisa dijalankan
- Tambahkan ekspresi ViewMatcher dan ViewAction ke metode activityLaunch() untuk menemukan tampilan yang berisi tombol button_main , dan menyertakan ekspresi ViewAction untuk melakukan klik:
onView(withId(R.id.button_main)).perform(click());
Metode onView() memungkinkan Anda menggunakan argumen ViewMatcher untuk menemukan tampilan.
- Dalam pernyataan onView di atas, onView , withID , dan click
- Tambahkan ekspresi ViewMatcher ke metode activityLaunch() untuk menemukan tampilan text_header (yang berada dalam aktivitas Second ) dan sebuah ekspresi untuk melakukan pemeriksaan untuk melihat apakah tampilan ditampilkan:
onView(withId(R.id.text_header)).check(matches(isDisplayed()));
Pernyataan ini menggunakan metode onView() untuk menemukan tampilan text_header untuk aktivitas Second dan memeriksa untuk melihat apakah tampilan ini ditampilkan setelah mengeklik tampi button_main .
- Dalam pernyataan onView di atas, metode check()
- Tambahkan pernyataan yang sama untuk menguji apakah mengeklik tombol button_second di aktivitas Second akan mengalihkan ke aktivitas Main :
onView(withId(R.id.button_second)).perform(click());
onView(withId(R.id.text_header_reply)).check(matches(isDisplayed()));
- Tinjau metode activityLaunch() yang baru Anda buat di kelas ActivityInputOutputTest . Akan terlihat seperti ini:
@Test
public void activityLaunch() {
onView(withId(R.id.button_main)).perform(click());
onView(withId(R.id.text_header)).check(matches(isDisplayed()));
onView(withId(R.id.button_second)).perform(click());
onView(withId(R.id.text_header_reply)).check(matches(isDisplayed()));
}
- Untuk menjalankan pengujian, klik kanan (atau Control-klik) ActivityInputOutputTest dan pilih Run ActivityInputOutputTest dari menu munculan. Anda kemudian bisa memilih untuk menjalankan pengujian pada emulator atau pada perangkat Anda.
Hasilnya akan seperti berikut :
2.3 Uji masukan dan keluaran teks
- Tambahkan anotasi @Test lain dan metode textInputOutput() baru ke kelas ApplicationTest untuk menguji masukan dan keluaran teks:
@Test
public void textInputOutput() {
onView(withId(R.id.editText_main)).perform(typeText(“This is a test.”));
onView(withId(R.id.button_main)).perform(click());
}
Metode di atas menggunakan ViewMatcher untuk menemukan tampilan yang berisi tampilan editText_main dan
sebuah ViewAction untuk memasukkan teks “This is a test.” . Metode kemudian menggunakan ViewMatcher lainnya untuk menemukan tampilan yang berisi tombol button_main dan ViewAction lainnya untuk mengeklik tombol.
- Tambahkan ViewMatcher untuk menemukan tampilan text_message aktivitas Second dan ViewAssertion untuk melihat apakah keluaran cocok dengan masukan untuk menguji apakah pesan dikirimkan dengan benar:
onView(withId(R.id.text_message)).check(matches(withText(“This is a test.”)));
2.4 Berikan kesalahan untuk menampilkan bahwa pengujian gagal
- Ubah pemeriksaan kecocokan pada tampilan text_message dari “This is a test.” ke “This is a failing test.” :
onView(withId(R.id.text_message)).check(matches(withText(“This is a failing test.”)));
- Jalankan pengujian lagi. Kali ini, Anda akan melihat pesan berwarna merah, “1 test failed”, di atas panel bawah dan tanda seru merah di sebelah textInputOutput di kolom kiri.
Seperti dibawah ini:
Tugas 3: Uji tampilan pilihan spinner
3.1 Buat metode pengujian
- Buka proyek PhoneNumberSpinner
- Konfigurasi Espresso di proyek Anda seperti yang dijelaskan sebelumnya.
- Luaskan com.example.android.phonenumberspinner (androidTest) dan buka ExampleInstrumentedTest.
- Ganti nama ExampleInstrumentedTest menjadi SpinnerSelectionTest di definisi kelas dan tambahkan yang berikut ini:
@RunWith(AndroidJUnit4.class)
public class SpinnerSelectionTest {
@Rule
public ActivityTestRule mActivityRule = new ActivityTestRule<>(
MainActivity.class);
}
- Buat metode iterateSpinnerItems() sebagai public yang mengembalikan void .
3.2 Akses larik yang digunakan untuk item spinner
- Tetapkan larik yang digunakan untuk item spinner ke larik baru untuk digunakan di dalam metode
iterateSpinnerItems() :
public void iterateSpinnerItems() {
String[] myArray =
mActivityRule.getActivity().getResources()
.getStringArray(R.array.labels_array);
}
Pada pernyataan di atas, pengujian mengakses larik aplikasi (dengan id labels_array ) dengan membuat konteks dengan metode getActivity() kelas ActivityTestRule dan mendapatkan instance sumber daya di paket aplikasi menggunakan getResources() .
- Tetapkan panjang larik ke size dan buat loop for menggunakan size sebagai jumlah maksimum untuk penghitung.
int size = myArray.length;
for (int i=0; i<size; i++) {
}
3.3 Temukan item spinner dan klik item ini
- Tambahkan pernyataan onView() di dalam loop for untuk menemukan spinner dan klik spinner:
// Find the spinner and click on it.
onView(withId(R.id.label_spinner)).perform(click());
Pengguna harus mengeklik spinner itu sendiri untuk mengeklik item apa pun di spinner, sehingga pengujian Anda juga harus mengeklik spinner terlebih dulu sebelum mengeklik item.
- Tuliskan pernyataan onData() untuk menemukan dan mengeklik item spinner:
// Find the spinner item and click on it.
onData(is(myArray[i])).perform(click());
- Tambahkan dua pernyataan onView() lagi ke loop for:
// Find the Submit button and click on it.
onView(withId(R.id.button_main)).perform(click());
// Find the text view and check that the spinner item
// is part of the string.
onView(withId(R.id.text_phonelabel))
.check(matches(withText(containsString(myArray[i]))));
- Untuk menjalankan pengujian, klik kanan (atau Control-klik) SpinnerSelectionTest dan pilih Run SpinnerSelectionTest dari menu munculan. Anda kemudian bisa memilih untuk menjalankan pengujian pada emulator atau pada perangkat Anda.
Hasilnya akan seperti dibawah ini
Tugas 4: Rekam pengujian RecyclerView
4.1 Buka dan jalankan aplikasi
- Buka proyek RecyclerView
- Konfigurasi Espresso di proyek Anda seperti yang dijelaskan sebelumnya.
- Jalankan aplikasi untuk memastikan agar berjalan dengan benar. Anda bisa menggunakan emulator
4.2 Rekam pengujian
- Pilih Run > Record Espresso Test, pilih target penerapan Anda (emulator atau perangkat) dan klik OK.
- Gulirkan daftar kata di aplikasi pada emulator atau perangkat dan ketuk Word 4. Jendela Record Your Test menampilkan tindakan yang direkam (“Ketuk RecyclerView dengan posisi elemen 4”).
- ketuk Word 10. Jendela Record Your Test menampilkan tindakan yang direkam (“Ketuk RecyclerView dengan posisi elemen 10”).
- Klik Add Assertion di jendela Record Your Test. Tangkapan layar UI aplikasi muncul di panel sebelah kanan jendela.
- Pilih Clicked! Word 6 di tangkapan layar sebagai elemen UI yang ingin Anda periksa.
- Klik Save Assertion lalu klik Complete
- Edit nama pengujian menjadi RecyclerViewTest sehingga tujuan pengujian mudah dipahami.
- Klik Yes untuk menambahkan dependensi.
Dan Testing pun akan otomatis terbuat seperti ini:
@LargeTest
@RunWith(AndroidJUnit4.class)
public class RecyclerViewTest {@Rule
public ActivityTestRule<MainActivity> mActivityTestRule = new ActivityTestRule<>(MainActivity.class);@Test
public void recyclerViewTest() {
ViewInteraction recyclerView = onView(
allOf(withId(R.id.recyclerview),
childAtPosition(
withClassName(is(“android.support.design.widget.CoordinatorLayout”)),
0)));
recyclerView.perform(actionOnItemAtPosition(4, click()));ViewInteraction recyclerView2 = onView(
allOf(withId(R.id.recyclerview),
childAtPosition(
withClassName(is(“android.support.design.widget.CoordinatorLayout”)),
0)));
recyclerView2.perform(actionOnItemAtPosition(10, click()));ViewInteraction textView = onView(
allOf(withId(R.id.word), withText(“Word 6”),
childAtPosition(
childAtPosition(
withId(R.id.recyclerview),
6),
0),
isDisplayed()));
textView.check(matches(withText(“Word 6”)));}
private static Matcher<View> childAtPosition(
final Matcher<View> parentMatcher, final int position) {return new TypeSafeMatcher<View>() {
@Override
public void describeTo(Description description) {
description.appendText(“Child at position ” + position + ” in parent “);
parentMatcher.describeTo(description);
}@Override
public boolean matchesSafely(View view) {
ViewParent parent = view.getParent();
return parent instanceof ViewGroup && parentMatcher.matches(parent)
&& view.equals(((ViewGroup) parent).getChildAt(position));
}
};
}
}
- Jalankan Pengujian
Hasilnya akan seperti dibawah ini
Leave a Reply