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) để xác nhận hoặc thực hiện hành động đối với các câu lệnh đó.
  • 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 API nút trong cây ngữ nghĩa.

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

Bạn có thể dùng onNodeonAllNodes để chọn một hoặc nhiều nút nhưng bạn cũng có thể sử dụng trình tìm kiếm tiện lợi cho những cụm từ phổ biến nhất tìm kiếm, 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 dữ liệu 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 được trả về bởi trình tìm kiếm có 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)

Hiện có nhiều trình so khớp để kiểm thử 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: Kiểm thử chính trên Android trang đích cung cấp cái nhìn rộng hơn về các nguyên tắc và kỹ thuật thử nghiệm.
  • Nguyên tắc cơ bản về việc 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ử trên máy trạm của riêng bạn.
  • Kiểm thử đo lường: Kết quả này phù hợp để chạy cả các kiểm thử đo lường. Tức là các thử nghiệm chạy trực tiếp trên thiết bị.
  • Tích hợp liên tục: Khả năng tích hợp liên tục giúp bạn tích hợp các bài kiểm thử vào hoạt động triển khai quy trình.
  • Thử nghiệm nhiều kích thước màn hình: Bằng một số thiết bị có sẵn cho người dùng, bạn nên thử nghiệm các màn hình khác nhau kích thước.
  • Espresso: Mặc dù dành cho phương pháp dựa trên Khung hiển thị Giao diện người dùng, kiến thức về Espresso vẫn có thể hữu ích cho một số khía cạnh của Compose kiểm thử.