{"id":39385,"date":"2026-02-20T11:30:36","date_gmt":"2026-02-20T08:30:36","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi\/"},"modified":"2026-02-20T11:30:36","modified_gmt":"2026-02-20T08:30:36","slug":"jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi\/","title":{"rendered":"Jetpack Compose UI&#8217;\u0131 Espresso ile G\u00fcvenle Test Etme Rehberi"},"content":{"rendered":"<h2>Jetpack Compose UI&#8217;\u0131 Espresso ile G\u00fcvenle Test Etme Rehberi<\/h2>\n<p>Modern Android uygulama geli\u015ftirmede Jetpack Compose, deklaratif UI yakla\u015f\u0131m\u0131yla geli\u015ftiricilere daha h\u0131zl\u0131 ve sezgisel aray\u00fczler olu\u015fturma imkan\u0131 sunuyor. Ancak, bu yenilik\u00e7i yakla\u015f\u0131m beraberinde yeni test stratejilerini de getiriyor. Kullan\u0131c\u0131 aray\u00fczlerinin beklendi\u011fi gibi \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak, uygulaman\u0131n kalitesi ve kullan\u0131c\u0131 deneyimi i\u00e7in kritik \u00f6neme sahiptir. Bu makalede, Jetpack Compose UI&#8217;\u0131n\u0131z\u0131 Espresso test \u00e7at\u0131s\u0131n\u0131 kullanarak nas\u0131l g\u00fcvenle test edebilece\u011finizi ad\u0131m ad\u0131m inceleyecek, temelden ileri seviyeye kadar pratik bilgiler ve kod \u00f6rnekleri sunaca\u011f\u0131z.<\/p>\n<h3>1. Compose Test Ortam\u0131 Kurulumu ve Temelleri<\/h3>\n<p>Jetpack Compose uygulamalar\u0131nda UI testi yazmaya ba\u015flamadan \u00f6nce, gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 projenize eklemeniz ve test ortam\u0131n\u0131z\u0131 do\u011fru bir \u015fekilde yap\u0131land\u0131rman\u0131z gerekir. Bu b\u00f6l\u00fcm, ba\u015flang\u0131\u00e7 i\u00e7in atman\u0131z gereken ilk ad\u0131mlar\u0131 ele almaktad\u0131r.<\/p>\n<h4>1.1. Gerekli Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Ekleme<\/h4>\n<p>Compose UI testleri i\u00e7in AndroidX Test k\u00fct\u00fcphanesinin bir par\u00e7as\u0131 olan <code>androidx.compose.ui:ui-test-junit4<\/code> ve <code>androidx.compose.ui:ui-test-manifest<\/code> ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 projenizin <code>build.gradle (Module: app)<\/code> dosyas\u0131na eklemeniz gerekir. Ayr\u0131ca, Espresso&#8217;nun temel i\u015flevselli\u011fi i\u00e7in <code>androidx.test.espresso:espresso-core<\/code> da faydal\u0131 olabilir.<\/p>\n<pre><code class=\"language-gradle\">dependencies {\n    \/\/ ... di\u011fer ba\u011f\u0131ml\u0131l\u0131klar\n\n    \/\/ Compose UI Test Ba\u011f\u0131ml\u0131l\u0131klar\u0131\n    debugImplementation \"androidx.compose.ui:ui-test-manifest:1.6.7\"\n    androidTestImplementation \"androidx.compose.ui:ui-test-junit4:1.6.7\"\n\n    \/\/ Espresso Core (iste\u011fe ba\u011fl\u0131, ancak faydal\u0131)\n    androidTestImplementation \"androidx.test.espresso:espresso-core:3.5.1\"\n\n    \/\/ JUnit (testler i\u00e7in)\n    androidTestImplementation \"androidx.test.ext:junit:1.1.5\"\n    androidTestImplementation \"androidx.test.espresso:espresso-core:3.5.1\"\n}<\/pre>\n<p><\/code><br \/>\n<code>debugImplementation<\/code> ile eklenen <code>ui-test-manifest<\/code>, yaln\u0131zca debug build'lerinde kullan\u0131lan bir manifest dosyas\u0131d\u0131r ve testlerin d\u00fczg\u00fcn \u00e7al\u0131\u015fmas\u0131 i\u00e7in gereklidir.<\/p>\n<h4>1.2. Test Ortam\u0131n\u0131 Haz\u0131rlama<\/h4>\n<p>Android Studio'da UI testleri genellikle <code>app\/src\/androidTest\/java<\/code> dizini alt\u0131nda yer al\u0131r. Bu dizin, uygulaman\u0131z\u0131n ger\u00e7ek cihazlarda veya em\u00fclat\u00f6rlerde \u00e7al\u0131\u015fan enstr\u00fcmantasyon testleri i\u00e7in ayr\u0131lm\u0131\u015ft\u0131r. Yeni bir test s\u0131n\u0131f\u0131 olu\u015fturdu\u011funuzda, bu dizin alt\u0131nda yer ald\u0131\u011f\u0131ndan emin olun.<\/p>\n<h4>1.3. Temel Bir Compose Test S\u0131n\u0131f\u0131 Olu\u015fturma<\/h4>\n<p>Her Compose UI testi, <code>ComposeTestRule<\/code> ad\u0131 verilen \u00f6zel bir JUnit kural\u0131 kullan\u0131r. Bu kural, test edilecek Compose i\u00e7eri\u011fini ayarlaman\u0131za ve UI ile etkile\u015fime ge\u00e7menize olanak tan\u0131r.<\/p>\n<pre><code class=\"language-kotlin\">import androidx.compose.ui.test.junit4.createComposeRule\nimport androidx.compose.ui.test.onNodeWithText\nimport androidx.compose.ui.test.performClick\nimport androidx.test.ext.junit.runners.AndroidJUnit4\nimport org.junit.Rule\nimport org.junit.Test\nimport org.junit.runner.RunWith\n\n@RunWith(AndroidJUnit4::class)\nclass MyComposeUITest {\n\n    @get:Rule\n    val composeTestRule = createComposeRule()\n\n    @Test\n    fun myFirstComposeTest() {\n        \/\/ Test edilecek Compose i\u00e7eri\u011fini ayarla\n        composeTestRule.setContent {\n            \/\/ MyComposable() gibi test edilecek bir Composable buraya gelir\n            Greeting(\"Android\")\n        }\n\n        \/\/ UI \u00f6\u011fesini bul ve do\u011frula\n        composeTestRule.onNodeWithText(\"Hello Android!\")\n            .assertExists()\n    }\n}<\/pre>\n<p><\/code><br \/>\nBu \u00f6rnekte, <code>@RunWith(AndroidJUnit4::class)<\/code> testlerin AndroidJUnit4 test ko\u015fucusu ile \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. <code>@get:Rule<\/code> ile tan\u0131mlanan <code>composeTestRule<\/code>, her testten \u00f6nce ve sonra gerekli kurulum ve temizli\u011fi otomatik olarak yapar.<\/p>\n<h3>2. Compose Test Kural\u0131 (ComposeTestRule) ve Temelleri<\/h3>\n<p><code>ComposeTestRule<\/code>, Jetpack Compose UI testlerinin kalbidir. Bu kural, testlerinizin Compose UI hiyerar\u015fisiyle etkile\u015fime ge\u00e7mesini sa\u011flayan bir dizi y\u00f6ntem sunar.<\/p>\n<h4>2.1. <code>createComposeRule()<\/code> Kullan\u0131m\u0131<\/h4>\n<p><code>createComposeRule()<\/code> fonksiyonu, testleriniz i\u00e7in bir <code>ComposeTestRule<\/code> \u00f6rne\u011fi olu\u015fturur. Bu kural, Compose UI'\u0131n bir aktivite i\u00e7inde ba\u015flat\u0131lmas\u0131n\u0131 veya izole bir \u015fekilde test edilmesini y\u00f6netir. E\u011fer testleriniz bir aktiviteye ihtiya\u00e7 duymuyorsa (\u00f6rne\u011fin, sadece k\u00fc\u00e7\u00fck bir Composable'\u0131 test ediyorsan\u0131z), <code>createComposeRule()<\/code> yeterlidir. Ancak, bir aktiviteye ihtiyac\u0131n\u0131z varsa <code>createAndroidComposeRule<MyActivity>()<\/code> kullanman\u0131z gerekir.<\/p>\n<h4>2.2. Test Edilecek Composables'\u0131 Tan\u0131mlama (<code>setContent<\/code>)<\/h4>\n<p><code>composeTestRule.setContent { ... }<\/code> blo\u011fu, test etmek istedi\u011finiz Compose UI'\u0131n\u0131 tan\u0131mlad\u0131\u011f\u0131n\u0131z yerdir. Bu blok i\u00e7inde, uygulaman\u0131z\u0131n herhangi bir Composable fonksiyonunu \u00e7a\u011f\u0131rabilirsiniz. Test ortam\u0131, bu Composable'\u0131 sanal bir ekranda render eder ve b\u00f6ylece onunla etkile\u015fime ge\u00e7ebilir ve durumunu do\u011frulayabilirsiniz.<\/p>\n<pre><code class=\"language-kotlin\">composeTestRule.setContent {\n    \/\/ Burada uygulaman\u0131z\u0131n temas\u0131n\u0131 veya di\u011fer sa\u011flay\u0131c\u0131lar\u0131n\u0131 da ekleyebilirsiniz\n    MyApplicationTheme {\n        MyScreen(viewModel) \/\/ Bir ekran\u0131 veya bir bile\u015feni test edebilirsiniz\n    }\n}<\/pre>\n<p><\/code><\/p>\n<h4>2.3. Senkronizasyon ve \u0130dle Durumlar<\/h4>\n<p>Compose test kural\u0131, varsay\u0131lan olarak Compose UI'daki animasyonlar, \u00e7izimler ve di\u011fer asenkron i\u015flemler tamamlanana kadar bekler. Bu otomatik senkronizasyon, testlerinizin UI'\u0131n kararl\u0131 bir durumda oldu\u011funu varsaymas\u0131n\u0131 sa\u011flar. Ancak, bazen \u00f6zel durumlar veya uzun s\u00fcreli asenkron i\u015flemler i\u00e7in <code>composeTestRule.waitForIdle()<\/code> gibi manuel senkronizasyon y\u00f6ntemleri kullanman\u0131z gerekebilir.<\/p>\n<h3>3. Espresso ile Compose UI \u00d6\u011felerini Bulma (Matchers)<\/h3>\n<p>Espresso'da UI \u00f6\u011felerini bulmak i\u00e7in \"Matcher\"lar kullan\u0131l\u0131r. Compose testlerinde bu match'ler, Compose'un semantik a\u011fac\u0131 \u00fczerinde \u00e7al\u0131\u015f\u0131r ve \u00f6\u011feleri metinlerine, i\u00e7erik a\u00e7\u0131klamalar\u0131na veya test etiketlerine g\u00f6re bulman\u0131z\u0131 sa\u011flar.<\/p>\n<h4>3.1. <code>onNodeWithText<\/code>, <code>onNodeWithContentDescription<\/code>, <code>onNodeWithTag<\/code><\/h4>\n<p>*   <code>onNodeWithText(text: String)<\/code>: Belirli bir metin i\u00e7eren bir Compose d\u00fc\u011f\u00fcm\u00fcn\u00fc bulur. \u00d6rne\u011fin, bir <code>Text<\/code> Composable'\u0131 veya bir <code>Button<\/code> \u00fczerindeki metni bulmak i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <code>onNodeWithContentDescription(description: String)<\/code>: Eri\u015filebilirlik i\u00e7in ayarlanm\u0131\u015f i\u00e7erik a\u00e7\u0131klamas\u0131na sahip bir d\u00fc\u011f\u00fcm\u00fc bulur. Genellikle g\u00f6rsel \u00f6\u011feler (ikonlar, resimler) i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <code>onNodeWithTag(tag: String)<\/code>: Geli\u015ftiricinin <code>Modifier.testTag(\"myTag\")<\/code> ile \u00f6zel olarak etiketledi\u011fi bir d\u00fc\u011f\u00fcm\u00fc bulur. Bu, testler i\u00e7in \u00f6\u011feleri benzersiz bir \u015fekilde tan\u0131mlaman\u0131n en g\u00fcvenilir yollar\u0131ndan biridir.<\/p>\n<pre><code class=\"language-kotlin\">\/\/ Metin ile bulma\ncomposeTestRule.onNodeWithText(\"Kaydet\").performClick()\n\n\/\/ \u0130\u00e7erik a\u00e7\u0131klamas\u0131 ile bulma\ncomposeTestRule.onNodeWithContentDescription(\"Ayarlar ikonu\").assertIsDisplayed()\n\n\/\/ Test etiketi ile bulma\ncomposeTestRule.onNodeWithTag(\"username_input\").performTextInput(\"kullaniciadi\")<\/pre>\n<p><\/code><\/p>\n<h4>3.2. Semantik A\u011fa\u00e7 ve Eri\u015filebilirlik<\/h4>\n<p>Compose testleri, UI hiyerar\u015fisinin bir soyutlamas\u0131 olan \"semantik a\u011fa\u00e7\" \u00fczerinde \u00e7al\u0131\u015f\u0131r. Bu a\u011fa\u00e7, kullan\u0131c\u0131lar\u0131n ve eri\u015filebilirlik servislerinin etkile\u015fime girdi\u011fi bilgileri i\u00e7erir. Testlerinizde <code>onNodeWithContentDescription<\/code> gibi y\u00f6ntemleri kullanmak, uygulaman\u0131z\u0131n eri\u015filebilirlik standartlar\u0131na uygunlu\u011funu da dolayl\u0131 olarak test etmenizi sa\u011flar. <code>Modifier.semantics { ... }<\/code> ile semantik \u00f6zellikleri manuel olarak ayarlayabilirsiniz.<\/p>\n<h4>3.3. Birden Fazla E\u015fle\u015fen \u00d6\u011feyi Y\u00f6netme<\/h4>\n<p>Bazen birden fazla UI \u00f6\u011fesi ayn\u0131 metne veya \u00f6zelli\u011fe sahip olabilir. Bu durumda, <code>onNodeWithText(\"G\u00f6nder\", ignoreCase = true)<\/code> gibi y\u00f6ntemler birden fazla e\u015fle\u015fme hatas\u0131 verebilir. Bu t\u00fcr senaryolarda, <code>onAllNodesWithText(\"G\u00f6nder\")[0]<\/code> ile belirli bir indeksi hedefleyebilir veya <code>onNodeWithText(\"G\u00f6nder\").assertCountEquals(1)<\/code> ile tek bir e\u015fle\u015fme bekledi\u011finizi belirtebilirsiniz. En iyi pratik, <code>onNodeWithTag<\/code> kullanarak benzersiz etiketler sa\u011flamakt\u0131r.<\/p>\n<h3>4. Etkile\u015fimler ve Eylemler (Actions)<\/h3>\n<p>UI \u00f6\u011felerini bulduktan sonra, kullan\u0131c\u0131lar\u0131n onlarla nas\u0131l etkile\u015fime ge\u00e7ti\u011fini sim\u00fcle etmeniz gerekir. Compose test k\u00fct\u00fcphanesi, bu etkile\u015fimleri ger\u00e7ekle\u015ftirmek i\u00e7in \u00e7e\u015fitli <code>perform<\/code> eylemleri sunar.<\/p>\n<h4>4.1. T\u0131klama (<code>performClick()<\/code>)<\/h4>\n<p>Bir d\u00fc\u011fmeye, listeye veya ba\u015fka bir t\u0131klanabilir \u00f6\u011feye t\u0131klama eylemini sim\u00fcle eder.<\/p>\n<pre><code class=\"language-kotlin\">composeTestRule.onNodeWithText(\"Giri\u015f Yap\").performClick()<\/pre>\n<p><\/code><\/p>\n<h4>4.2. Metin Giri\u015fi (<code>performTextInput()<\/code>)<\/h4>\n<p>Bir <code>TextField<\/code> veya <code>BasicTextField<\/code> bile\u015fenine metin girmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-kotlin\">composeTestRule.onNodeWithTag(\"email_input\")\n    .performTextInput(\"test@example.com\")<\/pre>\n<p><\/code><\/p>\n<h4>4.3. Kayd\u0131rma (<code>performScrollTo()<\/code>)<\/h4>\n<p>Bir kayd\u0131r\u0131labilir kapsay\u0131c\u0131 i\u00e7indeki bir \u00f6\u011fenin g\u00f6r\u00fcn\u00fcr olana kadar kayd\u0131r\u0131lmas\u0131n\u0131 sa\u011flar. \u00d6zellikle uzun listeler veya kayd\u0131r\u0131labilir ekranlar i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<pre><code class=\"language-kotlin\">composeTestRule.onNodeWithText(\"Uzun Listenin Son \u00d6\u011fesi\")\n    .performScrollTo()\n    .assertIsDisplayed()<\/pre>\n<p><\/code><\/p>\n<h4>4.4. \u00d6zel Eylemler<\/h4>\n<p>Compose test k\u00fct\u00fcphanesi, <code>performGesture<\/code> veya <code>performTouchInput<\/code> gibi daha d\u00fc\u015f\u00fck seviyeli API'ler arac\u0131l\u0131\u011f\u0131yla kayd\u0131rma, s\u00fcr\u00fckleme, s\u0131k\u0131\u015ft\u0131rma gibi daha karma\u015f\u0131k hareketleri de sim\u00fcle etmenize olanak tan\u0131r. Bu, \u00f6zel UI bile\u015fenlerinin veya jestlerin test edilmesi i\u00e7in faydal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-kotlin\">\/\/ \u00d6rnek: \u00d6zel bir kayd\u0131rma hareketi\ncomposeTestRule.onNodeWithTag(\"scrollable_area\")\n    .performTouchInput {\n        swipeUp() \/\/ Yukar\u0131 kayd\u0131rma\n    }<\/pre>\n<p><\/code><\/p>\n<h3>5. Do\u011frulamalar (Assertions)<\/h3>\n<p>Bir UI \u00f6\u011fesiyle etkile\u015fime ge\u00e7tikten sonra, uygulaman\u0131z\u0131n UI'\u0131n\u0131n beklenen duruma ula\u015ft\u0131\u011f\u0131n\u0131 do\u011frulamak i\u00e7in <code>assert<\/code> y\u00f6ntemlerini kullan\u0131rs\u0131n\u0131z.<\/p>\n<h4>5.1. Metin Do\u011frulamas\u0131 (<code>assertTextEquals()<\/code>, <code>assertTextContains()<\/code>)<\/h4>\n<p>Bir \u00f6\u011fenin belirli bir metni i\u00e7erip i\u00e7ermedi\u011fini veya tam olarak o metne e\u015fit olup olmad\u0131\u011f\u0131n\u0131 kontrol eder.<\/p>\n<pre><code class=\"language-kotlin\">composeTestRule.onNodeWithTag(\"welcome_message\")\n    .assertTextEquals(\"Ho\u015f Geldiniz!\")\n\ncomposeTestRule.onNodeWithText(\"\u00dcr\u00fcn Listesi\")\n    .assertTextContains(\"Listesi\")<\/pre>\n<p><\/code><\/p>\n<h4>5.2. G\u00f6r\u00fcn\u00fcrl\u00fck Do\u011frulamas\u0131 (<code>assertIsDisplayed()<\/code>, <code>assertIsNotDisplayed()<\/code>)<\/h4>\n<p>Bir \u00f6\u011fenin ekranda g\u00f6r\u00fcn\u00fcp g\u00f6r\u00fcnmedi\u011fini kontrol eder. Bu, genellikle bir \u00f6\u011fenin ko\u015fullu olarak render edildi\u011fi durumlarda kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-kotlin\">composeTestRule.onNodeWithText(\"Hata Mesaj\u0131\")\n    .assertIsNotDisplayed() \/\/ Ba\u015flang\u0131\u00e7ta g\u00f6r\u00fcnmemeli\n\n\/\/ Bir eylem sonras\u0131 g\u00f6r\u00fcn\u00fcr hale gelirse\ncomposeTestRule.onNodeWithText(\"Hata Mesaj\u0131\")\n    .assertIsDisplayed()<\/pre>\n<p><\/code><\/p>\n<h4>5.3. Durum Do\u011frulamas\u0131 (<code>assertIsEnabled()<\/code>, <code>assertIsSelected()<\/code>, <code>assertIsFocused()<\/code>)<\/h4>\n<p>Bir \u00f6\u011fenin etkin (enabled), se\u00e7ili (selected) veya odaklanm\u0131\u015f (focused) gibi belirli bir duruma sahip olup olmad\u0131\u011f\u0131n\u0131 do\u011frular.<\/p>\n<pre><code class=\"language-kotlin\">composeTestRule.onNodeWithText(\"G\u00f6nder Butonu\")\n    .assertIsNotEnabled() \/\/ Form ge\u00e7erli de\u011filse devre d\u0131\u015f\u0131 olmal\u0131\n\n\/\/ Form doldurulduktan sonra\ncomposeTestRule.onNodeWithText(\"G\u00f6nder Butonu\")\n    .assertIsEnabled()<\/pre>\n<p><\/code><\/p>\n<h4>5.4. Semantik \u00d6zellik Do\u011frulamas\u0131<\/h4>\n<p><code>assert()<\/code> ile daha genel semantik \u00f6zellikler \u00fczerinde do\u011frulama yapabilirsiniz. \u00d6rne\u011fin, bir \u00f6\u011fenin t\u0131klanabilir olup olmad\u0131\u011f\u0131n\u0131 veya belirli bir rol\u00fc olup olmad\u0131\u011f\u0131n\u0131 kontrol edebilirsiniz.<\/p>\n<pre><code class=\"language-kotlin\">composeTestRule.onNodeWithText(\"Ayarlar\")\n    .assert(hasClickAction()) \/\/ T\u0131klanabilir oldu\u011funu do\u011frula<\/pre>\n<p><\/code><\/p>\n<h3>6. Geli\u015fmi\u015f Test Senaryolar\u0131 ve \u0130pu\u00e7lar\u0131<\/h3>\n<p>Daha karma\u015f\u0131k uygulamalar i\u00e7in, Compose UI testlerinizi daha etkili ve s\u00fcrd\u00fcr\u00fclebilir hale getirecek baz\u0131 ileri d\u00fczey teknikler ve ipu\u00e7lar\u0131 mevcuttur.<\/p>\n<h4>6.1. Kapsaml\u0131 Testler \u0130\u00e7in Mod\u00fcler Yakla\u015f\u0131m<\/h4>\n<p>B\u00fcy\u00fck ekranlar\u0131 veya karma\u015f\u0131k bile\u015fenleri test ederken, her \u015feyi tek bir test fonksiyonunda yapmak yerine, testleri daha k\u00fc\u00e7\u00fck, y\u00f6netilebilir par\u00e7alara ay\u0131rmak faydal\u0131d\u0131r. Her Composable veya ekran i\u00e7in ayr\u0131 bir test s\u0131n\u0131f\u0131 olu\u015fturmak, testlerin okunabilirli\u011fini ve bak\u0131m\u0131n\u0131 art\u0131r\u0131r. Ayr\u0131ca, test helper fonksiyonlar\u0131 veya Page Object Model benzeri desenler kullanarak test kodunuzu daha mod\u00fcler hale getirebilirsiniz.<\/p>\n<h4>6.2. Test Helper Fonksiyonlar\u0131<\/h4>\n<p>Tekrar eden test ad\u0131mlar\u0131n\u0131 veya karma\u015f\u0131k etkile\u015fimleri soyutlamak i\u00e7in helper fonksiyonlar\u0131 yazabilirsiniz. \u00d6rne\u011fin, bir giri\u015f formunu doldurmak i\u00e7in bir fonksiyon:<\/p>\n<pre><code class=\"language-kotlin\">fun fillLoginForm(email: String, password: String) {\n    composeTestRule.onNodeWithTag(\"email_input\").performTextInput(email)\n    composeTestRule.onNodeWithTag(\"password_input\").performTextInput(password)\n    composeTestRule.onNodeWithText(\"Giri\u015f Yap\").performClick()\n}\n\n@Test\nfun testSuccessfulLogin() {\n    composeTestRule.setContent { LoginForm() }\n    fillLoginForm(\"user@example.com\", \"password123\")\n    composeTestRule.onNodeWithText(\"Ho\u015f Geldiniz!\").assertIsDisplayed()\n}<\/pre>\n<p><\/code><\/p>\n<h4>6.3. Animasyonlar\u0131 ve Zamanlamay\u0131 Y\u00f6netme<\/h4>\n<p>Compose test kural\u0131, varsay\u0131lan olarak animasyonlar\u0131n bitmesini bekler. Ancak, bazen animasyonlar\u0131 devre d\u0131\u015f\u0131 b\u0131rakmak veya belirli bir animasyonun tamamlanmas\u0131n\u0131 beklemek isteyebilirsiniz. <code>composeTestRule.mainClock.autoAdvance = false<\/code> ile otomatik zaman ilerlemesini kapat\u0131p <code>composeTestRule.mainClock.advanceTimeBy(durationMillis)<\/code> ile manuel olarak ilerletebilirsiniz.<\/p>\n<h4>6.4. \u00c7oklu Ekran Boyutlar\u0131 \u0130\u00e7in Test Stratejileri<\/h4>\n<p>Farkl\u0131 ekran boyutlar\u0131 ve y\u00f6nelimleri i\u00e7in UI'\u0131n\u0131z\u0131n do\u011fru \u015fekilde render edildi\u011fini test etmek \u00f6nemlidir. Bunun i\u00e7in farkl\u0131 cihaz konfig\u00fcrasyonlar\u0131n\u0131 sim\u00fcle eden testler yazabilir veya belirli bir Composable'\u0131n farkl\u0131 boyutlarda nas\u0131l davrand\u0131\u011f\u0131n\u0131 kontrol etmek i\u00e7in <code>composeTestRule.setContent<\/code> i\u00e7inde <code>BoxWithConstraints<\/code> gibi bile\u015fenler kullanabilirsiniz.<\/p>\n<h3>7. Test Edilebilir Compose Kod Yazma Pratikleri<\/h3>\n<p>Testlerinizi daha kolay ve etkili hale getirmek i\u00e7in Compose kodunuzu belirli prensiplere g\u00f6re yazman\u0131z \u00f6nemlidir.<\/p>\n<h4>7.1. Durum Y\u00f6netimini Ay\u0131rma (Stateless Composables)<\/h4>\n<p>Composables'lar\u0131n\u0131z\u0131 m\u00fcmk\u00fcn oldu\u011funca \"stateless\" (durumsuz) olarak tasarlay\u0131n. Yani, durumlar\u0131 Composable'\u0131n d\u0131\u015f\u0131ndan parametre olarak als\u0131nlar ve olaylar\u0131 geri \u00e7a\u011f\u0131rma (callback) fonksiyonlar\u0131 arac\u0131l\u0131\u011f\u0131yla d\u0131\u015far\u0131ya bildirsinler. Bu, Composable'lar\u0131 izole bir \u015fekilde test etmeyi kolayla\u015ft\u0131r\u0131r.<\/p>\n<pre><code class=\"language-kotlin\">\/\/ Test edilmesi kolay stateless Composable\n@Composable\nfun MyButton(text: String, onClick: () -> Unit, isEnabled: Boolean) {\n    Button(onClick = onClick, enabled = isEnabled) {\n        Text(text)\n    }\n}<\/pre>\n<p><\/code><\/p>\n<h4>7.2. Test Etiketleri (<code>testTag<\/code>) Kullan\u0131m\u0131<\/h4>\n<p><code>Modifier.testTag(\"my_unique_tag\")<\/code> kullanarak UI \u00f6\u011felerinize benzersiz etiketler atay\u0131n. Bu etiketler, \u00f6\u011feleri testlerde g\u00fcvenilir bir \u015fekilde bulman\u0131n en iyi yoludur, \u00e7\u00fcnk\u00fc metin veya i\u00e7erik a\u00e7\u0131klamalar\u0131 de\u011fi\u015febilirken test etiketleri genellikle sabit kal\u0131r.<\/p>\n<pre><code class=\"language-kotlin\">TextField(\n    value = username,\n    onValueChange = { username = it },\n    modifier = Modifier.testTag(\"username_input\")\n)<\/pre>\n<p><\/code><\/p>\n<h4>7.3. Ba\u011f\u0131ml\u0131l\u0131k Enjeksiyonu ve Mocking<\/h4>\n<p>ViewModel'lar veya repository'ler gibi ba\u011f\u0131ml\u0131l\u0131klar\u0131 olan Composables'lar\u0131 test ederken, ger\u00e7ek ba\u011f\u0131ml\u0131l\u0131klar yerine sahte (mock) ba\u011f\u0131ml\u0131l\u0131klar kullan\u0131n. Hilt veya Koin gibi ba\u011f\u0131ml\u0131l\u0131k enjeksiyon k\u00fct\u00fcphaneleri, testlerde sahte ba\u011f\u0131ml\u0131l\u0131klar\u0131 sa\u011flamay\u0131 kolayla\u015ft\u0131r\u0131r. Bu, UI testlerinizin h\u0131zl\u0131 ve izole kalmas\u0131n\u0131 sa\u011flar, d\u0131\u015f servislerin veya veri kaynaklar\u0131n\u0131n durumundan etkilenmez.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Jetpack Compose, UI geli\u015ftirmede devrim niteli\u011finde bir de\u011fi\u015fim sunarken, sa\u011flam test stratejileriyle desteklenmesi gereken bir teknolojidir. Espresso ve Compose test k\u00fct\u00fcphanesini kullanarak, Compose UI'\u0131n\u0131z\u0131 g\u00fcvenle test edebilir, kullan\u0131c\u0131 deneyiminin tutarl\u0131 ve hatas\u0131z olmas\u0131n\u0131 sa\u011flayabilirsiniz. <code>ComposeTestRule<\/code> ile test ortam\u0131n\u0131 kurmaktan, <code>onNodeWithTag<\/code> ile \u00f6\u011feleri bulmaya, <code>performClick<\/code> ile etkile\u015fime ge\u00e7meye ve <code>assertIsDisplayed<\/code> ile do\u011frulamaya kadar \u00f6\u011frendi\u011finiz bu y\u00f6ntemler, Compose uygulaman\u0131z\u0131n kalitesini art\u0131rmak i\u00e7in temel ta\u015flard\u0131r. Test edilebilir kod yazma pratiklerini benimseyerek ve ileri d\u00fczey test senaryolar\u0131n\u0131 uygulayarak, geli\u015ftirme s\u00fcrecinizi daha verimli ve g\u00fcvenilir hale getirebilirsiniz.<\/p>\n<h3>SSS (S\u0131k Sorulan Sorular)<\/h3>\n<h4>1. Compose UI testleri ile geleneksel Android UI testleri aras\u0131ndaki temel fark nedir?<\/h4>\n<p>Geleneksel Android UI testleri (Espresso ile View tabanl\u0131), UI hiyerar\u015fisini ve View objelerini do\u011frudan manip\u00fcle eder. Compose UI testleri ise Compose'un deklaratif yap\u0131s\u0131n\u0131 kullanarak \"semantik a\u011fa\u00e7\" \u00fczerinde \u00e7al\u0131\u015f\u0131r. Bu, testlerin daha soyut ve bile\u015fen tabanl\u0131 olmas\u0131n\u0131 sa\u011flar, UI'\u0131n i\u00e7 \u00e7al\u0131\u015fma detaylar\u0131ndan ziyade kullan\u0131c\u0131 deneyimine odaklan\u0131r.<\/p>\n<h4>2. Compose UI testlerinde Mockito gibi k\u00fct\u00fcphaneleri kullanabilir miyim?<\/h4>\n<p>Evet, kesinlikle. Mockito veya MockK gibi mocking k\u00fct\u00fcphaneleri, ViewModel'lar, repository'ler veya di\u011fer ba\u011f\u0131ml\u0131l\u0131klar\u0131 sahte nesnelerle de\u011fi\u015ftirmek i\u00e7in Compose UI testlerinde yayg\u0131n olarak kullan\u0131l\u0131r. Bu, UI testlerinizin sadece UI katman\u0131na odaklanmas\u0131n\u0131 ve d\u0131\u015f ba\u011f\u0131ml\u0131l\u0131klar\u0131n davran\u0131\u015flar\u0131ndan etkilenmemesini sa\u011flar.<\/p>\n<h4>3. Asenkron i\u015flemleri (\u00f6rne\u011fin, API \u00e7a\u011fr\u0131lar\u0131) Compose UI testlerinde nas\u0131l y\u00f6netirim?<\/h4>\n<p>Compose test kural\u0131, varsay\u0131lan olarak Compose'daki asenkron i\u015flemlerin (\u00f6rne\u011fin, <code>LaunchedEffect<\/code>, <code>rememberCoroutineScope<\/code> i\u00e7indeki coroutine'ler) tamamlanmas\u0131n\u0131 bekler. Ancak, harici API \u00e7a\u011fr\u0131lar\u0131 gibi daha uzun s\u00fcreli i\u015flemler i\u00e7in, ViewModel'lar\u0131n\u0131zda veya repository'lerinizde sahte (mock) veri d\u00f6nd\u00fcrerek bu i\u015flemleri sim\u00fcle etmelisiniz. Bu, testlerinizin h\u0131zl\u0131 ve deterministik kalmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>4. Compose UI testlerinde s\u0131k kar\u015f\u0131la\u015f\u0131lan tuzaklar nelerdir?<\/h4>\n<p>*   <strong>Yanl\u0131\u015f e\u015fle\u015ftiriciler (matchers):<\/strong> Birden fazla \u00f6\u011feyi e\u015fle\u015ftiren veya hi\u00e7 e\u015fle\u015fmeyen match'ler kullanmak. <code>testTag<\/code> kullan\u0131m\u0131 bu sorunu b\u00fcy\u00fck \u00f6l\u00e7\u00fcde \u00e7\u00f6zer.<br \/>\n*   <strong>Senkronizasyon sorunlar\u0131:<\/strong> \u00d6zellikle karma\u015f\u0131k animasyonlar veya manuel zaman ilerlemesi kullan\u0131lan durumlarda UI'\u0131n kararl\u0131 bir duruma gelmesini beklememek.<br \/>\n*   <strong>Ba\u011f\u0131ml\u0131l\u0131klar\u0131n sahtelenmemesi:<\/strong> Ger\u00e7ek ba\u011f\u0131ml\u0131l\u0131klarla test yapmak, testlerin yava\u015flamas\u0131na ve d\u0131\u015f etkenlere ba\u011f\u0131ml\u0131 hale gelmesine neden olur.<br \/>\n*   <strong>Eri\u015filebilirlik eksikli\u011fi:<\/strong> <code>contentDescription<\/code> veya <code>semantics<\/code> modifier'lar\u0131n\u0131 kullanmamak, hem eri\u015filebilirlik sorunlar\u0131na yol a\u00e7ar hem de testlerde \u00f6\u011feleri bulmay\u0131 zorla\u015ft\u0131r\u0131r.<\/p>\n","protected":false},"excerpt":{"rendered":"Jetpack Compose UI&#8217;\u0131 Espresso ile G\u00fcvenle Test Etme Rehberi\nModern Android uygulama geli\u015ftirmede Jetpack Compose, deklaratif UI yakla\u015f\u0131m\u0131yla geli\u015ftir&#8230;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-39385","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Jetpack Compose UI&#039;\u0131 Espresso ile G\u00fcvenle Test Etme Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Jetpack Compose UI&#039;\u0131 Espresso ile G\u00fcvenle Test Etme Rehberi\" \/>\n<meta property=\"og:description\" content=\"Jetpack Compose UI&#039;\u0131 Espresso ile G\u00fcvenle Test Etme Rehberi Modern Android uygulama geli\u015ftirmede Jetpack Compose, deklaratif UI yakla\u015f\u0131m\u0131yla geli\u015ftir...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-20T08:30:36+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Jetpack Compose UI&#8217;\u0131 Espresso ile G\u00fcvenle Test Etme Rehberi\",\"datePublished\":\"2026-02-20T08:30:36+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi\/\"},\"wordCount\":2032,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi\/\",\"name\":\"Jetpack Compose UI'\u0131 Espresso ile G\u00fcvenle Test Etme Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-20T08:30:36+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Jetpack Compose UI&#8217;\u0131 Espresso ile G\u00fcvenle Test Etme Rehberi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Jetpack Compose UI'\u0131 Espresso ile G\u00fcvenle Test Etme Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Jetpack Compose UI'\u0131 Espresso ile G\u00fcvenle Test Etme Rehberi","og_description":"Jetpack Compose UI'\u0131 Espresso ile G\u00fcvenle Test Etme Rehberi Modern Android uygulama geli\u015ftirmede Jetpack Compose, deklaratif UI yakla\u015f\u0131m\u0131yla geli\u015ftir...","og_url":"https:\/\/fatihsoysal.com\/blog\/jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-20T08:30:36+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"12 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Jetpack Compose UI&#8217;\u0131 Espresso ile G\u00fcvenle Test Etme Rehberi","datePublished":"2026-02-20T08:30:36+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi\/"},"wordCount":2032,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi\/","name":"Jetpack Compose UI'\u0131 Espresso ile G\u00fcvenle Test Etme Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-20T08:30:36+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/jetpack-compose-uii-espresso-ile-guvenle-test-etme-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Jetpack Compose UI&#8217;\u0131 Espresso ile G\u00fcvenle Test Etme Rehberi"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39385","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=39385"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39385\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=39385"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=39385"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=39385"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}