Espresso — bu Google jamoasi tomonidan ishlab chiqilgan va AndroidX Test tarkibiga kiruvchi Android ilovalarini avtomatlashtirilgan UI-testlash uchun freymvorkdir. Izolyatsiya qilingan komponentlarni tekshiradigan instrumental testlardan farqli o‘laroq, Espresso haqiqiy UI bilan o‘zaro ta‘sir qiladi: tugmalarni bosadi, matn kiritadi, elementlarni ko‘rsatishni tekshiradi. Google Android Developers ma’lumotlariga ko‘ra, Espresso UI oqimi bilan avtomatik sinxronizatsiyani ta’minlaydi, bu qo‘lda Thread.sleep() ga bo‘lgan ehtiyojni bartaraf etadi.
Asosiy ma’lumotlar
Espresso — bu Android uchun avtomatlashtirilgan UI testlarini yozish kutubxonasi bo‘lib, Google AndroidX Test tarkibiga kiradi. U ekrandagi View-elementlarini qidirish, ular ustida amallarni bajarish (bosish, kiritish, svayp) va ularning holatini tekshirish (ko‘rinadi, matnni o‘z ichiga oladi, faol) uchun API-larni taqdim etadi.
Espresso-ning asosiy xususiyati — ilovaning asosiy oqimi bilan avtomatik sinxronizatsiya. Freymvork keyingi tekshiruvni bajarishdan oldin barcha asinxron vazifalar (koroutinlar, AsyncTask, Handler) tugashini kutadi. Bu race condition bilan bog‘liq beqaror testlarni bartaraf etadi va UI testlarini barqaror va ishonchli qiladi — hech bir test Thread.sleep() yoki kutish sikllarini o‘z ichiga olmaydi.
Espresso Three-Legged Dog tamoyiliga amal qiladi — test uch bosqichdan iborat: elementni topish (ViewMatcher), amalni bajarish (ViewAction), natijani tekshirish (ViewAssertion). Uchala bosqich onView().perform().check() chaqiruvlari zanjirida yoziladi. Bu kontseptsiya testlarni bashorat qilish mumkin va oson o‘qiladigan qiladi — har bir test nimani qidirayotganini, nima qilayotganini va nimani tekshirayotganini aniq tasvirlaydi.
Arxitektura Espresso uch komponentga asoslangan: Espresso (kirish nuqtasi — onView va onData statik metodlari), ViewMatchers (elementlarni qidirish), ViewActions (amallar) va ViewAssertions (tekshirishlar). Ichki freymvork UI oqimi bilan sinxronizatsiya uchun Idling Resource-dan foydalanadi.
Eng sodda test ID bo‘yicha tugmani topadi, bosishni bajaradi va “Tayyor” matni paydo bo‘lganligini tekshiradi. Barcha operatsiyalar test nuqtai nazaridan sinxron bajariladi — Espresso test davom etishidan oldin UI oqimi hodisani qayta ishlashni tugatganligini kafolatlaydi. Bunga o‘rnatilgan kutish mexanizmi orqali erishiladi: onView UI barqaror bo‘lmaguncha test bajarilishini bloklaydi.
@Test
fun buttonClick_showsSuccessText() {
// Tugmani ID bo‘yicha topish va bosish
onView(withId(R.id.button_submit))
.perform(click())
// Matn “Tayyor” ekanligini tekshirish
onView(withText("Tayyor"))
.check(matches(isDisplayed()))
}
Espresso testini ishga tushirish uchun ActivityScenario (AndroidX Test) ishlatiladi, u Activity-ni kerakli holatda yaratadi — ishga tushirilgan, to‘xtatilgan, yo‘q qilingan. ActivityScenario sof UI-dan tashqari Activity hayotiy siklini testlash imkonini beradi. Masalan, ma’lumotlar ekran aylantirilganda (Activity-ni qayta yaratish) saqlanishi va yo‘q qilingandan keyin tiklanishini tekshirish mumkin.
ViewMatchers — bu Espresso.onView sinfining metodlari to‘plami bo‘lib, ular ekranda View-ni turli mezonlar bo‘yicha topishga imkon beradi: resurs identifikatori (R.id), matn, hint-ko‘rsatma, ota-ona elementi va iyerarxiya. Agar bitta matcher yagona natija bermasa, matcherlar allOf() orqali birlashtiriladi.
| Matcher | Vazifasi |
|---|---|
| withId(R.id.name) | Resurs ID si bo‘yicha qidirish |
| withText(“matn”) | Ko‘rsatilgan matn bo‘yicha qidirish |
| withHint(“ko‘rsatma”) | EditText hint atributi bo‘yicha qidirish |
| isDisplayed() | Element ekranda ko‘rinishini tekshirish |
| hasSibling(matcher) | Qo‘shni element bo‘yicha qidirish |
| allOf(m1, m2) | Bir nechta matcherlarni birlashtirish |
Agar ekranda bir nechta o‘xshash elementlar bo‘lsa (masalan, turli matnli ikkita TextView), matcherlarni allOf orqali birlashtirish qulay: onView(allOf(withId(R.id.title), withText(“Salom”))). Bu yagona elementni tanlashni kafolatlaydi. Teskari operator — not() — elementlarni qidiruvdan chiqarib tashlaydi, hasSibling() esa ma’lum element yonidagi elementni qidiradi.
ViewActions — bu Espresso topilgan View ustida bajaradigan amallar: click(), typeText(), clearText(), scrollTo(), swipeLeft() va boshqalar. Amallar perform() metodiga uzatiladi, u bir nechta amallarni ketma-ket qabul qilishi mumkin.
perform() metodi vararg ViewAction-ni qabul qiladi, bu bitta element ustida amallar ketma-ketligini bajarishga imkon beradi: maydonni tozalash, yangi matn kiritish, klaviaturadan yopish va tugmani bosish. Barcha amallar ularning sanab o‘tilish tartibida bajariladi va Espresso oldingi amal keyingisi boshlanishidan oldin tugaganligini kafolatlaydi.
// EditText ga matn kiritish va tugmani bosish
onView(withId(R.id.edit_email))
.perform(
clearText(),
typeText("user@example.com"),
closeSoftKeyboard()
)
onView(withId(R.id.button_login))
.perform(click())
AdapterView (ListView, RecyclerView) ichidagi elementlar uchun onView o‘rniga onData() metodi ishlatiladi. U View bilan emas, balki adapter ma’lumotlari bilan ishlaydi — elementni model mazmuni bo‘yicha topadi va keyingi amallar uchun tegishli View-ni qaytaradi. onData ma’lumot modeli maydonlari bo‘yicha elementni qidirish uchun hamcrest-matcherlardan foydalanadi.
ViewAssertions View ning ma’lum holatda ekanligini tekshiradi. Asosiy metod — matches(matcher) — element berilgan matcherga mos kelishini tekshiradi. Qo‘shimcha, Espresso doesNotExist() (element mavjud emas) va selectedDescendantsMatch() (ichki elementlarni tekshirish) ni taklif qiladi.
UI testlaridagi eng keng tarqalgan tekshirishlar: element ko‘rinadi (isDisplayed), element ma’lum matnni o‘z ichiga oladi (withText), element faol (isEnabled), element tanlanmagan (isNotChecked). Har bir tekshirish muvaffaqiyatsizlik holatida batafsil istisno tashlaydi — ekrandagi View iyerarxiyasini ko‘rsatish bilan. Bu xatolarni tuzatishni soddalashtiradi: xato xabarida tekshirish vaqtida ekranda qanday elementlar bo‘lgani ko‘rinadi.
Agar standart tekshirishlar yetarli bo‘lmasa, ViewAssertion interfeysi orqali o‘z tekshirishingizni yaratishingiz mumkin. Maxsus assertion View-ni oladi va uning holatini dasturiy tekshirishi mumkin — masalan, matn rangi, chekinishlar yoki standart matcherlar orqali ochilmagan maxsus komponent holati.
// Tekshirish: TextView ko‘rinadi va matnni o‘z ichiga oladi
onView(withId(R.id.text_welcome))
.check(matches(isDisplayed()))
.check(matches(withText("Xush kelibsiz")))
// Tekshirish: element ko‘rinmaydi
onView(withId(R.id.progress_bar))
.check(doesNotExist())
Idling Resource — bu Espresso-ning testni asinxron operatsiyalar bilan sinxronlashtirish mexanizmi. Odatiy bo‘yicha, Espresso Handler, AsyncTask va koroutinlarning (“coroutinesIdlingResource” orqali) tugashini kutadi. Agar ilova o‘z oqimlari yoki Callback xizmatlari orqali fon ishlarini bajarayotgan bo‘lsa, maxsus Idling Resource-ni ro‘yxatdan o‘tkazish kerak.
AndroidX Test 1.4.0 dan boshlab, Espresso CoroutinesIdlingResource orqali koroutinlarni qo‘llab-quvvatlaydi. Test UI tekshiruvlarini bajarishdan oldin barcha ishga tushirilgan koroutinlarning tugashini avtomatik kutadi. Murakkab stsenariylar uchun CountingIdlingResource ishlatiladi — vazifa boshlanganda oshadigan va tugaganda kamayadigan hisoblagich.
// OkHttp uchun IdlingResource ni ro‘yxatdan o‘tkazish
class OkHttpIdlingResource(
private val client: OkHttpClient
) : IdlingResource {
private var isIdle = true
private var watcher: IdlingResource.ResourceCallback? = null
override fun getName() = "OkHttp"
override fun isIdleNow() = isIdle
override fun registerIdleTransitionCallback(
callback: IdlingResource.ResourceCallback
) {
watcher = callback
}
}
Ulash Espresso-ni Android loyihasiga modul darajasidagi build.gradle ga bog‘liqliklarni qo‘shish orqali amalga oshiriladi. Espresso AndroidX Test tarkibiga kiradi, shuning uchun Espresso yadrosi, kengaytmalari va JUnit integratsiyasi uchun bog‘liqliklarni ko‘rsatish kifoya. Testlar src/androidTest katalogiga joylashtiriladi va AndroidJUnitRunner orqali fizik qurilma yoki emulyatorda ishga tushiriladi.
Minimal bog‘liqliklar to‘plami espresso-core (yadro), espresso-contrib (RecyclerView, Drawer, Picker uchun qo‘shimcha matcherlar) va runner (AndroidX test runneri) ni o‘z ichiga oladi. Barcha testlar Android Test Orchestrator orqali emulyator yoki fizik qurilmada ishga tushiriladi.
// build.gradle.kts (androidTest dependencies)
android {
defaultConfig {
testInstrumentationRunner =
"androidx.test.runner.AndroidJUnitRunner"
}
}
dependencies {
androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1")
androidTestImplementation("androidx.test.espresso:espresso-contrib:3.6.1")
androidTestImplementation("androidx.test:runner:1.6.1")
androidTestImplementation("androidx.test:rules:1.6.1")
}
Espresso testlarini Google Android Test Orchestrator orqali ishga tushirish mumkin, u har bir testni alohida jarayonda izolyatsiya qiladi va ishga tushirishlar orasida holatni tozalaydi. Bu oldingi testlarning qoldiq ma’lumotlari bilan bog‘liq beqaror testlarni bartaraf etadi va CI serverlarida barqarorlikni oshiradi. Parallel ishga tushirish uchun sharding ishlatiladi — testlarni bir nechta emulyatorlar o‘rtasida taqsimlash.
Ko‘p beriladigan savollar
Espresso ilova jarayoni ichida ishlaydi va UI oqimi bilan avtomatik sinxronizatsiyadan foydalanadi. UI Automator tizim darajasida ishlaydi, boshqa ilovalar bilan o‘zaro ta‘sir qila oladi, lekin qo‘lda kutishni boshqarishni talab qiladi.
Bu Google taqdimotidan olingan metafora: Espresso testi uch tayanchga tayanadi — ViewMatcher (qidirish), ViewAction(amal) va ViewAssertion(tekshirish). Agar ulardan birortasi olib tashlansa, test uch oyoqli it kabi barqarorlikni yo‘qotadi.
RecyclerView uchun espresso-contrib kutubxonasi va onView(withId(R.id.recycler)).perform(actionOnItemAtPosition(0, click())) metodlari ishlatiladi. Alternativa — AdapterView uchun onData() yoki RecyclerView ichidagi matn bo‘yicha elementni qidirish uchun maxsus ViewAction. Qo‘shimcha, elementga skroll qilish va unda amallar bajarish uchun espresso-contrib dan RecyclerViewActions ishlatilishi mumkin.
Flaky-test — bu kod o‘zgarishisiz, race condition yoki asinxronlik tufayli ba’zan ishlamay qoladigan test. Espresso bu muammoni Idling Resource orqali hal qiladi — tekshiruvni bajarishdan oldin barcha fon vazifalarining tugashini kutish.
Espresso-ning o‘zi skrinshot testlari uchun mo‘ljallanmagan, lekin uni Shot yoki Paparazzi kabi kutubxonalar bilan birlashtirish mumkin. Espresso UI-ni kerakli holatga tayyorlaydi, taqqoslash kutubxonasi esa skrinshot oladi va uni etalon bilan solishtiradi. Bunday yondashuv vizual regressiya testi deb ataladi va interfeysdagi kutilmagan o‘zgarishlarni topishga yordam beradi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.