Ada tiga cara utama untuk berinteraksi dengan elemen UI:
- Pencari memungkinkan Anda memilih satu atau beberapa elemen (atau node dalam pohon semantik) untuk membuat pernyataan atau melakukan tindakan pada elemen tersebut.
- Pernyataan digunakan untuk memverifikasi bahwa elemen tersebut ada atau memiliki atribut tertentu.
- Tindakan memasukkan simulasi peristiwa pengguna ke dalam elemen, seperti klik atau gestur lainnya.
Beberapa API ini menerima SemanticsMatcher
untuk merujuk ke satu atau beberapa
node dalam hierarki semantik.
Pencari
Anda dapat menggunakan onNode
dan onAllNodes
untuk memilih satu atau beberapa node, tetapi Anda juga dapat menggunakan pencari praktis untuk penelusuran
yang paling umum, seperti onNodeWithText
, dan
onNodeWithContentDescription
. Anda dapat menjelajahi daftar lengkap di
Tips praktis Pengujian Compose.
Memilih node tunggal
composeTestRule.onNode(<<SemanticsMatcher>>, useUnmergedTree = false): SemanticsNodeInteraction
// Example
composeTestRule
.onNode(hasText("Button")) // Equivalent to onNodeWithText("Button")
Memilih beberapa node
composeTestRule
.onAllNodes(<<SemanticsMatcher>>): SemanticsNodeInteractionCollection
// Example
composeTestRule
.onAllNodes(hasText("Button")) // Equivalent to onAllNodesWithText("Button")
Hierarki yang dipisahkan
Beberapa node menggabungkan informasi semantik turunannya. Misalnya, tombol dengan dua elemen teks akan menggabungkan label elemen teks:
MyButton {
Text("Hello")
Text("World")
}
Dari pengujian, gunakan printToLog()
untuk menampilkan hierarki semantik:
composeTestRule.onRoot().printToLog("TAG")
Kode ini mencetak output berikut:
Node #1 at (...)px
|-Node #2 at (...)px
Role = 'Button'
Text = '[Hello, World]'
Actions = [OnClick, GetTextLayoutResult]
MergeDescendants = 'true'
Jika Anda harus mencocokkan node dari pohon terpisah, Anda dapat menetapkan
useUnmergedTree
ke true
:
composeTestRule.onRoot(useUnmergedTree = true).printToLog("TAG")
Kode ini mencetak output berikut:
Node #1 at (...)px
|-Node #2 at (...)px
OnClick = '...'
MergeDescendants = 'true'
|-Node #3 at (...)px
| Text = '[Hello]'
|-Node #5 at (83.0, 86.0, 191.0, 135.0)px
Text = '[World]'
Parameter useUnmergedTree
tersedia di semua pencari. Misalnya, di sini digunakan dalam pencari onNodeWithText
.
composeTestRule
.onNodeWithText("World", useUnmergedTree = true).assertIsDisplayed()
Pernyataan
Periksa pernyataan dengan memanggil assert()
pada SemanticsNodeInteraction
yang ditampilkan oleh pencari dengan satu atau beberapa matcher:
// Single matcher:
composeTestRule
.onNode(matcher)
.assert(hasText("Button")) // hasText is a SemanticsMatcher
// Multiple matchers can use and / or
composeTestRule
.onNode(matcher).assert(hasText("Button") or hasText("Button2"))
Anda juga dapat menggunakan fungsi praktis untuk pernyataan paling umum, seperti
assertExists
, assertIsDisplayed
, dan assertTextEquals
.
Anda dapat menjelajahi daftar lengkap di Tips praktis Pengujian Compose.
Ada juga fungsi untuk memeriksa pernyataan pada kumpulan node:
// Check number of matched nodes
composeTestRule
.onAllNodesWithContentDescription("Beatle").assertCountEquals(4)
// At least one matches
composeTestRule
.onAllNodesWithContentDescription("Beatle").assertAny(hasTestTag("Drummer"))
// All of them match
composeTestRule
.onAllNodesWithContentDescription("Beatle").assertAll(hasClickAction())
Tindakan
Untuk memasukkan tindakan pada node, panggil fungsi perform…()
:
composeTestRule.onNode(...).performClick()
Berikut ini beberapa contoh tindakan:
performClick(),
performSemanticsAction(key),
performKeyPress(keyEvent),
performGesture { swipeLeft() }
Anda dapat menjelajahi daftar lengkap di Tips praktis Pengujian Compose.
Matcher
Berbagai matcher tersedia untuk menguji kode Compose Anda.
Matcher hierarki
Matcher hierarki memungkinkan Anda naik atau turun pohon semantik dan melakukan pencocokan.
fun hasParent(matcher: SemanticsMatcher): SemanticsMatcher
fun hasAnySibling(matcher: SemanticsMatcher): SemanticsMatcher
fun hasAnyAncestor(matcher: SemanticsMatcher): SemanticsMatcher
fun hasAnyDescendant(matcher: SemanticsMatcher): SemanticsMatcher
Berikut ini beberapa contoh matcher yang digunakan:
composeTestRule.onNode(hasParent(hasText("Button")))
.assertIsDisplayed()
Pemilih
Cara alternatif untuk membuat pengujian adalah dengan menggunakan pemilih yang dapat membuat beberapa pengujian lebih mudah dibaca.
composeTestRule.onNode(hasTestTag("Players"))
.onChildren()
.filter(hasClickAction())
.assertCountEquals(4)
.onFirst()
.assert(hasText("John"))
Anda dapat menjelajahi daftar lengkap di Tips praktis Pengujian Compose.
Referensi Tambahan
- Menguji aplikasi di Android: Halaman landing pengujian Android utama memberikan pandangan yang lebih luas tentang dasar-dasar dan teknik pengujian.
- Dasar-dasar pengujian: Pelajari lebih lanjut konsep inti di balik pengujian aplikasi Android.
- Pengujian lokal: Anda dapat menjalankan beberapa pengujian secara lokal, di workstation Anda sendiri.
- Pengujian berinstrumen: Sebaiknya jalankan juga uji instrumentasi. Artinya, pengujian yang berjalan langsung di perangkat.
- Continuous integration: Continuous integration memungkinkan Anda mengintegrasikan pengujian ke dalam pipeline deployment.
- Menguji berbagai ukuran layar: Dengan banyak perangkat yang tersedia bagi pengguna, Anda harus menguji berbagai ukuran layar.
- Espresso: Meskipun ditujukan untuk UI berbasis View, pengetahuan Espresso masih dapat membantu untuk beberapa aspek pengujian Compose.