Espresso — bu nima, ishlash prinsiplari va undan qanday foydalanish

Muallif: IT Sectr Nashr etilgan: 2026-04-08 O'qish vaqti: 8 daq

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 — oqimlarni avtomatik sinxronizatsiya qiluvchi Android UI-testlash freymvorki.
  • ViewMatcher — View-elementni ekranda ID, matn, ota-ona iyerarxiyasi bo‘yicha qidirish.
  • ViewAction — element ustida amal: bosish, matn kiritish, svayp.
  • ViewAssertion — element holatini tekshirish: ko‘rinadi, matnni o‘z ichiga oladi, faol.
  • Idling Resource — UI tekshiruvidan oldin asinxron operatsiyalarni yakunlashni kutish mexanizmi.

Espresso nima?

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.

Espresso qanday ishlaydi

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.

Asosiy Espresso testi

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.

kotlin
@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()))
}

ActivityScenario qoidasi

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.

MatcherVazifasi
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

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: UI bilan o‘zaro ta‘sir

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.

Amallar zanjiri

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.

kotlin
// 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())

onData orqali tekshirish

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: holatni tekshirish

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.

Oddiy tekshirishlar

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.

Maxsus ViewAssertions

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.

kotlin
// 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())

Asinxron operatsiyalar uchun Idling Resources

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.

Koroutinlar bilan misol

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.

kotlin
// 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
    }
}

Android loyihasida Espresso-ni sozlash

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.

Gradle konfiguratsiyasi

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.

kotlin
// 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")
}

Testlarni CI da ishga tushirish

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 UI Automatordan nimasi bilan farq qiladi?

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.

Nega Espresso “uch oyoqli it” freymvorki deb ataladi?

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-ni Espresso orqali qanday testlash mumkin?

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 nima va Espresso unga qarshi qanday kurashadi?

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-ni skrinshot testlash uchun ishlatish mumkinmi?

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

  • Espresso — avtomatik sinxronizatsiyaga ega Google dan Android UI-testlash freymvorki.
  • ViewMatchers — elementlarni ID, matn, iyerarxiya va kombinatsiyalar bo‘yicha qidirish uchun API.
  • ViewActions — UI bilan o‘zaro ta‘sir uchun click, typeText, scrollTo, swipe.
  • ViewAssertions — elementlar holatini tekshirish uchun matches, doesNotExist.
  • Idling Resource — testni asinxron operatsiyalar va koroutinlar bilan sinxronlashtirish.
  • Uch bosqich — onView().perform().check() = top, bajar, tekshir.
  • AndroidX Test — emulyator yoki qurilmada instrumental testlarni ishga tushirish kutubxonalari.

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.

Loyihani muhokama qilish

Shuningdek o'qing