UI 요소와 상호작용하는 방법은 크게 세 가지가 있습니다.
- 파인더를 사용하면 하나 이상의 요소 (또는 검색 엔진의 노드 시맨틱 트리)를 기반으로 어설션을 만들거나 이에 대한 작업을 실행할 수 있습니다.
- 어설션은 요소가 있는지 또는 특정 속성을 보유하는지 확인하는 데 사용됩니다.
- 작업은 클릭이나 기타 동작과 같은 시뮬레이션된 사용자 이벤트를 요소에 삽입합니다.
이러한 API 중 일부는 SemanticsMatcher
을 허용하여 하나 이상의 항목을 참조합니다.
노드가 있습니다.
파인더
onNode
및 onAllNodes
를 사용하여 하나 이상의 노드를 선택할 수 있습니다.
각각 편의 파인더를 사용할 수도 있지만 가장 일반적인
검색(예: onNodeWithText
) 및
onNodeWithContentDescription
. 다음에서 전체 목록을 찾아볼 수 있습니다.
Compose 테스트 요약본
단일 노드 선택
composeTestRule.onNode(<<SemanticsMatcher>>, useUnmergedTree = false): SemanticsNodeInteraction
// Example
composeTestRule
.onNode(hasText("Button")) // Equivalent to onNodeWithText("Button")
여러 노드 선택
composeTestRule
.onAllNodes(<<SemanticsMatcher>>): SemanticsNodeInteractionCollection
// Example
composeTestRule
.onAllNodes(hasText("Button")) // Equivalent to onAllNodesWithText("Button")
트리 병합 취소됨
일부 노드는 하위 요소의 시맨틱 정보를 병합합니다. 예를 들어 버튼은 텍스트 요소 라벨을 병합합니다.
MyButton {
Text("Hello")
Text("World")
}
테스트에서 printToLog()
를 사용하여 시맨틱 트리를 표시합니다.
composeTestRule.onRoot().printToLog("TAG")
이 코드는 다음 출력을 생성합니다.
Node #1 at (...)px
|-Node #2 at (...)px
Role = 'Button'
Text = '[Hello, World]'
Actions = [OnClick, GetTextLayoutResult]
MergeDescendants = 'true'
병합되지 않은 트리가 될 요소의 노드를 일치시켜야 한다면 다음과 같이 useUnmergedTree
를 true
로 설정하면 됩니다.
composeTestRule.onRoot(useUnmergedTree = true).printToLog("TAG")
이 코드는 다음 출력을 생성합니다.
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]'
useUnmergedTree
매개변수는 모든 파인더에서 사용할 수 있습니다. 예를 들어
onNodeWithText
파인더에서 사용됩니다.
composeTestRule
.onNodeWithText("World", useUnmergedTree = true).assertIsDisplayed()
어설션
SemanticsNodeInteraction
에서 assert()
를 호출하여 어설션을 확인합니다.
하나 이상의 매처와 함께 파인더가 반환함:
// 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"))
다음과 같은 가장 일반적인 어설션에 편의 함수를 사용할 수도 있습니다.
assertExists
, assertIsDisplayed
, assertTextEquals
.
Compose 테스트 요약본에서 전체 목록을 찾아볼 수 있습니다.
다음과 같이 노드 컬렉션에서 어설션을 확인하는 함수도 있습니다.
// 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())
작업
노드에 작업을 삽입하려면 다음과 같이 perform…()
함수를 호출합니다.
composeTestRule.onNode(...).performClick()
다음은 몇 가지 작업의 예입니다.
performClick(),
performSemanticsAction(key),
performKeyPress(keyEvent),
performGesture { swipeLeft() }
Compose 테스트 요약본에서 전체 목록을 찾아볼 수 있습니다.
매처
Compose를 테스트하는 데 다양한 매처를 사용할 수 있음 있습니다.
계층적 매처
계층적 매처를 사용하면 시맨틱 트리의 위아래로 이동하고 있습니다.
fun hasParent(matcher: SemanticsMatcher): SemanticsMatcher
fun hasAnySibling(matcher: SemanticsMatcher): SemanticsMatcher
fun hasAnyAncestor(matcher: SemanticsMatcher): SemanticsMatcher
fun hasAnyDescendant(matcher: SemanticsMatcher): SemanticsMatcher
다음은 이러한 매처가 사용되는 몇 가지 예입니다.
composeTestRule.onNode(hasParent(hasText("Button")))
.assertIsDisplayed()
선택기
테스트를 만드는 다른 방법은 일부 테스트를 더 읽기 쉽게 만들 수 있는 선택기를 사용하는 것입니다.
composeTestRule.onNode(hasTestTag("Players"))
.onChildren()
.filter(hasClickAction())
.assertCountEquals(4)
.onFirst()
.assert(hasText("John"))
Compose 테스트 요약본에서 전체 목록을 찾아볼 수 있습니다.
추가 리소스
- Android에서 앱 테스트: 기본 Android 테스트 테스트의 기본사항과 기술을 보다 폭넓게 파악할 수 있습니다.
- 테스트 기본 요소: 자세히 알아보기 Android 앱 테스트의 핵심 개념을 배웠습니다.
- 로컬 테스트: 일부 테스트를 실행할 수 있습니다. 실행할 수 있습니다
- 계측 테스트: 우수함 연습을 해야 합니다 즉, Cloud Build를 사용해 해야 합니다.
- 지속적 통합: 지속적 통합을 통해 테스트를 배포에 통합할 수 있음 살펴봤습니다
- 다양한 화면 크기 테스트: 사용자에게 제공할 수 있는 여러 기기이므로 다양한 화면용으로 테스트해야 합니다. 있습니다.
- Espresso: 뷰 기반 UI, Espresso 지식은 Compose의 일부 측면에 여전히 유용할 수 있음 있습니다.