Robolectric, Google tarafından yönetilen açık kaynaklı bir çerçevedir. Bu çerçeve, bir emülatörün ek yükü ve gevşekliği olmadan bir JVM içindeki simüle edilmiş Android ortamında test çalıştırmanızı sağlar. Lollipop'tan (API düzeyi 21) sonraki Android sürümlerinin tümünü destekler.
Birçok büyük projede, testlerinin hızını ve güvenilirliğini artırmak ve gerçek cihazlarda ya da emülatörlerde test yapmaktan kaynaklanan masrafları azaltmak için Robolectric'i kullanırlar. 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 testi"ni mümkün kılmanın bir yolu olarak görülürdü. Ö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 paket kullanıyorsa veya sahte bir Bluetooth bağlantısı kurmanız 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 kümesinde bulunan tüm kullanıcı arayüzü testleri Robolectric ile çalışı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. Gerekli olan doğruluk düzeyi fazlasıyla yeterli olduğundan Robolectric'te davranış testleri çalıştırabilirsiniz. Örneğin, "Compose" testi bir düğmeyi tıkladıktan sonra kullanıcı arayüzünün değiştiğini doğruladığında.
Robolectric ile ekran görüntüsü testleri gibi diğer kullanıcı arayüzü testlerini çalıştırabilirsiniz. Ancak, farklı cihazlar ekranları biraz farklı oluşturduğundan, kalite daha düşüktür.
Robolectric'in uygulamasının her kullanım durumu için yeterince iyi olup olmadığına karar vermeniz gerekir, ancak işte bazı öneriler:
- 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 dış 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üsünü yerel olarak alabilir, ancak ekran görüntüsü testi yapmak için üçüncü taraf bir kitaplığa ihtiyacınız vardır.
Robolektrik ve cihaz testleri
Ö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.