Parçalarınızı test etme

Bu konuda, çerçeve tarafından sağlanan API'lerin testlere nasıl dahil edileceği açıklanmaktadır izleme ve kontrol etme işlevleridir.

Parçalar uygulamanızda yeniden kullanılabilir kapsayıcılar görevi görür. Böylece çeşitli etkinliklerde aynı kullanıcı arayüzü düzenini sunmak düzen yapılandırmaları. Parçaların çok yönlülüğü hesaba katıldığında, tutarlı ve kaynakları verimli bir deneyim sunduğunu doğrulamak için gereklidir. Aşağıdakileri göz önünde bulundurun:

  • Parçanız belirli bir üst etkinliğe bağlı olmamalıdır veya olabilir.
  • Bir parçanın görünüm hiyerarşisini, kullanıcı tarafından görülebilir.

AndroidX, bu testlerin gerçekleştirilmesine ilişkin koşulların ayarlanmasına yardımcı olması için fragment-testing kitaplığında şunlar sağlanır: FragmentScenario parçalar oluşturmak ve bunları değiştirmek için Lifecycle.State.

Bağımlılıkları bildirme

FragmentScenario kullanmak için fragment-testing-manifest uygulamasının build.gradle dosyasını debugImplementation ve fragment-testing yapısını aşağıda gösterildiği gibi androidTestImplementation kullanarak şu örneği inceleyin:

dependencies {
   
def fragment_version = "1.8.3"

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

    androidTestImplementation
"androidx.fragment:fragment-testing:$fragment_version"
}
dependencies {
   
val fragment_version = "1.8.3"

    debugImplementation
("androidx.fragment:fragment-testing-manifest:$fragment_version")

    androidTestImplementation
("androidx.fragment:fragment-testing:$fragment_version")
}
.

Bu sayfadaki test örnekleri, Espresso ve Truth kitaplıkları. Daha fazla bilgi için kullanabileceğiniz diğer test ve onay kitaplıklarına göz atın AndroidX Test için proje oluşturun.

Parça oluşturma

FragmentScenario, parçaları başlatmak için aşağıdaki yöntemleri içerir testlerde:

  • launchInContainer() bir parçanın kullanıcı arayüzünü test etmek için kullanılır. FragmentScenario, parçasını bir etkinliğin kök görünüm denetleyicisine bırakır. Bu içeren etkinlik boş olur.
  • launch() parçanın kullanıcı arayüzü olmadan test etmek için kullanılır. FragmentScenario. bu parçayı, şunu yapmayan bir boş etkinliğe ekler: kök görünümüne sahip olmalıdır.

Bu parça türlerinden birini başlattıktan sonra, FragmentScenario parçasını belirtilen duruma getirin. Bu eyalet varsayılan olarak RESUMED şeklindedir. ancak bunu initialState bağımsız değişkeniyle geçersiz kılabilirsiniz. RESUMED durumu parçanın çalıştığını ve kullanıcı tarafından görülebildiğini belirtir. Hedeflerinize ulaşmanız için Espresso kullanıcı arayüzünü kullanarak kullanıcı arayüzü öğeleri hakkında bilgi testlerinde bulabilirsiniz.

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ı belirtme

Parçalarınızın bağımlılıkları varsa bunların test sürümlerini sağlayabilirsiniz: Bu bağımlılıkları, Search Ads 360'a özel bir FragmentFactory sağlayarak launchInContainer() veya launch() yöntemleri.

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEventFragment() {
        val someDependency = TestDependency()
        launchFragmentInContainer {
            EventFragment(someDependency)
        }
        ...
    }
}

Aşağıdaki verileri sağlamak için FragmentFactory kullanma hakkında daha fazla bilgi için: bağımlılıklarını görmek için Parça yöneticisi.

Parçayı yeni bir duruma sürün

Uygulamanızın kullanıcı arayüzü testlerinde genellikle parçanın başlatılması yeterlidir. test edildi ve RESUMED durumundan test etmeye başlayın. Daha ayrıntılı birim testlerini, parçanın davranışını da değerlendirerek bir yaşam döngüsü durumundan diğerine geçer. Her bir URL'yi belirtmek için initialState bağımsız değişkenini launchFragment*() işlev.

Parçayı farklı bir yaşam döngüsü durumuna getirmek için şunu çağırın: moveToState(). Bu yöntem, bağımsız değişken olarak şu durumları destekler: CREATED, STARTED, RESUMED ve DESTROYED. Bu yöntemde bir durumu simüle eder parçanızı içeren parçanın veya etkinliğin herhangi bir nedenle duruma neden olabilir.

Aşağıdaki örnek, INITIALIZED durumunda bir test parçasını başlatır ve ardından öğeyi 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 için uygulamanızın, kullanıcı geri döndüğünde parçayı yeniden oluşturması gerekir. Bu durumu simüle etmek için recreate() çağırı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şturur. tekrar yıkılmadan önce bulunduğu yaşam döngüsü durumuna döner.

Kullanıcı arayüzü parçalarıyla etkileşim

Test altındaki parçanızda kullanıcı arayüzü işlemlerini tetiklemek için şunu kullanın: Espresso görünümü eşleştiriciler görünümünüzdeki öğelerle etkileşim kurmak için:

@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 gerekirse (örneğin, bunu bir onay anahtarı yardımıyla güvenli bir şekilde yapabilirsiniz. kullanarak parçaya atıfta bulunma FragmentScenario.onFragment() ve genel hatlarıyla FragmentAction:

@RunWith(AndroidJUnit4::class)
class MyTestSuite {
    @Test fun testEventFragment() {
        val scenario = launchFragmentInContainer<EventFragment>()
        scenario.onFragment { fragment ->
            fragment.myInstanceMethod()
        }
    }
}

İletişim kutusu işlemlerini test etme

FragmentScenario, testleri de destekler iletişim kutusu parçalarını kullanın. İletişim kutusu kullanıcı arayüzü öğeleri içeriyorsa, düzen yerine ayrı bir pencerede daha çok işlem bulunur. Bu nedenle, İletişim parçalarını test etmek için FragmentScenario.launch() tuşlarına basın.

Aşağıdaki örnekte iletişim kutusu 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())
    }
}