API Kiểm thử

Có ba cách chính để tương tác với các thành phần 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) để tạo ra câu nhận định (assertion) hoặc thực hiện hành động 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 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 để thuận tiện hơn, bạn cũng có thể sử dụng các trình tìm kiếm đối với những 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 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ó hai 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")
}

Từ một quy trình kiểm thử, hãy sử dụng printToLog() để hiển thị 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ụ: ở đoạn mã sau, 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)

Bạn có thể kiểm tra các câu nhận định bằng cách gọi hàm assert() trên SemanticsNodeInteraction được trả về bởi trình tìm kiếm với 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 với những 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 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)

Có 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 đi lên hoặc xuống trên 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 Kiểm thử Compose.

Tài nguyên khác

  • Kiểm thử ứng dụng trên Android: Trang đích chính về kiểm thử Android cung cấp thông tin tổng quan hơn về các nguyên tắc và kỹ thuật kiểm thử.
  • Kiến thức cơ bản về kiểm thử: Tìm hiểu thêm về các khái niệm cốt lõi đằng sau việc kiểm thử ứng dụng Android.
  • Kiểm thử cục bộ: Bạn có thể chạy một số bài 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 kiểm thử đo lường. Tức là các kiểm thử chạy trực tiếp trên thiết bị.
  • Tích hợp liên tục: Tích hợp liên tục cho phép bạn tích hợp các chương trình kiểm thử vào quy trình triển khai.
  • Kiểm thử nhiều kích thước màn hình: Khi người dùng có nhiều thiết bị, 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 hoạt động kiểm thử Compose.