Robolectric, Google tarafından yönetilen açık kaynak bir çerçevedir. Bir emülatörün ek yükünü ve kararsızlığını yaşamadan, JVM içinde simüle edilmiş bir Android ortamında test çalıştırmanıza olanak tanır. Lollipop'tan (API düzeyi 21) beri Android'in tüm sürümlerini destekler.
Birçok büyük proje, testlerinin hızını ve güvenilirliğini artırmak ve gerçek cihazlarda veya emülatörlerde test çalıştırmakla ilişkili maliyetleri azaltmak için Robolectric'i kullanır. Buna, Robolectric'e büyük ölçüde dayanan çoğu Google uygulaması dahildir.
Robolectric, tüm özellikleri ve API'leri desteklemediği için emülatörlerin tam bir yerine geçmez. Örneğin, Robolectric'te emülatör gibi bir ekran yoktur ve bazı API'ler yalnızca kısmen desteklenir. Ancak birim testlerini ve çoğu kullanıcı arayüzü testini güvenilir bir şekilde çalıştırmak için Android'in yeterli bölümünü taklit eder.
Test stratejileri
Robolectric ile kullanabileceğiniz iki tür test stratejisi vardır: birim testi ve kullanıcı arayüzü testi.
Birim testi
Robolectric, Android uygulamalarında "birim testini" etkinleştirmenin bir yolu olarak tasarlanmıştır. Örneğin, bir etkinliğin başlatılmasını simüle edebilir ve tüm yaşam döngüsü yöntemlerini çağırarak içindeki mantığı test edebilirsiniz.
Birim testleri için Robolectric'in sahte öğelerini (gölgeler) de kullanabilirsiniz. Örneğin, sınıfınız bir paket kullanıyorsa veya Bluetooth bağlantısı taklit etmeniz gerekiyorsa.
Genel olarak, test edilebilir bir mimari uygularsanız kodunuz Android çerçevesine bağımlı olmadan tek başına test edilebilir olduğundan birim testi için Robolectric'i kullanmanız gerekmez.
Kullanıcı arayüzü testi
Robolectric, Espresso veya Compose testleri gibi kullanıcı arayüzü testleri de çalıştırabilir. Enstrümante edilmiş bir testi test
kaynak grubuna taşıyarak ve Robolectric bağımlılıkları ayarlayarak Robolectric'e dönüştürebilirsiniz.
android {
testOptions {
unitTests {
isIncludeAndroidResources = true
}
}
}
dependencies {
testImplementation("junit:junit:4.13.2")
testImplementation("org.robolectric:robolectric:4.13")
}
test
kaynak grubunda bulunan tüm kullanıcı arayüzü testleri Robolectric ile çalıştırılır.
import androidx.test.espresso.Espresso.onView
@RunWith(AndroidJUnit4::class)
class AddContactActivityTest {
@Test
fun inputTextShouldBeRetainedAfterActivityRecreation() {
// GIVEN
val contactName = "Test User"
val scenario = ActivityScenario.launchActivity<AddContactActivity>()
// WHEN
// Enter contact name
onView(withId(R.id.contact_name_text))
.perform(typeText(contactName))
// Destroy and recreate Activity
scenario.recreate()
// THEN
// Check contact name was preserved.
onView(withId(R.id.contact_name_text))
.check(matches(withText(contactName)))
}
}
Çoğu kullanıcı arayüzü testi, çerçeveyle etkileşime girmez ve bunları Robolectric'te çalıştırabilirsiniz. Robolectric'te davranış testleri çalıştırabilirsiniz. Bunun için gereken doğruluk fazlasıyla yeterlidir. Örneğin, bir Oluşturma testi, bir düğme tıklandıktan sonra kullanıcı arayüzünün değiştiğini doğrular.
Robolectric ile ekran görüntüsü testleri gibi başka kullanıcı arayüzü testleri de çalıştırabilirsiniz. Ancak farklı cihazlar ekranları biraz farklı şekilde oluşturduklarından doğruluk oranı daha düşüktür.
Robolectric'in uygulamasının her kullanım alanı için yeterli olup olmadığına karar vermeniz gerekir. Bununla birlikte, aşağıdaki önerileri göz önünde bulundurabilirsiniz:
- Bileşen, özellik veya uygulama testleri için izole kullanıcı arayüzü davranışı testleri için Robolectric'i kullanın. Genel olarak bu testler kullanıcı arayüzlerinin durum yönetimini ve davranışını kontrol eder ve harici bağımlılıklarla etkileşime girmez.
- Piksel doğruluğu kritik olmadığında ekran görüntüsü almak için Robolectric'i kullanın. Örneğin, bir bileşenin farklı yazı tipi boyutlarına veya temalara nasıl tepki verdiğini test etmek için.
Not: Robolectric, ekran görüntülerini yerel olarak alabilir ancak ekran görüntüsü testi yapmak için üçüncü taraf kitaplığına ihtiyacınız vardır.
Robolectric ve cihaz testleri karşılaştırması
Özet olarak, Robolectric çoğu kullanıcı arayüzü testini çalıştırmak için yeterli doğruluk sağlar ancak bazı durumlarda cihaz testleri yine de gereklidir. Örneğin, kenardan kenara veya pencere içinde pencere gibi sistem kullanıcı arayüzüyle ilgili testler veya WebView
gibi desteklenmeyen özelliklere ihtiyaç duyulduğunda cihaz testleri gereklidir.