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() } } } }