Bu konuda, her bir parçanın davranışını değerlendiren testlere çerçeve tarafından sağlanan API'lerin nasıl dahil edileceği açıklanmaktadır.
Parçalar, uygulamanız içinde tekrar kullanılabilir kapsayıcılar olarak işlev görür ve çeşitli etkinliklerde ve düzen yapılandırmalarında aynı kullanıcı arayüzü düzenini sunmanıza olanak tanır. Parçaların çok yönlülüğü göz önünde bulundurulduğunda, bunların tutarlı ve kaynak açısından verimli bir deneyim sağladığını doğrulamak önemlidir. Aşağıdakileri göz önünde bulundurun:
- Parçanız belirli bir üst etkinliğe veya parçaya bağlı olmamalıdır.
- Bir parça kullanıcı tarafından görünür olmadığı sürece parçanın görünüm hiyerarşisi oluşturmamalısınız.
AndroidX fragment-testing
kitaplığı, bu testleri gerçekleştirmek için gereken koşulların ayarlanmasına yardımcı olmak amacıyla parçalar oluşturmak ve parçaları Lifecycle.State
değiştirmek için FragmentScenario
sınıfını sağlar.
Bağımlılıkları bildirme
FragmentScenario
özelliğini kullanmak için uygulamanızın build.gradle
dosyasında debugImplementation
kullanarak fragment-testing
yapısını aşağıdaki örnekte gösterildiği gibi tanımlayın:
Modern
dependencies { def fragment_version = "1.7.0" debugImplementation "androidx.fragment:fragment-testing:$fragment_version" }
Kotlin
dependencies { val fragment_version = "1.7.0" debugImplementation("androidx.fragment:fragment-testing:$fragment_version") }
Bu sayfadaki test örneklerinde Espresso ve Truth kitaplıklarındaki onaylar kullanılmaktadır. Kullanılabilen diğer test ve onaylama kitaplıkları hakkında bilgi edinmek isterseniz AndroidX Test için proje oluşturma bölümüne bakın.
Parça oluşturma
FragmentScenario
, parçaların testlerde başlatılması için aşağıdaki yöntemleri içerir:
launchInContainer()
: Bir parçanın kullanıcı arayüzünü test etmek için kullanılır.FragmentScenario
, parçayı bir etkinliğin kök görüntüleme denetleyicisine ekler. Aksi takdirde bu içeren etkinlik boş kalır.launch()
: Parçanın kullanıcı arayüzü olmadan test etmek içindir.FragmentScenario
, bu parçayı kök görünümü olmayan boş bir etkinliğe ekler.
Bu parça türlerinden biri başlatıldıktan sonra FragmentScenario
, test edilen parçayı belirli bir duruma getirir. Varsayılan olarak bu durum RESUMED
şeklindedir ancak initialState
bağımsız değişkeniyle bunu geçersiz kılabilirsiniz. RESUMED
durumu, parçanın çalıştığını ve kullanıcı tarafından görülebildiğini belirtir. Espresso kullanıcı arayüzü testlerini kullanarak arayüz öğeleriyle ilgili bilgileri değerlendirebilirsiniz.
Aşağıdaki kod örnekleri, her bir yöntemi kullanarak parçanızı nasıl başlatacağınızı gösterir:
launchInContainer() örneği
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@Test fun testEventFragment() {
// The "fragmentArgs" argument is optional.
val fragmentArgs = bundleOf(“selectedListItem” to 0)
val scenario = launchFragmentInContainer<EventFragment>(fragmentArgs)
...
}
}
launch() örneği
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@Test fun testEventFragment() {
// The "fragmentArgs" arguments are optional.
val fragmentArgs = bundleOf("numElements" to 0)
val scenario = launchFragment<EventFragment>(fragmentArgs)
...
}
}
Bağımlılıkları belirtin
Parçalarınızda bağımlılık varsa launchInContainer()
veya launch()
yöntemlerine özel bir FragmentFactory
sağlayarak bu bağımlılıkların test sürümlerini sağlayabilirsiniz.
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@Test fun testEventFragment() {
val someDependency = TestDependency()
launchFragmentInContainer {
EventFragment(someDependency)
}
...
}
}
Parçalara bağımlılık sağlamak üzere FragmentFactory
kullanma hakkında daha fazla bilgi için Parça yöneticisi bölümüne bakın.
Parçayı yeni bir duruma getirin
Uygulamanızın kullanıcı arayüzü testlerinde genellikle parçayı test altında başlatmak ve RESUMED
durumundan test etmeye başlamak yeterlidir. Bununla birlikte, daha ayrıntılı birim testlerinde parçanın bir yaşam döngüsü durumundan diğerine geçiş yaparken sergilediği davranışı da değerlendirebilirsiniz. Başlangıç durumunu, initialState
bağımsız değişkenini launchFragment*()
işlevlerinden herhangi birine ileterek belirtebilirsiniz.
Parçayı farklı bir yaşam döngüsü durumuna yönlendirmek için moveToState()
çağrısı yapın.
Bu yöntem, şu durumları bağımsız değişken olarak destekler: CREATED
, STARTED
, RESUMED
ve DESTROYED
. Bu yöntem, parçanızı içeren parçanın veya etkinliğin herhangi bir nedenle durumunu değiştirdiği bir durumu simüle eder.
Aşağıdaki örnek, INITIALIZED
durumunda bir test parçasını başlatır ve ardından RESUMED
durumuna taşır:
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@Test fun testEventFragment() {
val scenario = launchFragmentInContainer<EventFragment>(
initialState = Lifecycle.State.INITIALIZED
)
// EventFragment has gone through onAttach(), but not onCreate().
// Verify the initial state.
scenario.moveToState(Lifecycle.State.RESUMED)
// EventFragment moves to CREATED -> STARTED -> RESUMED.
...
}
}
Parçayı yeniden oluştur
Uygulamanız kaynakları az olan bir cihazda çalışıyorsa sistem, parçanızı içeren etkinliği yok edebilir. Bu durum, kullanıcı geri döndüğünde uygulamanızın parçayı yeniden oluşturmasını gerektirir.
Bu durumu simüle etmek için recreate()
numaralı telefonu arayın:
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@Test fun testEventFragment() {
val scenario = launchFragmentInContainer<EventFragment>()
scenario.recreate()
...
}
}
FragmentScenario.recreate()
, parçayı ve ana makinesini kaldırır, ardından yeniden oluşturur. FragmentScenario
sınıfı test edilen parçayı yeniden oluşturduğunda, parça yok edilmeden önceki yaşam döngüsü durumuna döner.
Kullanıcı arayüzü parçalarıyla etkileşimde bulunma
Test edilen parçanızda kullanıcı arayüzü işlemlerini 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 testEventFragment() {
val scenario = launchFragmentInContainer<EventFragment>()
onView(withId(R.id.refresh)).perform(click())
// Assert some expected behavior
...
}
}
Parçanın kendisinde bir yöntem çağırmanız gerekiyorsa (ör. seçenekler menüsündeki bir seçime yanıt verme) FragmentScenario.onFragment()
ile parçanın referansını alıp FragmentAction
ileterek bunu güvenli bir şekilde yapabilirsiniz:
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@Test fun testEventFragment() {
val scenario = launchFragmentInContainer<EventFragment>()
scenario.onFragment { fragment ->
fragment.myInstanceMethod()
}
}
}
Test iletişim kutusu işlemleri
FragmentScenario
, iletişim parçalarının test edilmesini de destekler. İletişim parçalarının kullanıcı arayüzü öğeleri olsa da bunların düzenleri etkinliğin kendisi yerine ayrı bir pencerede doldurulur. Bu nedenle, iletişim kutusu parçalarını test etmek için FragmentScenario.launch()
kullanın.
Aşağıdaki örnekte iletişim kutusunu kapatma işlemi test edilmektedir:
@RunWith(AndroidJUnit4::class)
class MyTestSuite {
@Test fun testDismissDialogFragment() {
// Assumes that "MyDialogFragment" extends the DialogFragment class.
with(launchFragment<MyDialogFragment>()) {
onFragment { fragment ->
assertThat(fragment.dialog).isNotNull()
assertThat(fragment.requireDialog().isShowing).isTrue()
fragment.dismiss()
fragment.parentFragmentManager.executePendingTransactions()
assertThat(fragment.dialog).isNull()
}
}
// Assumes that the dialog had a button
// containing the text "Cancel".
onView(withText("Cancel")).check(doesNotExist())
}
}