Uygulamanızın etkinliklerini test etme

Etkinlikler, uygulamanızdaki her kullanıcı etkileşimi için kapsayıcı görevi görür. Bu nedenle, uygulamanızın etkinliklerinin aşağıdaki gibi cihaz düzeyindeki etkinlikler sırasında nasıl davrandığını test etmek önemlidir:

  • Cihazın telefon uygulaması gibi başka bir uygulama, uygulamanızın etkinliğini kesintiye uğratır.
  • Sistem, etkinliğinizi yok edip yeniden oluşturur.
  • Kullanıcı, etkinliğinizi pencere içinde pencere (PIP) veya çoklu pencere gibi yeni bir pencere ortamına yerleştirir.

Özellikle, etkinliğinizin Etkinlik yaşam döngüsü bölümünde açıklanan etkinliklere doğru şekilde yanıt verdiğinden emin olmanız önemlidir.

Bu kılavuzda, uygulamanızın etkinlikleri yaşam döngülerinde farklı durumlara geçerken uygulamanızın veri bütünlüğünü ve iyi bir kullanıcı deneyimini koruma becerisinin nasıl değerlendirileceği açıklanmaktadır.

Compose'da test etkinlikleri

Jetpack Compose ile oluşturulmuş bir uygulamayı test ederken genellikle etkinliğinizi başlatmak ve kullanıcı arayüzü bileşenlerinizle etkileşim kurmak için createAndroidComposeRule kullanırsınız.

Ancak yapılandırma değişiklikleri veya etkinliğin sistem tarafından arka plana alınması ya da yok edilmesi gibi cihaz düzeyindeki etkinliklerin test edilmesi için etkinliğin yaşam döngüsünü doğrudan değiştirmeniz gerekir. Bunu yapmak için temel ActivityScenario çerçevesini kullanırsınız.

Oluşturma testi kuralı, bu senaryoyu sizin için otomatik olarak sarmalar ve yönetir. Bu kılavuzda, modern kullanıcı arayüzü testi ile standart yaşam döngüsü yönetimi arasındaki boşluğu doldurmak için aşağıdaki kalıbın kullanıldığını göreceksiniz:

@get:Rule
val composeTestRule = createAndroidComposeRule<MyActivity>()

@Test fun testEvent() {
    val scenario = composeTestRule.activityRule.scenario

    // ...
}

Etkinliğin durumunu yönetme

Uygulamanızın etkinliklerini test etmenin önemli bir yönü, uygulamanızın etkinliklerini belirli durumlara yerleştirmeyi içerir. Testlerinizin bu "verilen" bölümünü tanımlamak için AndroidX Test kitaplığının bir parçası olan ActivityScenario örneklerini kullanın. Bu sınıfı kullanarak etkinliğinizi cihaz düzeyindeki etkinlikleri simüle eden durumlara yerleştirebilirsiniz.

ActivityScenario, hem yerel birim testlerinde hem de cihaz üzerinde entegrasyon testlerinde kullanabileceğiniz platformlar arası bir API'dir. Gerçek veya sanal bir cihazda, ActivityScenario, iş parçacığı güvenliği sağlar ve testinizin enstrümantasyon iş parçacığı ile test edilen etkinliğinizi çalıştıran iş parçacığı arasındaki etkinlikleri senkronize eder.

API, özellikle test edilen bir etkinliğin yok edildiğinde veya oluşturulduğunda nasıl davrandığını değerlendirmek için uygundur. Bu bölümde, bu API ile ilişkili en yaygın kullanım alanları açıklanmaktadır.

Etkinlik oluşturma

Test edilen etkinliği oluşturmak için aşağıdaki snippet'te gösterilen kodu ekleyin:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
       launchActivity<MyActivity>().use {
       }
    }
}

Etkinlik oluşturulduktan sonra ActivityScenario, etkinliği RESUMED durumuna geçirir. Bu durum, etkinliğinizin çalıştığını ve kullanıcılara gösterildiğini belirtir. Bu durumda, Compose testing API'lerini kullanarak etkinliğinizin composable'larıyla etkileşimde bulunabilirsiniz.

Google, test tamamlandığında etkinlikte close işlevini çağırmanızı önerir. Bu işlem, ilişkili kaynakları temizler ve testlerinizin kararlılığını artırır. ActivityScenario uygulandığı için Closeable, etkinliğin otomatik olarak kapanması için use uzantısını uygulayabilirsiniz.

Alternatif olarak, her testten önce etkinliği otomatik olarak başlatmak, yıkımı yönetmek ve hem Compose kullanıcı arayüzü test yöntemlerine hem de temel ActivityScenario'ye erişmenizi sağlamak için createAndroidComposeRule kullanabilirsiniz. Aşağıdaki örnekte, bir kuralın nasıl tanımlanacağı ve bu kuraldan nasıl senaryo örneği alınacağı gösterilmektedir:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @get:Rule
    val composeTestRule = createAndroidComposeRule<MyActivity>()

    @Test fun testEvent() {
        val scenario = composeTestRule.activityRule.scenario
    }
}

Etkinliği yeni bir duruma yönlendirme

Etkinliği CREATED veya STARTED gibi farklı bir duruma getirmek için moveToState işlevini çağırın. Bu işlem, etkinliğinizin başka bir uygulama veya sistem işlemi tarafından kesintiye uğraması nedeniyle durdurulduğu ya da duraklatıldığı bir durumu simüle eder.

moveToState öğesinin örnek kullanımı aşağıdaki kod snippet'inde gösterilmektedir:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.moveToState(State.CREATED)
        }
    }
}

Mevcut etkinlik durumunu belirleme

Test edilen bir etkinliğin mevcut durumunu belirlemek için ActivityScenario nesnenizdeki state alanının değerini alın. Etkinlik başka bir etkinliğe yönlendiriyorsa veya kendi kendine tamamlanıyorsa (aşağıdaki kod snippet'inde gösterildiği gibi) test edilen bir etkinliğin durumunu kontrol etmek özellikle yararlıdır:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.onActivity { activity ->
              startActivity(Intent(activity, MyOtherActivity::class.java))
            }

            val originalActivityState = scenario.state
        }
    }
}

Etkinliği yeniden oluşturma

Bir cihazın kaynakları azaldığında sistem bir etkinliği yok edebilir. Bu durumda, kullanıcı uygulamanıza döndüğünde uygulamanızın bu etkinliği yeniden oluşturması gerekir. Bu koşulları simüle etmek için recreate işlevini çağırın:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.recreate()
        }
    }
}

ActivityScenario sınıfı, etkinliğin kaydedilmiş örnek durumunu ve @NonConfigurationInstance kullanılarak açıklama eklenmiş tüm nesneleri korur. Bu nesneler, test edilen etkinliğinizin yeni örneğine yüklenir.

Etkinlik sonuçlarını alma

Tamamlanmış bir etkinlikle ilişkili sonuç kodunu veya verileri almak için result alanının ActivityScenario nesnenizdeki değerini alın. Aşağıdaki kod snippet'inde gösterildiği gibi, createAndroidComposeRule kullanarak etkinliği tamamlayan kullanıcı arayüzü işlemini kolayca tetikleyebilirsiniz:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @get:Rule
    val composeTestRule = createAndroidComposeRule<MyActivity>()

    @Test fun testResult() {
        composeTestRule.onNodeWithTag("finish_button").performClick()

        val scenario = composeTestRule.activityRule.scenario
        val resultCode = scenario.result.resultCode
        val resultData = scenario.result.resultData
    }
}

Etkinlikteki işlemleri tetikleme

ActivityScenario içindeki tüm yöntemler engelleme çağrılarıdır. Bu nedenle API, bunları enstrümantasyon iş parçacığında çalıştırmanızı gerektirir.

Test edilen etkinliğinizde işlemleri tetiklemek için Compose Testing API'lerini kullanarak composable'larınızla etkileşim kurun:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @get:Rule
    val composeTestRule = createAndroidComposeRule<MyActivity>()

    @Test fun testEvent() {
        composeTestRule.onNodeWithText("Refresh").performClick()
    }
}

Ancak etkinliğin kendisinde bir yöntemi çağırmanız gerekiyorsa onActivity kullanarak bunu güvenli bir şekilde yapabilirsiniz:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use { scenario ->
            scenario.onActivity { activity ->
              activity.handleSwipeToRefresh()
            }
        }
    }
}

Ek kaynaklar

Test hakkında daha fazla bilgi için aşağıdaki ek kaynaklara bakın:

Belgeler