테스트 API

UI 요소와 상호작용하는 방법은 크게 세 가지가 있습니다.

  • 파인더를 사용하면 하나 이상의 요소 (또는 검색 엔진의 노드 시맨틱 트리)를 기반으로 어설션을 만들거나 이에 대한 작업을 실행할 수 있습니다.
  • 어설션은 요소가 있는지 또는 특정 속성을 보유하는지 확인하는 데 사용됩니다.
  • 작업은 클릭이나 기타 동작과 같은 시뮬레이션된 사용자 이벤트를 요소에 삽입합니다.

이러한 API 중 일부는 SemanticsMatcher을 허용하여 하나 이상의 항목을 참조합니다. 노드가 있습니다.

파인더

onNodeonAllNodes를 사용하여 하나 이상의 노드를 선택할 수 있습니다. 각각 편의 파인더를 사용할 수도 있지만 가장 일반적인 검색(예: 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'

병합되지 않은 트리가 될 요소의 노드를 일치시켜야 한다면 다음과 같이 useUnmergedTreetrue로 설정하면 됩니다.

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의 일부 측면에 여전히 유용할 수 있음 있습니다.