API Kiểm thử

Có 3 cách chính để tương tác với các phần tử trên giao diện người dùng:

  • Trình tìm kiếm cho phép bạn chọn một hoặc nhiều phần tử (hoặc nút trong cây ngữ nghĩa) để đưa ra câu nhận định hoặc thực hiện thao tác đối với các phần tử đó.
  • Câu nhận định (Assertion) dùng để xác minh rằng các phần tử đó tồn tại hoặc có một số thuộc tính nhất định.
  • Hành động (Action) sẽ chèn các sự kiện người dùng được mô phỏng trên các phần tử, chẳng hạn như lượt nhấp hoặc các cử chỉ khác.

Một số API này chấp nhận một SemanticsMatcher để tham chiếu đến một hoặc nhiều nút trong cây ngữ nghĩa.

Trình tìm kiếm (Finder)

Bạn có thể sử dụng onNodeonAllNodes để chọn một hoặc nhiều nút tương ứng, nhưng bạn cũng có thể sử dụng trình tìm kiếm tiện lợi cho các nội dung tìm kiếm phổ biến nhất, chẳng hạn như onNodeWithTextonNodeWithContentDescription. Bạn có thể duyệt qua danh sách đầy đủ trong Bản tóm tắt về Kiểm thử Compose.

Chọn một nút (node)

composeTestRule.onNode(<<SemanticsMatcher>>, useUnmergedTree = false): SemanticsNodeInteraction
// Example
composeTestRule
    .onNode(hasText("Button")) // Equivalent to onNodeWithText("Button")

Chọn nhiều nút (node)

composeTestRule
    .onAllNodes(<<SemanticsMatcher>>): SemanticsNodeInteractionCollection
// Example
composeTestRule
    .onAllNodes(hasText("Button")) // Equivalent to onAllNodesWithText("Button")

Cây chưa hợp nhất

Một số nút hợp nhất thông tin ngữ nghĩa của các nút con. Ví dụ: một nút có 2 phần tử văn bản sẽ hợp nhất các nhãn phần tử văn bản:

MyButton {
    Text("Hello")
    Text("World")
}

Trong một quy trình kiểm thử, hãy sử dụng printToLog() để hiện cây ngữ nghĩa:

composeTestRule.onRoot().printToLog("TAG")

Mã này in ra kết quả sau:

Node #1 at (...)px
 |-Node #2 at (...)px
   Role = 'Button'
   Text = '[Hello, World]'
   Actions = [OnClick, GetTextLayoutResult]
   MergeDescendants = 'true'

Nếu cần so khớp với một nút của cây chưa hợp nhất, bạn có thể thiết lập useUnmergedTree thành true:

composeTestRule.onRoot(useUnmergedTree = true).printToLog("TAG")

Mã này in ra kết quả sau:

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]'

Tham số useUnmergedTree có sẵn trong tất cả trình tìm kiếm. Ví dụ: ở đây, tham số này được dùng trong trình tìm kiếm onNodeWithText.

composeTestRule
    .onNodeWithText("World", useUnmergedTree = true).assertIsDisplayed()

Câu nhận định (Assertion)

Kiểm tra câu nhận định bằng cách gọi assert() trên SemanticsNodeInteraction do trình tìm kiếm trả về bằng một hoặc nhiều trình so khớp:

// 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"))

Bạn cũng có thể sử dụng các hàm tiện lợi cho các câu nhận định phổ biến nhất, chẳng hạn như assertExists, assertIsDisplayedassertTextEquals. Bạn có thể duyệt qua danh sách đầy đủ trong Bản tóm tắt về Kiểm thử Compose.

Ngoài ra còn có các hàm để kiểm tra các câu nhận định trên một tập hợp các nút:

// 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())

Hành động (Action)

Để chèn một hành động trên một nút, hãy gọi hàm perform…():

composeTestRule.onNode(...).performClick()

Dưới đây là một số ví dụ về hành động:

performClick(),
performSemanticsAction(key),
performKeyPress(keyEvent),
performGesture { swipeLeft() }

Bạn có thể duyệt qua danh sách đầy đủ trong Bản tóm tắt Kiểm thử Compose.

Trình so khớp (Matcher)

Bạn có thể sử dụng nhiều trình so khớp để kiểm thử mã Compose.

Trình so khớp phân cấp (Hierarchical matcher)

Trình so khớp phân cấp cho phép bạn di chuyển lên hoặc xuống cây ngữ nghĩa và thực hiện so khớp.

fun hasParent(matcher: SemanticsMatcher): SemanticsMatcher
fun hasAnySibling(matcher: SemanticsMatcher): SemanticsMatcher
fun hasAnyAncestor(matcher: SemanticsMatcher): SemanticsMatcher
fun hasAnyDescendant(matcher: SemanticsMatcher):  SemanticsMatcher

Dưới đây là một số ví dụ về các trình so khớp đang được sử dụng:

composeTestRule.onNode(hasParent(hasText("Button")))
    .assertIsDisplayed()

Trình chọn (Selector)

Một cách khác để tạo quy trình kiểm thử là sử dụng các trình chọn (selector), việc này có thể làm cho một số quy trình kiểm thử dễ đọc hơn.

composeTestRule.onNode(hasTestTag("Players"))
    .onChildren()
    .filter(hasClickAction())
    .assertCountEquals(4)
    .onFirst()
    .assert(hasText("John"))

Bạn có thể duyệt qua danh sách đầy đủ trong Bản tóm tắt về Kiểm thử Compose.

Tài nguyên khác

  • Kiểm thử ứng dụng trên Android: Trang đích kiểm thử ứng dụng chính trên Android cung cấp cái nhìn bao quát hơn về các nguyên tắc và kỹ thuật kiểm thử cơ bản.
  • Nguyên tắc cơ bản về kiểm thử: Tìm hiểu thêm về các khái niệm chính của việc kiểm thử ứng dụng Android.
  • Kiểm thử cục bộ: Bạn có thể chạy một số kiểm thử cục bộ trên máy trạm của riêng mình.
  • Kiểm thử đo lường: Bạn cũng nên chạy các kiểm thử đo lường. Tức là các chương trình kiểm thử chạy trực tiếp trên thiết bị.
  • Tích hợp liên tục: Tính năng tích hợp liên tục cho phép bạn tích hợp các hoạt động kiểm thử vào quy trình triển khai.
  • Kiểm thử nhiều kích thước màn hình: Với nhiều thiết bị được cung cấp cho người dùng, bạn nên kiểm thử nhiều kích thước màn hình.
  • Espresso: Mặc dù dành cho giao diện người dùng dựa trên Khung hiển thị, nhưng kiến thức về Espresso vẫn có thể hữu ích cho một số khía cạnh của kiểm thử Compose.