API Pengujian

Ada tiga cara utama untuk berinteraksi dengan elemen UI:

  • Finder memungkinkan Anda memilih satu atau beberapa elemen (atau node dalam semantik) untuk membuat pernyataan atau melakukan tindakan pada pernyataan 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 masing-masing, tetapi Anda juga dapat menggunakan pencari kemudahan untuk penelusuran, seperti onNodeWithText, dan onNodeWithContentDescription. Anda dapat menjelajahi daftar lengkapnya 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 dipisahkan

Beberapa node menggabungkan informasi semantik turunannya. Sebagai contoh, 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() di SemanticsNodeInteraction dikembalikan 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 yang paling umum, seperti assertExists, assertIsDisplayed, dan assertTextEquals. Anda dapat menjelajahi daftar lengkapnya 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 Compose Anda pada kode sumber.

Matcher hierarki

Pencocok hierarki memungkinkan Anda naik atau turun pencocokan luas.

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 lengkapnya di tips praktis Pengujian Compose.

Referensi Tambahan

  • Menguji aplikasi di Android: 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 {i>workstation<i} Anda sendiri.
  • Pengujian berinstrumen: Bagus juga untuk menjalankan uji instrumentasi. Yaitu, pengujian yang berjalan secara langsung di perangkat.
  • Continuous integration: Dengan continuous integration, Anda dapat mengintegrasikan pengujian ke dalam deployment {i>pipelines<i} yang sama.
  • Menguji berbagai ukuran layar: Dengan beberapa perangkat yang tersedia untuk pengguna, Anda harus mengujinya pada layar ukuran.
  • Espresso: Meskipun ditujukan untuk berbasis View UI, pengetahuan Espresso masih dapat membantu untuk beberapa aspek Compose pengujian.