Có 3 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 câu nhận định 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 onNode
và onAllNodes
để 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ư onNodeWithText
và onNodeWithContentDescription
. 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ó 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")
}
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
, assertIsDisplayed
và assertTextEquals
.
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 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.
- 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í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 hoạt động kiểm thử Compose.