Espresso Google komandası tərəfindən hazırlanmış və AndroidX Test tərkibinə daxil olan Android tətbiqlərinin avtomatlaşdırılmış UI testi üçün freymvorkdur. Təcrid olunmuş komponentləri yoxlayan instrumental testlərdən fərqli olaraq, Espresso real UI ilə qarşılıqlı əlaqə qurur: düymələri basır, mətn daxil edir, elementlərin göstərilməsini yoxlayır. Məlumatlara görə Google Android Developers, Espresso UI axını ilə avtomatik sinxronizasiyanı təmin edir, bu da əl ilə Thread.sleep() ehtiyacını aradan qaldırır.
Başlıca
Espresso Google AndroidX Test tərkibinə daxil olan Android üçün avtomatlaşdırılmış UI testləri yazmaq üçün kitabxanadır. O, ekranda View elementlərini axtarmaq, onlar üzərində hərəkətlər etmək (basma, daxil etmə, sürüşdürmə) və onların vəziyyətini yoxlamaq (göstərilir, mətn ehtiva edir, aktivdir) üçün API təmin edir.
Espresso-nun əsas xüsusiyyəti tətbiqin əsas axını ilə avtomatik sinxronizasiyadır. Freymvork növbəti yoxlamanı yerinə yetirməzdən əvvəl bütün asinxron tapşırıqların (korutinlər, AsyncTask, Handler) tamamlanmasını gözləyir. Bu, race condition ilə bağlı flaky-testləri aradan qaldırır və UI testlərini sabit və etibarlı edir — heç bir test Thread.sleep() və ya gözləmə dövrü ehtiva etmir.
Espresso Three-Legged Dog prinsipinə əməl edir — test üç addımdan ibarətdir: elementi tap (ViewMatcher), hərəkəti yerinə yetir (ViewAction), nəticəni yoxla (ViewAssertion). Hər üç addım onView().perform().check() zəncirinə yazılır. Bu konsepsiya testləri proqnozlaşdırıla bilən və asan oxunan edir — hər test nə axtardığını, nə etdiyini və nə yoxladığını açıqca təsvir edir.
Arxitektura Espresso üç komponentə əsaslanır: Espresso (giriş nöqtəsi — statik onView və onData metodları), ViewMatchers (elementlərin axtarışı), ViewActions (hərəkətlər) və ViewAssertions (yoxlamalar). Freymvork daxildə UI axını ilə sinxronizasiya üçün Idling Resource istifadə edir.
Sadə test düyməni ID ilə tapır, basma yerinə yetirir və “Hazır” mətninin göründüyünü yoxlayır. Bütün əməliyyatlar test baxımından sinxron yerinə yetirilir — Espresso test davam etməzdən əvvəl UI axınının hadisəni emal etdiyini təmin edir. Bu, daxili gözləmə mexanizmi sayəsində əldə edilir: onView UI sabit olana qədər testin icrasını bloklayır.
@Test
fun buttonClick_showsSuccessText() {
// Düyməni ID ilə tap və bas
onView(withId(R.id.button_submit))
.perform(click())
// Yoxla ki, “Hazır” mətni göstərilir
onView(withText("Hazır"))
.check(matches(isDisplayed()))
}
Espresso testini işə salmaq üçün ActivityScenario (AndroidX Test) istifadə olunur, o, Activity-ni tələb olunan vəziyyətdə yaradır — işləyir, dayandırılıb, məhv edilib. ActivityScenario təmiz UI-dan əlavə Activity həyat dövrünü test etməyə imkan verir. Məsələn, ekranın fırlanması zamanı (Activity rekreasiyası) məlumatların saxlandığını və məhv edildikdən sonra bərpa olunduğunu yoxlamaq olar.
ViewMatchers müxtəlif meyarlara görə ekranda View tapmağa imkan verən Espresso.onView sinfindən metodlar toplusudur: resurs identifikatoru (R.id), mətn, hint işarəsi, valideyn elementi və iyerarxiya. Bir matcher unikal nəticə vermirsə, matcherlər allOf() vasitəsilə birləşdirilir.
| Matcher | Təyinat |
|---|---|
| withId(R.id.name) | Resurs ID-si ilə axtarış |
| withText("mətn") | Göstərilən mətnə görə axtarış |
| withHint("işarə") | EditText hint atributuna görə axtarış |
| isDisplayed() | Elementin ekranda göründüyünü yoxlama |
| hasSibling(matcher) | Qonşu elementə görə axtarış |
| allOf(m1, m2) | Bir neçə matcherin kombinasiyası |
Ekranda bir neçə eyni element varsa (məsələn, müxtəlif mətnli iki TextView), matcherləri allOf vasitəsilə birləşdirmək rahatdır: onView(allOf(withId(R.id.title), withText("Salam"))). Bu, tək elementin seçilməsini təmin edir. Tərs operator — not() — elementləri axtarışdan çıxarır, hasSibling() isə tanın məlum elementin yanında olanı axtarır.
ViewActions Espresso-nun tapılmış View üzərində yerinə yetirdiyi hərəkətlərdir: click(), typeText(), clearText(), scrollTo(), swipeLeft() və başqaları. Hərəkətlər perform() metoduna ötürülür, o, ardıcıl bir neçə hərəkət qəbul edə bilər.
perform() metodu vararg ViewAction qəbul edir, bu, bir element üzərində ardıcıl hərəkətlər yerinə yetirməyə imkan verir: sahəni təmizlə, yeni mətn daxil et, klaviaturanı bağla və düyməni bas. Bütün hərəkətlər sadalanma ardıcıllığı ilə yerinə yetirilir və Espresso əvvəlki hərəkətin növbəti başlamazdan əvvəl tamamlandığını təmin edir.
// EditText-də mətn daxil etmə və düyməni basma
onView(withId(R.id.edit_email))
.perform(
clearText(),
typeText("user@example.com"),
closeSoftKeyboard()
)
onView(withId(R.id.button_login))
.perform(click())
AdapterView (ListView, RecyclerView) daxilindəki elementlər üçün onView əvəzinə onData() metodu istifadə olunur. O, View ilə deyil, adapter məlumatları ilə işləyir — elementi modelin məzmununa görə tapır və sonrakı hərəkətlər üçün müvafiq View qaytarır. onData elementi məlumat modelinin sahələri ilə axtarmaq üçün hamcrest matcherlərindən istifadə edir.
ViewAssertions View-in müəyyən vəziyyətdə olduğunu yoxlayır. Əsas metod — matches(matcher), elementin verilmiş matcherə uyğun olub-olmadığını yoxlayır. Əlavə olaraq Espresso doesNotExist() (element yoxdur) və selectedDescendantsMatch() (iç-içə elementlərin yoxlanılması) təklif edir.
UI testlərində ən tez-tez rast gəlinən yoxlamalar: element göstərilir (isDisplayed), element müəyyən mətn ehtiva edir (withText), element aktivdir (isEnabled), element seçilməyib (isNotChecked). Hər bir yoxlama uğursuzluq halında ətraflı istisna atır — ekrandakı View iyerarxiyasını göstərir. Bu, sazlamanı asanlaşdırır: səhv mesajında yoxlama anında ekranda hansı elementlərin olduğu görünür.
Standart yoxlamalar kifayət deyilsə, ViewAssertion interfeysi vasitəsilə öz yoxlamanızı yarada bilərsiniz. Xüsusi assertion View alır və onun vəziyyətini proqram şəkildə yoxlaya bilər — məsələn, mətnin rəngi, kənar boşluqlar və ya standart matcherlər vasitəsilə açıqlanmayan xüsusi komponentin vəziyyəti.
// Yoxlama: TextView göstərilir və mətn ehtiva edir
onView(withId(R.id.text_welcome))
.check(matches(isDisplayed()))
.check(matches(withText("Xoş gəldiniz")))
// Yoxlama: element GÖSTƊRİLMİR
onView(withId(R.id.progress_bar))
.check(doesNotExist())
Idling Resource Espresso-nun testi asinxron əməliyyatlarla sinxronlaşdırmaq mexanizmidir. Standart olaraq Espresso Handler, AsyncTask və korutinlərin (coroutinesIdlingResource vasitəsilə) tamamlanmasını gözləyir. Tətbiq ö2 əsasında işləri ö2 axınlar və ya Callback xidmətləri vasitəsilə yerinə yetirirsə, xüsusi Idling Resource qeydiyyatdan keçirmək lazımdır.
AndroidX Test 1.4.0-dan başlayaraq, Espresso korutinləri CoroutinesIdlingResource vasitəsilə dəstəkləyir. Test UI yoxlamalarını yerinə yetirməzdən əvvəl avtomatik olaraq bütün işə salınmış korutinlərin tamamlanmasını gözləyir. Daha mürəkkəb ssenarilər üçün CountingIdlingResource istifadə olunur — tapşırığın başlanğıcında artırılan və tamamlandıqda azaldılan sayıcı.
// OkHttp üçün IdlingResource qeydiyyatı
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
}
}
Qoşulma Android layihəsində Espresso modul səviyyəsində build.gradle faylına asılılıqların əlavə edilməsi ilə həyata keçirilir. Espresso AndroidX Test-in tərkibinə daxildir, buna görə Espresso nüvəsi, genişləndirmələr və JUnit inteqrasiyası üçün asılılıqları göstərmək kifayətdir. Testlər src/androidTest kataloqunda yerləşdirilir və AndroidJUnitRunner vasitəsilə fiziki cihazda və ya emulyatorda işə salınır.
Minimum asılılıq dəsti espresso-core (nüvə), espresso-contrib (RecyclerView, Drawer, Picker üçün əlavə matcherlər) və runner (AndroidX test runnerı) daxildir. Bütün testlər Android Test Orchestrator vasitəsilə emulyatorda və ya fiziki cihazda işə salınır.
// build.gradle.kts (androidTest asılılıqları)
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 testləri Google Android Test Orchestrator vasitəsilə işə salına bilər, o, hər testi ayrı prosesdə izolyasiya edir və işə salmalar arasında vəziyyəti təmizləyir. Bu, əvvəlki testlərin qalıq məlumatları ilə bağlı flaky-testləri aradan qaldırır və CI serverlərində sabitliyi artırır. Paralel işə salma üçün sharding istifadə olunur — testlərin bir neçə emulyator arasında bölgüsü.
Tez-tez verilən suallar
Espresso tətbiq prosesi daxilində işləyir və UI axını ilə avtomatik sinxronizasiyadan istifadə edir. UI Automator sistem səviyyəsində işləyir, digər tətbiqlərlə qarşılıqlı əlaqə qura bilər, lakin əl ilə gözləmə idarəçiliyi tələb edir.
Bu Google təqdimatından bir metaforadır: Espresso testi üç dayaq üzərində dayanır — ViewMatcher (axtarış), ViewAction (hərəkət) və ViewAssertion (yoxlama). Onlardan hər hansı biri çıxarılarsa, test üç ayaqlı it kimi sabitliyini itirir.
RecyclerView üçün espresso-contrib kitabxanası və onView(withId(R.id.recycler)).perform(actionOnItemAtPosition(0, click())) metodları istifadə olunur. Alternativ AdapterView üçün onData() və ya RecyclerView daxilində mətnə görə element axtarmaq üçün xüsusi ViewAction-dır. Əlavə olaraq, elementə sürüşdürmə və hərəkətlər üçün espresso-contrib-dən RecyclerViewActions istifadə edilə bilər.
Flaky-test — kod dəyişmədən bəzən uğursuz olan test, race condition və ya asinxronluq səbəbindən. Espresso bu problemi Idling Resource vasitəsilə həll edir — yoxlamanı yerinə yetirməzdən əvvəl bütün fon tapşırıqlarının tamamlanmasını gözləyir.
Espresso-nun özü ekran görüntüsü testləri üçün nəzərdə tutulmayıb, lakin onu Shot və ya Paparazzi kimi kitabxanalarla birləşdirmək olar. Espresso UI-nı tələb olunan vəziyyətə hazırlayır, müqayisə kitabxanası isə ekran görüntüsü çəkir və etalonla müqayisə edir. Bu yanaşma vizual reqressiya testi adlanır və interfeysdə gözlənilən dəyişiklikləri tapmağa kömək edir.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun