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 veri bütünlüğünü ve iyi bir kullanıcı deneyimini koruma becerisini nasıl değerlendireceğiniz açıklanmaktadır.
Etkinliğin durumunu yönetme
Uygulamanızın etkinliklerini test etmenin önemli bir yönü, uygulamanızın etkinliklerini belirli durumlara yerleştirmektir. Testlerinizin bu "verilen" bölümünü tanımlamak için ActivityScenario örneklerini kullanın. Bu örnekler, AndroidX Test kitaplığının bir parçasıdır. 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, ileti dizisi güvenliği sağlar. Testinizin enstrümantasyon ileti dizisi ile test edilen etkinliğinizi çalıştıran ileti dizisi 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ılar tarafından görülebildiğini gösterir. Bu durumda, Espresso kullanıcı arayüzü testlerini kullanarak etkinliğinizin View öğeleriyle etkileşimde bulunabilirsiniz.
Google, test tamamlandığında etkinlikte close numaralı telefonu aramanızı önerir. Bu işlem, ilişkili kaynakları temizler ve testlerinizin kararlılığını artırır. ActivityScenario, Closeable işlevini uygular. Böylece, etkinliğin otomatik olarak kapanması için use uzantısını veya Java programlama dilinde try-with-resources işlevini uygulayabilirsiniz.
Alternatif olarak, her testten önce ActivityScenarioRule ve test sökme işleminde ActivityScenario.close otomatik olarak çağırmak için ActivityScenario.launch 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 var activityScenarioRule = activityScenarioRule<MyActivity>() @Test fun testEvent() { val scenario = activityScenarioRule.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 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 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 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 görünümünüzdeki öğelerle etkileşim kurmak üzere Espresso görünüm eşleştiricilerini 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öntemi ç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() } } } }