{"id":45751,"date":"2021-11-22T21:03:59","date_gmt":"2021-11-22T12:03:59","guid":{"rendered":"https:\/\/www.charlezz.com\/?p=45751"},"modified":"2021-11-22T21:04:02","modified_gmt":"2021-11-22T12:04:02","slug":"jetpack-compose-navigation-%ec%bb%b4%ed%8f%ac%ec%a6%88%ec%97%90%ec%84%9c-%eb%84%a4%eb%b9%84%ea%b2%8c%ec%9d%b4%ec%85%98-%ed%85%8c%ec%8a%a4%ed%8a%b8%ed%95%98%ea%b8%b0","status":"publish","type":"post","link":"https:\/\/charlezz.com\/?p=45751","title":{"rendered":"Jetpack Compose Navigation &#8211; \ucef4\ud3ec\uc988\uc5d0\uc11c \ub124\ube44\uac8c\uc774\uc158 \ud14c\uc2a4\ud2b8\ud558\uae30"},"content":{"rendered":"\n<blockquote class=\"wp-block-quote\"><p><strong>Note<\/strong>: \uc774 \ucf54\ub4dc\ub7a9\uc5d0\uc11c\ub294 \ucef4\ud3ec\uc988 \ud14c\uc2a4\ud2b8\uc758 \uae30\ubcf8\uc801\uc778 \ub0b4\uc6a9\uc744 \uc54c\ub824\uc8fc\uc9c0 \uc54a\ub294\ub2e4. \uc774\ub97c \uc54c\uc544\ubcf4\ub824\uba74 <a href=\"https:\/\/developer.android.com\/jetpack\/compose\/testing?hl=ko\">\ucef4\ud3ec\uc988 \ub808\uc774\uc544\uc6c3 \ud14c\uc2a4\ud2b8<\/a> \ubb38\uc11c \ub610\ub294 <a href=\"https:\/\/developer.android.com\/codelabs\/jetpack-compose-testing?hl=ko#0\">Testing in Jetpack Compose<\/a> Codelab\uc744 \ucc38\uc870\ud558\uc790. TestNavHostController \uc0ac\uc6a9\uacfc \uac19\uc740 \ub124\ube44\uac8c\uc774\uc158 \ucf54\ub4dc\uc758 \uace0\uae09 \ud14c\uc2a4\ud2b8\uc5d0 \ub300\ud574 \uc790\uc138\ud788 \uc54c\uc544\ubcf4\ub824\uba74 <a href=\"https:\/\/developer.android.com\/guide\/navigation\/navigation-testing?hl=ko\">Test Navigation<\/a> \ubb38\uc11c\ub97c \ucc38\uc870\ud558\uc790.<\/p><\/blockquote>\n\n\n\n<p>\uc774 \ucf54\ub4dc\ub7a9\uc758 \uc2dc\uc791\ubd80\ud130 \uc6b0\ub9ac\ub294 navController\ub97c \ucef4\ud3ec\uc800\ube14\uc5d0 \uc9c1\uc811 \uc804\ub2ec\ud558\uc9c0 \uc54a\uace0 \ub300\uc2e0 \ucf5c\ubc31\uc744 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc804\ub2ec\ud588\ub2e4. \uc989, \ubaa8\ub4e0 \ucef4\ud3ec\uc800\ube14\uc744 \uac1c\ubcc4\uc801\uc73c\ub85c \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\ub2e4. \uadf8\ub7ec\ub098 \uc804\uccb4 NavHost\ub97c \ud14c\uc2a4\ud2b8\ud560 \uc218\ub3c4 \uc788\uace0, \uc774\uac83\uc774 \uc5ec\uae30\uc11c \ub2e4\ub8e8\uace0\uc790 \ud558\ub294 \ub0b4\uc6a9\uc758 \uc804\ubd80\ub2e4. \uac1c\ubcc4 \ucef4\ud3ec\uc800\ube14 \ud568\uc218\ub97c \ud14c\uc2a4\ud2b8\ud558\ub824\uba74, <a href=\"https:\/\/developer.android.com\/codelabs\/jetpack-compose-testing?hl=ko#0\">Testing in Jetpack Compose<\/a> \ucf54\ub4dc\ub7a9\uc5d0\uc11c \ud14c\uc2a4\ud2b8\ud558\ub294 \ubc29\ubc95\uc744 \ud655\uc778\ud558\uc790.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud14c\uc2a4\ud2b8 \ud074\ub798\uc2a4 \uc900\ube44\ud558\uae30<\/h2>\n\n\n\n<p>NavHost\ub294 Activity \uc790\uccb4\uc640 \ubcc4\ub3c4\ub85c \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p>\uc774 \ud14c\uc2a4\ud2b8\ub294 \uc5ec\uc804\ud788 Android \uae30\uae30\uc5d0\uc11c \uc2e4\ud589\ub418\ubbc0\ub85c \/app\/src\/androidTest\/java\/com\/example\/compose\/rally \uc544\ub798\uc758 androidTest \ub514\ub809\ud1a0\ub9ac\uc5d0\uc11c \ud14c\uc2a4\ud2b8 \ud30c\uc77c\uc744 \uc0dd\uc131\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<p>\ud14c\uc2a4\ud2b8 \ud30c\uc77c\uc744 \uc0dd\uc131\ud558\uace0, \uc774\ub984\uc744 RallyNavHostTest\ub85c \uc9c0\uc815\ud55c\ub2e4\u001d.<\/p>\n\n\n\n<p>\uadf8\ub7f0 \ub2e4\uc74c, \ucef4\ud3ec\uc988 \ud14c\uc2a4\ud2b8 API\ub97c \uc0ac\uc6a9\ud558\uae30 \uc704\ud574 \uc544\ub798\uc640 \uac19\uc774 \ucef4\ud3ec\uc988 \ud14c\uc2a4\ud2b8 \uaddc\uce59\uc744 \uc0dd\uc131\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class RallyNavHostTest {\n\n\u00a0 \u00a0 <strong>@get:Rule\n\u00a0 \u00a0 val composeTestRule = createComposeRule()<\/strong>\n\n}<\/code><\/pre>\n\n\n\n<p>\uc774\uc81c \uc2e4\uc81c \ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud560 \uc900\ube44\uac00 \ub418\uc5c8\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\uccab\ubc88\uc9f8 \ud14c\uc2a4\ud2b8 \ucf54\ub4dc \uc791\uc131\ud574\ubcf4\uae30<\/h2>\n\n\n\n<p>@Test\ub85c \uc560\ub178\ud14c\uc774\uc158\uc744 \ub2ec\uace0 public \ud14c\uc2a4\ud2b8 \ud568\uc218\ub97c \ub9cc\ub4e0\ub2e4. \ud574\ub2f9 \ud568\uc218\uc5d0\uc11c \ud14c\uc2a4\ud2b8\ud560 \ub0b4\uc6a9\uc744 \uc124\uc815\ud574\uc57c \ud55c\ub2e4. composeTestRule\uc758 setContent\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc774 \uc791\uc5c5\uc744 \uc218\ud589\ud55c\ub2e4. Composable \ub9e4\uac1c\ubcc0\uc218\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc77c\ubc18 \uc571\uc5d0 \uc788\ub294 \uac83\ucc98\ub7fc Compose \ucf54\ub4dc\ub97c \uc791\uc131\ud560 \uc218 \uc788\ub2e4. RallyActivity\uc5d0\uc11c \ud588\ub358 \uac83\ucc98\ub7fc RallyNavHost\ub97c \uc124\uc815\ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class RallyNavHostTest {\n\n\u00a0 \u00a0 @get:Rule\n\u00a0 \u00a0 val composeTestRule = createComposeRule()\n\u00a0 \u00a0 <strong>lateinit var navController: NavHostController\n\n\u00a0 \u00a0 @Test\n\u00a0 \u00a0 fun rallyNavHost() {\n\u00a0 \u00a0 \u00a0 \u00a0 composeTestRule.setContent {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 navController = rememberNavController()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 RallyNavHost(navController = navController)\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 fail()\n\u00a0 \u00a0 }<\/strong>\n}<\/code><\/pre>\n\n\n\n<p>\uc704\uc758 \ucf54\ub4dc\ub97c \ubcf5\uc0ac\ud55c \uacbd\uc6b0, fail() \ud638\ucd9c\uc740 \uc2e4\uc81c assert(&#8230;)\ub97c \ub9cc\ub4e4\ub54c\uae4c\uc9c0 \ud14c\uc2a4\ud2b8\uac00 \uc2e4\ud328\ud558\ub3c4\ub85d \ud55c\ub2e4. \uc774\ub294 \ud14c\uc2a4\ud2b8 \uad6c\ud604\uc744 \uc644\ub8cc\ud558\ub77c\ub294 \uc54c\ub9bc \uc5ed\ud560\uc744 \ud55c\ub2e4.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p><strong>Note<\/strong>: NavHost\uac00 \uc62c\ubc14\ub974\uac8c \uc791\ub3d9\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub824\uba74, \uba3c\uc800 \uacc4\uce35 \uad6c\uc870\ub97c \ub9cc\ub4e4\uc5b4\uc57c \ud55c\ub2e4. \uc774\ub294 asssertion\uc774 setContent \ud568\uc218 \uc678\ubd80\uc5d0\uc11c \uc791\uc131\ub418\uc5b4\uc57c \ud568\uc744 \uc758\ubbf8\ud55c\ub2e4.<\/p><\/blockquote>\n\n\n\n<p>content description(\ucf58\ud150\uce20 \uc124\uba85)\uc744 \ud1b5\ud574 \uc62c\ubc14\ub978 \ud654\uba74\uc774 \ud45c\uc2dc\ub418\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4. <br>\uc774 \ucf54\ub4dc\ub7a9\uc5d0\uc11c\ub294 \ud14c\uc2a4\ud2b8 \uac80\uc99d\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d &#8220;Account \ud654\uba74&#8221; \ubc0f &#8220;Overview \ud654\uba74&#8221;\uc5d0 \ub300\ud55c content description\uc774 \uc81c\uacf5\ub41c\ub2e4. \ud14c\uc2a4\ud2b8 \ud074\ub798\uc2a4 \uc790\uccb4\uc5d0 lateinit \uc18d\uc131\uc744 \uc0dd\uc131\ud558\uc5ec, \ud5a5\ud6c4 \ud14c\uc2a4\ud2b8\uc5d0\uc11c\ub3c4 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p>\uc21c\uc870\ub85c\uc6b4 \uc2dc\uc791\uc744 \uc704\ud574, \uc77c\ub2e8 \uc26c\uc6b4 \uac83\ubd80\ud130, OverviewScreen\uc774 \ud45c\uc2dc\ub418\ub294\uc9c0 \ud655\uc778\ud574\ubcf4\uc790.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class RallyNavHostTest {\n\n\u00a0 \u00a0 @get:Rule\n\u00a0 \u00a0 val composeTestRule = createComposeRule()\n\u00a0 \u00a0 lateinit var navController: NavHostController\n\n\u00a0 \u00a0 @Test\n\u00a0 \u00a0 fun rallyNavHost() {\n\u00a0 \u00a0 \u00a0 \u00a0 composeTestRule.setContent {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 navController = rememberNavController()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 RallyNavHost(navController = navController)\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 \u00a0 \u00a0 <strong>composeTestRule\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .onNodeWithContentDescription(\"Overview Screen\")\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .assertIsDisplayed()<\/strong>\n\u00a0 \u00a0 }\n}<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>\ub9cc\uc57d\uc5d0 Android 12\uc640 \uad00\ub828\ud574\uc11c android:exported\ub97c \uba85\uc2dc\ud558\ub77c\ub294 \uc624\ub958\uac00 \ub098\uc628\ub2e4\uba74 \ub2e4\uc74c\uc758 \uc808\ucc28\ub97c \ud1b5\ud574  \ud574\uacb0\ud574\ubcf4\uc790.<\/p><p>1. \uc571 \ubaa8\ub4c8 build.gradle\uc758 dependencies\uc5d0 <em>androidx.test:core-ktx:1.4.0 \ubc84\uc804 \uc774\uc0c1\uc774 \ucd94\uac00 \ub418\uc5c8\ub294\uc9c0 \ud655\uc778<\/em><br>2. dependencies\uc5d0 \uc120\uc5b8\ub41c <em>Test \uad00\ub828 \uc544\ud2f0\ud329\ud2b8\uac00 <\/em><a href=\"https:\/\/developer.android.com\/jetpack\/androidx\/releases\/test?hl=ko\">\ucd5c\uc2e0\ubc84\uc804<\/a><em>\uc778\uc9c0 \ud655\uc778<\/em><br>3. \uc704\uc758 \ub2e8\uacc4\ub85c \ud574\uacb0\ub418\uc9c0 \uc54a\uc73c\uba74, \uc784\uc2dc\ub85c targetSdk\ub97c Android11\ub85c \ub0ae\ucd94\uc5b4\uc11c \uc9c4\ud589 (\ucd94\ucc9c\ud558\uc9c0 \uc54a\uc74c)<\/p><\/blockquote>\n\n\n\n<p>\ub2f9\uc5f0\ud55c \uc774\uc57c\uae30\uc9c0\ub9cc, fail() \ud638\ucd9c\uc744 \uc81c\uac70\ud558\uace0 \ud14c\uc2a4\ud2b8\ub97c \ub2e4\uc2dc \uc2e4\ud589\ud558\uba74 \ud1b5\uacfc\ud55c\ub2e4.<\/p>\n\n\n\n<p>\ub2e4\uc74c \uac01 \ud14c\uc2a4\ud2b8\uc5d0\uc11c, RallyNavHost\ub294 \ub3d9\uc77c\ud55c \ubc29\uc2dd\uc73c\ub85c \uc124\uc815\ub429\ub2c8\ub2e4. \ub530\ub77c\uc11c \ucf54\ub4dc\ub97c \uae68\ub057\ud558\uac8c \uc720\uc9c0\ud558\uae30 \uc704\ud574 @Before \uc560\ub178\ud14c\uc774\uc158\uc774 \ub2ec\ub9b0 \ud568\uc218\ub85c \uc774\uac83\uc744 \ucd94\ucd9c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>class RallyNavHostTest {\n\n\u00a0 \u00a0 @get:Rule\n\u00a0 \u00a0 val composeTestRule = createComposeRule()\n\u00a0 \u00a0 lateinit var navController: NavHostController\n\n<strong>\u00a0 \u00a0 @Before\n\u00a0 \u00a0 fun setupRallyNavHost() {\n\u00a0 \u00a0 \u00a0 \u00a0 composeTestRule.setContent {\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 navController = rememberNavController()\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 RallyNavHost(navController = navController)\n\u00a0 \u00a0 \u00a0 \u00a0 }\n\u00a0 \u00a0 }<\/strong>\n\n\u00a0 \u00a0 @Test\n\u00a0 \u00a0 fun rallyNavHost() {\n\u00a0 \u00a0 \u00a0 \u00a0 composeTestRule\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .onNodeWithContentDescription(\"Overview Screen\")\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 .assertIsDisplayed()\n\u00a0 \u00a0 }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\ud14c\uc2a4\ud2b8\uc5d0\uc11c \uc774\ub3d9\ud574\ubcf4\uae30<\/h2>\n\n\n\n<p>\uc0c8 \ubaa9\uc801\uc9c0\ub85c \uc5f0\uacb0\ub418\uc5b4\uc57c \ud558\ub294 UI \uc694\uc18c\ub97c \ud074\ub9ad\ud558\uac70\ub098 \ud574\ub2f9 \uacbd\ub85c \uc774\ub984\uc73c\ub85c \ud0d0\uc0c9\uc744 \ud638\ucd9c\ud558\ub294 \ub4f1 \ub2e4\uc591\ud55c \ubc29\ubc95\uc73c\ub85c \ub124\ube44\uac8c\uc774\uc158 \uad6c\ud604\uc744 \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">UI \ubc0f \ud14c\uc2a4\ud2b8 \uaddc\uce59\uc744 \ud1b5\ud55c \ud14c\uc2a4\ud2b8<\/h3>\n\n\n\n<p>\uc571\uc758 \uad6c\ud604\uc744 \ud14c\uc2a4\ud2b8\ud558\ub824\uba74 UI\ub97c \ud074\ub9ad\ud558\ub294 \uac83\uc774 \uc88b\ub2e4. &#8220;Accounts Screen&#8221;\uc73c\ub85c \uc5f0\uacb0\ub418\ub294 &#8220;All Acoounts&#8221; \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\ub294 \ud14c\uc2a4\ud2b8\ub97c \uc791\uc131\ud558\uace0 \uc62c\ubc14\ub978 \ud654\uba74\uc774 \ud45c\uc2dc\ub418\ub294\uc9c0 \ud655\uc778\ud558\uc790.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Test\nfun rallyNavHost_navigateToAllAccounts_viaUI() {\n\u00a0 \u00a0 composeTestRule\n\u00a0 \u00a0 \u00a0 \u00a0 .onNodeWithContentDescription(\"All Accounts\")\n\u00a0 \u00a0 \u00a0 \u00a0 .performClick()\n\u00a0 \u00a0 composeTestRule\n\u00a0 \u00a0 \u00a0 \u00a0 .onNodeWithContentDescription(\"Accounts Screen\")\n\u00a0 \u00a0 \u00a0 \u00a0 .assertIsDisplayed()\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">UI \ubc0f navController\ub97c \ud1b5\ud55c \ud14c\uc2a4\ud2b8<\/h3>\n\n\n\n<p>navController\ub97c \uc0ac\uc6a9\ud558\uc5ec assertion\uc744 \ud655\uc778\ud560 \uc218\ub3c4 \uc788\ub2e4. \uc774\ub807\uac8c \ud558\ub824\uba74 UI\ub97c \ud074\ub9ad\ud55c \ub2e4\uc74c backstackEntry.value?.destination?.route\ub97c \uc0ac\uc6a9\ud558\uc5ec \ud604\uc7ac \uacbd\ub85c\ub97c \uc608\uc0c1\ud55c \uacbd\ub85c\uc640 \ube44\uad50\ud574\ubcf4\uc790.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Test\nfun rallyNavHost_navigateToBills_viaUI() {\n\u00a0 \u00a0 \/\/ \"All Bills\"\ub97c \ud074\ub9ad\ud560 \ub54c \n\u00a0 \u00a0 composeTestRule.onNodeWithContentDescription(\"All Bills\").apply {\n\u00a0 \u00a0 \u00a0 \u00a0 performScrollTo()\n\u00a0 \u00a0 \u00a0 \u00a0 performClick()\n\u00a0 \u00a0 }\n\u00a0 \u00a0 \/\/ \ud604\uc7ac \uacbd\ub85c\uac00 \"Bills\"\uc778\uc9c0 \ud655\uc778\n\u00a0 \u00a0 val route = navController.currentBackStackEntry?.destination?.route\n\u00a0 \u00a0 assertEquals(route, \"Bills\")\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">navController\ub97c \ud1b5\ud55c \ud14c\uc2a4\ud2b8<\/h3>\n\n\n\n<p>\uc138 \ubc88\uc9f8 \uc635\uc158\uc740 navController.navigate\ub97c \uc9c1\uc811 \ud638\ucd9c\ud558\ub294 \uac83\uc774\ub2e4. \uc5ec\uae30\uc5d0\ub294 \ud55c \uac00\uc9c0 \uc8fc\uc758 \uc0ac\ud56d\uc774 \uc788\ub2e4. UI \uc2a4\ub808\ub4dc\uc5d0\uc11c navController.navigate\ub97c \ud638\ucd9c\ud574\uc57c \ud55c\ub2e4. \uba54\uc778 \uc2a4\ub808\ub4dc \ub514\uc2a4\ud328\ucc98\uc640 \ud568\uaed8 \ucf54\ub8e8\ud2f4\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc774\ub97c \uc218\ud589\ud560 \uc218 \uc788\ub2e4. \uadf8\ub9ac\uace0 \uc0c8\ub85c\uc6b4 \uc0c1\ud0dc\uc5d0 \ub300\ud55c Assertion\uc744 \ub9cc\ub4e4\uae30 \uc804\uc5d0 \ud638\ucd9c\uc774 \ubc1c\uc0dd\ud574\uc57c \ud558\ubbc0\ub85c, runBlocking \ud638\ucd9c\ub85c \ub798\ud551\ud574\uc57c \ud55c\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>runBlocking {<br>&nbsp; &nbsp; withContext(Dispatchers.Main) {<br>&nbsp; &nbsp; &nbsp; &nbsp; navController.navigate(RallyScreen.Accounts.name)<br>&nbsp; &nbsp; }<br>}<\/code><\/pre>\n\n\n\n<p>\uc774\ub97c \ud1b5\ud574 \uc571\uc744 \uc774\ub3d9\ud558\uace0 \uacbd\ub85c\uac00 \uc608\uc0c1\ud55c \uacf3\uc73c\ub85c \uc774\ub3d9\ud588\ub294\uc9c0 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Test<br>fun rallyNavHost_navigateToAllAccounts_callingNavigate() {<br>&nbsp; &nbsp; runBlocking {<br>&nbsp; &nbsp; &nbsp; &nbsp; withContext(Dispatchers.Main) {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; navController.navigate(RallyScreen.Accounts.name)<br>&nbsp; &nbsp; &nbsp; &nbsp; }<br>&nbsp; &nbsp; }<br>&nbsp; &nbsp; composeTestRule<br>&nbsp; &nbsp; &nbsp; &nbsp; .onNodeWithContentDescription(\"Accounts Screen\")<br>&nbsp; &nbsp; &nbsp; &nbsp; .assertIsDisplayed()<br>}<\/code><\/pre>\n\n\n\n<p>\ucef4\ud3ec\uc988\uc5d0\uc11c \ud14c\uc2a4\ud2b8\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc790\uc138\ud788 \uc54c\uc544\ubcf4\ub824\uba74 \ub2e4\uc74c\uc758 \ucf54\ub4dc\ub7a9\uc744 \ud655\uc778\ud574\ubcf4\uc790.<\/p>\n\n\n\n<ul><li><a href=\"https:\/\/developer.android.com\/codelabs\/android-navigation?hl=ko\" target=\"_blank\" rel=\"noreferrer noopener\">Learn Jetpack Navigation<\/a><\/li><li><a href=\"https:\/\/developer.android.com\/codelabs\/jetpack-compose-testing?hl=ko\" target=\"_blank\" rel=\"noreferrer noopener\">Testing Compose<\/a><\/li><li><a href=\"http:\/\/goo.gle\/compose-pathway\" target=\"_blank\" rel=\"noreferrer noopener\">Jetpack Compose learning pathway<\/a><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\ucd95\ud558\ud569\ub2c8\ub2e4.<\/h2>\n\n\n\n<p>Rally \uc571\uc5d0 \ub124\ube44\uac8c\uc774\uc158\uc744 \ucd94\uac00\ud588\uc73c\uba70, \uc774\uc81c Jetpack Compose\uc5d0\uc11c \ub124\ube44\uac8c\uc774\uc158\uc744 \uc0ac\uc6a9\ud558\ub294 \uc8fc\uc694 \uac1c\ub150\uc744 \uc54c\uac8c \ub418\uc5c8\ub2e4. \ucef4\ud3ec\uc800\ube14 \ubaa9\uc801\uc9c0\uc758 \ub124\ube44\uac8c\uc774\uc158 \uadf8\ub798\ud504\ub97c \ub9cc\ub4e4\uace0, \uacbd\ub85c\uc5d0 \uc778\uc790\ub97c \ucd94\uac00\ud558\uace0, \ub525 \ub9c1\ud06c\ub97c \ucd94\uac00\ud558\uace0, \ub2e4\uc591\ud55c \ubc29\ubc95\uc73c\ub85c \uad6c\ud604\uc744 \ud14c\uc2a4\ud2b8\ud558\ub294 \ubc29\ubc95\uc744 \ubc30\uc6e0\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Note: \uc774 \ucf54\ub4dc\ub7a9\uc5d0\uc11c\ub294 \ucef4\ud3ec\uc988 \ud14c\uc2a4\ud2b8\uc758 \uae30\ubcf8\uc801\uc778 \ub0b4\uc6a9\uc744 \uc54c\ub824\uc8fc\uc9c0 \uc54a\ub294\ub2e4. \uc774\ub97c \uc54c\uc544\ubcf4\ub824\uba74 \ucef4\ud3ec\uc988 \ub808\uc774\uc544\uc6c3 \ud14c\uc2a4\ud2b8 \ubb38\uc11c \ub610\ub294 Testing in Jetpack Compose Codelab\uc744 \ucc38\uc870\ud558\uc790. TestNavHostController \uc0ac\uc6a9\uacfc \uac19\uc740 \ub124\ube44\uac8c\uc774\uc158 \ucf54\ub4dc\uc758 \uace0\uae09 \ud14c\uc2a4\ud2b8\uc5d0 \ub300\ud574 \uc790\uc138\ud788 \uc54c\uc544\ubcf4\ub824\uba74 Test Navigation \ubb38\uc11c\ub97c \ucc38\uc870\ud558\uc790. \uc774 \ucf54\ub4dc\ub7a9\uc758 \uc2dc\uc791\ubd80\ud130 \uc6b0\ub9ac\ub294 navController\ub97c \ucef4\ud3ec\uc800\ube14\uc5d0 \uc9c1\uc811 \uc804\ub2ec\ud558\uc9c0 \uc54a\uace0 \ub300\uc2e0 \ucf5c\ubc31\uc744 \ub9e4\uac1c\ubcc0\uc218\ub85c \uc804\ub2ec\ud588\ub2e4. \uc989, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"inline_featured_image":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[38],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/45751"}],"collection":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=45751"}],"version-history":[{"count":1,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/45751\/revisions"}],"predecessor-version":[{"id":45752,"href":"https:\/\/charlezz.com\/index.php?rest_route=\/wp\/v2\/posts\/45751\/revisions\/45752"}],"wp:attachment":[{"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=45751"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=45751"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/charlezz.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=45751"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}