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, aşağıdakiler gibi cihaz düzeyindeki etkinlikler sırasında uygulama etkinliklerinizin nasıl davrandığını test etmeniz önemlidir:

  • Uygulamanızın etkinliğini, cihazın telefon uygulaması gibi başka bir uygulama kesintiye uğratır.
  • Sistem, etkinliğinizi yok eder ve 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ü'nde açıklanan etkinliklere yanıt olarak doğru davrandığından emin olmanız önemlidir.

Bu kılavuzda, uygulama yaşam döngüleri içinde farklı durumlara geçiş yaparken uygulamanızın veri bütünlüğünü ve iyi bir kullanıcı deneyimini sağlama becerisini nasıl değerlendireceğiniz açıklanmaktadır.

Bir etkinliğin durumunu yönlendirme

Uygulamanızın etkinliklerini test etmenin temel yönlerinden biri, uygulamanızın etkinliklerini belirli durumlara yerleştirmektir. 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. ActivityScenario, gerçek veya sanal bir cihazda iş parçacığı güvenliği sağlar, etkinlikleri test enstrümantasyon iş parçacığınız ile etkinliğinizi test edilen iş parçacığı arasında senkronize eder.

API, özellikle test edilen bir etkinliğin kaldırılması veya oluşturulduğunda nasıl davranacağının değerlendirilmesi için uygundur. Bu bölümde, bu API ile ilişkili en yaygın kullanım alanları gösterilmektedir.

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 {
       }
    }
}

ActivityScenario, etkinliği oluşturduktan sonra etkinliği RESUMED durumuna geçirir. Bu durum, etkinliğinizin çalıştığını ve kullanıcılar tarafından görülebildiğini belirtir. Bu durumdayken, Espresso kullanıcı arayüzü testlerini kullanarak etkinliğinizin View öğeleriyle etkileşimde bulunabilirsiniz.

Google, test tamamlandığında etkinlikte close öğesini çağırmanızı önerir. Bu işlem, ilişkili kaynakları temizler ve testlerinizin kararlılığını iyileştirir. ActivityScenario, Closeable kodunu uygular. Dolayısıyla use uzantısını veya Java programlama dilinde try-with-resources uzantısını uygulayabilirsiniz. Böylece etkinlik otomatik olarak kapanır.

Alternatif olarak, her testten önce ActivityScenario.launch ve test sökümü sırasında ActivityScenario.close otomatik olarak çağırmak için ActivityScenarioRule ifadesini kullanabilirsiniz. Aşağıdaki örnekte, bir kuralın nasıl tanımlanacağı ve kuraldan bir senaryonun nasıl alınacağı gösterilmektedir:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @get:Rule var activityScenarioRule = activityScenarioRule<MyActivity>()

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

Etkinliği yeni bir duruma getirme

Etkinliği CREATED veya STARTED gibi farklı bir duruma getirmek için moveToState() numaralı telefonu arayın. Bu işlem, sırasıyla başka bir uygulama veya sistem işlemi nedeniyle etkinliğinizin durdurulduğu veya duraklatıldığı bir durumu simüle eder.

Şu kod snippet'inde moveToState() kullanımına ilişkin bir örnek yer almaktadır:

@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. Aşağıdaki kod snippet'inde gösterildiği gibi, test edilen bir etkinliğin durumunun başka bir etkinliğe yönlendirme yapıp yapmadığını veya kendisini tamamlayıp tamamlamadığını kontrol etmek özellikle faydalı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ştur

Bir cihazın kaynakları azaldığında sistem bir etkinliği yok ederek kullanıcı uygulamanıza döndüğünde uygulamanızın bu etkinliği yeniden oluşturmasını gerektirebilir. Bu koşulları simüle etmek için recreate() yöntemini çağırın:

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

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

Etkinlik sonuçlarını alma

Sonuç kodunu veya bitmiş bir etkinlikle ilişkili verileri almak için aşağıdaki kod snippet'inde gösterildiği gibi ActivityScenario nesnenizdeki result alanının değerini alın:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testResult() {
        launchActivity<MyActivity>().use {
            onView(withId(R.id.finish_button)).perform(click())

            // Activity under test is now finished.

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

Etkinlikteki tetikleyici işlemleri

ActivityScenario içindeki tüm yöntemler çağrıları engellediğinden API, bunları araç ileti dizisinde çalıştırmanızı gerektirir.

Test edilen etkinliğinizde işlemleri tetiklemek amacıyla görünümdeki öğelerle etkileşimde bulunmak için Espresso görünüm eşleştiricileri kullanın:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEvent() {
        launchActivity<MyActivity>().use {
            onView(withId(R.id.refresh)).perform(click())
        }
    }
}

Ancak etkinliğin kendisinde bir yöntem çağırmanız gerekiyorsa ActivityAction yöntemini uygulayarak bunu güvenli bir şekilde yapabilirsiniz:

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