Android'de test ikililerini kullanın

Bir öğeyi veya öğe sistemini ayrı olarak test edersiniz. Örneğin, bir ViewModel'i test etmek için Android çerçevesine bağlı olmadığından (veya bağlı olmaması gerektiğinden) bir emülatör başlatmanız ve kullanıcı arayüzü açmanız gerekmez.

Ancak test edilen konu, çalışması için başkalarına bağlı olabilir. Örneğin, bir ViewModel'in çalışması için bir veri deposuna ihtiyacı olabilir.

Test edilen bir konuya bağımlılık sağlamanız gerektiğinde yaygın bir uygulama, test çifti (veya test nesnesi) oluşturmaktır. Test çiftleri, uygulamanızdaki bileşenler gibi görünen ve davranan ancak belirli bir davranış veya veri sağlamak için testinizde oluşturulan nesnelerdir. Bu araçların başlıca avantajları, testlerinizi daha hızlı ve daha basit hale getirmeleridir.

Test çifti türleri

Çeşitli test çifti türleri vardır:

Sahte Sınıfın "çalışan" bir uygulamasına sahip olan ancak testler için iyi ancak üretim için uygun olmayan bir şekilde uygulanmış test çifti.

Örnek: bellek içi veritabanı.

Sahte veriler, taklit çerçevesi gerektirmez ve hafiftir. Bunlar tercih edilir.

Dik Yaka Programladığınız şekilde davranan ve etkileşimleriyle ilgili beklentileri olan bir test çifti. Etkileşimleri tanımladığınız koşullarla eşleşmeyen sahte veriler testleri geçersiz kılar. Tüm bu hedeflere ulaşmak için genellikle taklit çerçevesi ile taklitler oluşturulur.

Örnek: Bir veritabanındaki yöntemin tam olarak bir kez çağrıldığını doğrulayın.

Stub Programladığınız şekilde davranan ancak etkileşimleriyle ilgili beklentileri olmayan bir test çifti. Genellikle bir taklit çerçevesi ile oluşturulur. Basitlik açısından, sahte öğeler, taslak öğelere tercih edilir.
Dummy İletilen ancak kullanılmayan bir test çifti (ör. yalnızca parametre olarak sağlamanız gerekiyorsa).

Örnek: Tıklama geri çağırma işlevi olarak iletilen boş bir işlev.

Casusluk Gerçek bir nesnenin üzerine yerleştirilen ve aynı zamanda mock'lara benzer şekilde bazı ek bilgileri de tutan bir sarmalayıcı. Karmaşıklık ekledikleri için genellikle bunlardan kaçınılır. Bu nedenle, casuslara kıyasla sahte veya taklit hesapların kullanılması tercih edilir.
Gölge Robolectric'te kullanılan sahte.

Sahte bir örnek

UserRepository adlı bir arayüze dayanan ve ilk kullanıcının adını kullanıcı arayüzüne gösteren bir ViewModel'i birim test etmek istediğinizi varsayalım. Arayüzü uygulayıp bilinen verileri döndürerek sahte bir test çifti oluşturabilirsiniz.

object FakeUserRepository : UserRepository {
    fun getUsers() = listOf(UserAlice, UserBob)
}

val const UserAlice = User("Alice")
val const UserBob = User("Bob")

Bu sahte UserRepository'nin, üretim sürümünün kullanacağı yerel ve uzak veri kaynaklarına bağlı olması gerekmez. Dosya, test kaynak grubunda bulunur ve üretim uygulamasıyla birlikte gönderilmez.

Sahte bağımlılık, uzak veri kaynaklarına bağlı kalmadan bilinen verileri döndürebilir
Şekil 1: Birim testinde sahte bağımlılık.

Aşağıdaki test, ViewModel'in ilk kullanıcı adını görünüme doğru şekilde gösterdiğini doğrular.

@Test
fun viewModelA_loadsUsers_showsFirstUser() {
    // Given a VM using fake data
    val viewModel = ViewModelA(FakeUserRepository) // Kicks off data load on init

    // Verify that the exposed data is correct
    assertEquals(viewModel.firstUserName, UserAlice.name)
}

ViewModel test kullanıcısı tarafından oluşturulduğundan, birim testinde UserRepository öğesini sahte bir öğeyle değiştirmek kolaydır. Ancak daha büyük testlerde rastgele öğeleri değiştirmek zor olabilir.

Bileşenleri değiştirme ve bağımlılık ekleme

Testlerin, test edilen sistemlerin oluşturulması üzerinde hiçbir kontrolü olmadığında, test çiftleri için bileşenleri değiştirmek daha karmaşık hale gelir ve uygulamanızın mimarisinin test edilebilir bir tasarımı izlemesini gerektirir.

Büyük uçtan uca testler bile test çiftleri kullanmaktan yararlanabilir. Örneğin, uygulamanızdaki kullanıcı akışında gezinen enstrümante edilmiş bir kullanıcı arayüzü testi. Bu durumda testinizi hermetik hale getirmek isteyebilirsiniz. Hermetik test, internetten veri getirme gibi tüm harici bağımlılıklardan kaçınır. Bu, güvenilirliği ve performansı artırır.

Şekil 2: Uygulamanın büyük bir kısmını kapsayan ve uzak verileri taklit eden büyük bir test.

Uygulamanızı bu esnekliği sağlayacak şekilde manuel olarak tasarlayabilirsiniz ancak uygulamanızdaki bileşenleri test sırasında değiştirmek için Hilt gibi bir bağımlılık ekleme çerçevesi kullanmanızı öneririz. Hilt test kılavuzuna bakın.

Sonraki adımlar

Test stratejileri sayfasında, farklı test türlerini kullanarak üretkenliğinizi nasıl artırabileceğiniz gösterilmektedir.