sitelink1 https://aroundck.tistory.com/8195 
sitelink2  
sitelink3  

Compose Test 는 view 영역이기 때문에 Instrumentation test 를 통해야 한다.


#
test 를 위해 아래 dependency 가 필요하다.

androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version"
debugImplementation("androidx.compose.ui:ui-test-manifest:$compose_version")



#
TestRule 은 createComposeRule 을 사용한다.

만약 Activity 에 접근해야 한다면 createAndroidComposeRule<YourActivity>()를 사용한다.

class UiTests{
	@get:Rule
	val composeTestRule = createComposeRule()
	
	private fun setContent(){
		composeTestRule.setContent{
			MyTheme{
				MyScreen()
			}
		}
	}
	
	@Test
	fun testIntroTextExist(){
		setContent()
		composeTestRule.onNodeWithText("Welcome bro!").assertExists()
	}
	
	@Test
	fun testCorrectResultForInput(){
		setContent()
		composeTestRule.onNodeWithText("Input number").performTextInput("10")
		composeTestRule.onNodeWithText("10 x 5 = 50").assertIsDisplayed()
	}
}

 

#

node (composable, view) 를 찾는 방법은 onNode 또는 onAllNode 가 있고, 위의 예시처럼 onNodeWithText 와 같은 variation 들이 있다.

composeRule.onNode(hasText("Button"))
composeRule.onAllNodes(hasText("Button"))

 

#

assert 도 여러 variation 이 있다.

foundNode.assert(hasText("Welcome"))
foundNode.assert(hasText("Welcome") or hasText("Go away"))

foundNodes.assertCountEquals(4)
foundNodes.assertAny(hasTestTag("Dreamer"))
foundNodes.assertAll(hasClickAction())

 

#

action 을 가하는 것도 종류가 많다. 

node.performClick()
node.performSemanticsAction(key)
node.performKeyPress(keyEvent)
node.performGesture{ swipeLeft() }

 

#

printToLog 함수를 통해 view(composition) hierarchy 도 볼 수 있다.

unmergedTree 는 합쳐지지 않은 raw composable 들을 보여준다. 예를 들어 Button 안에 "Hello", "World" 2개의 Text 를 그렸다면, merged 에서는 "Hello World" 버튼 하나로 보이지만, unMergedTree 에서는 Button, Hello Text, World Text 이렇게 raw composable 이 모두 보이게 된다. 

useUnmergedTree default 값은 false 이다.

composeTestRule.onRoot(useUnmergedTree=true).printToLog("TAG")

 

#

참고 링크

android 개발자 codelabs

android ref doc

compose test cheat sheet

번호 제목 글쓴이 날짜 조회 수
128 PC를 위한 최고의 안드로이드 에뮬레이터 황제낙엽 2023.01.18 2
127 [Jetpack Compose UI / 상추님] GDG Jetpack compose 코드랩 수료 후기 (feat. 굿즈) 황제낙엽 2022.12.24 1
126 [Jetpack Compose UI / kyj1991719] compose - Compose 이해 황제낙엽 2022.12.24 3
125 [Jetpack Compose UI / 꾸준] Compose 가 뭔데...? 황제낙엽 2022.12.24 0
124 [Jetpack Compose UI / IIVIKI] Compose 학습과 분석 황제낙엽 2022.12.24 1
123 [Jetpack Compose UI] 스터디 시작하기 황제낙엽 2022.12.24 0
122 [개발하는 정대리] 취준생을 위한 안드로이드 앱만들기 - 바텀네비게이션 뷰, 네비게이션 AAC file 황제낙엽 2022.12.22 1
121 [개발하는 정대리] 취준생을 위한 안드로이드 앱만들기 - 뷰바인딩 file 황제낙엽 2022.12.22 0
120 [개발하는 정대리] 취준생을 위한 안드로이드 앱만들기 - 라이브데이터 뷰모델 file 황제낙엽 2022.12.21 5
119 [대왕놀] ImageButton in Compose (IconButton) 황제낙엽 2022.12.20 2
» [대왕놀] compose instrumentation test tutorial 황제낙엽 2022.12.20 1
117 [대왕놀] Switch in Compose 황제낙엽 2022.12.20 0
116 [대왕놀] EditText in Compose (TextField) 황제낙엽 2022.12.20 0
115 [대왕놀] margin in Compose 황제낙엽 2022.12.20 0
114 [대왕놀] modifier in compose 황제낙엽 2022.12.20 1
113 [대왕놀] Button in Compose file 황제낙엽 2022.12.20 0
112 [대왕놀] TextView in Compose (Text) 황제낙엽 2022.12.20 0
111 [대왕놀] ImageView in Compose (Image) 황제낙엽 2022.12.20 1
110 [대왕놀] LinearLayout in Compose (Row, Column) 황제낙엽 2022.12.20 0
109 [대왕놀] Introduction to Jetpack compose 황제낙엽 2022.12.20 1