Parçalarınızı test etme

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.6.2"

    debugImplementation "androidx.fragment:fragment-testing:$fragment_version"
}

Kotlin

dependencies {
    val fragment_version = "1.6.2"

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