İnteqrasiya testi mobil tətbiqin komponentləri — modullar, xidmətlər, verilənlər bazaları və xarici API-lər arasında qarşılıqlı əlaqənin düzgünlüyünü yoxlayır. Hər bir komponenti təcrid edən vahid testlərdən fərqli olaraq, inteqrasiya testləri qovşaqlardakı səhvləri aşkarlayır: verilənlər formatlarının uyğunsuzluğu, parametr ötürülməsində nasazlıqlar və server cavablarının səhv işlənməsi. Martin Fowler, 2018-in məlumatlarına görə, inteqrasiya testləri vahid yoxlamalarda buraxılmış kritik qüsurların 40%-ə qədərini əhatə edir və sistemin buraxılışdan əvvəl sabitliyinə əminlik verir.
Əsas məqamlar
İnteqrasiya testi — proqram təminatının yoxlanılması mərhələsidir ki, burada tətbiqin ayrı-ayrı modulları və ya alt sistemləri arasında qarşılıqlı əlaqənin düzgünlüyü qiymətləndirilir. Vahid testlər hər bir komponenti təcrid edərkən, inteqrasiya testləri bu komponentləri birləşdirir və onların birlikdə necə işlədiyini yoxlayır. Tipik ssenarilərə şəbəkə qatı ilə repo arasında verilənlərin ötürülməsi, ORM vasitəsilə verilənlər bazasına yazma və üçüncü tərəf API-lərindən cavabların işlənməsi daxildir.
Mobil inkişaf kontekstində inteqrasiya testləri UI qatı, biznes məntiqi və verilənlər mənbələri arasındakı qarşılıqlı əlaqəni əhatə edir. Məsələn, test "Giriş" düyməsi basıldıqdan sonra tətbiqin serverə sorğu göndərib-göndərmədiyini, token alıb-almadığını və onu lokal yaddaşa saxlayıb-saxlamadığını yoxlaya bilər. Belə yoxlama komponentlər zəncirinin nasazlıqsız işlədiyini təsdiqləyir.
World Quality Report 2023 hesabatına görə, inteqrasiya testini müntəzəm tətbiq edən şirkətlər yalnız vahid testlərə güvənən layihələrlə müqayisədə istehsal hadisələrinin sayını 35% azaldır. Bu, inteqrasiya yoxlamalarını kommersiya inkişafında keyfiyyət təminatı strategiyasının məcburi elementinə çevirir.
Mobil tətbiqlər çoxlu sayda qarşılıqlı əlaqəli komponentlərdən ibarətdir: şəbəkə sorğuları, lokal verilənlər bazaları, push bildirişləri, sistem xidmətləri və üçüncü tərəf SDK-ları. Bu komponentlərin hər biri ayrıca hazırlanır, lakin iş vaxtı real vaxtda verilənlər mübadiləsi aparır. İnteqrasiya testi modulların təcrid olunmuş yoxlanılması zamanı aşkar edilə bilməyən qüsurları üzə çıxarır.
İnteqrasiya testləri tərəfindən aşkar edilən tipik problemlərə API ilə tətbiq modeli arasında verilən tiplərinin uyğunsuzluğu, JSON serializasiya səhvləri, şəbəkə vaxt aşımının səhv işlənməsi və Room və ya Core Data vasitəsilə verilənlər bazasına paralel girişdə nasazlıqlar daxildir. İnteqrasiya yoxlamaları olmadan bu qüsurlar istehsala keçir və yalnız real istifadəçilərdə özünü göstərir.
Google Testing Blog (2021) araşdırması göstərir ki, inteqrasiya testi mərhələsində aşkar edilmiş qüsurun düzəldilməsi dəyəri buraxılışdan sonrakından 5 dəfə aşağıdır. Bu, erkən mərhələlərdə tərtibatçının səhv kontekstini tam başa düşməsi və təcili hotfix dövrü olmadan onu düzəldə bilməsi ilə izah olunur. İnteqrasiya testlərinin yazılmasına vaxt sərfi dəstək xərclərinin azaldılması və istifadəçi etimadının artırılması ilə özünü doğruldur.
İnteqrasiya testlərinin təşkili üçün üç əsas yanaşma mövcuddur: Big Bang, Bottom-Up və Top-Down. Strategiya seçimi layihənin ölçüsündən, tətbiqin arxitekturasından və testlərin yazılması zamanı komponentlərin əlçatanlığından asılıdır. Hər bir yanaşmanın test əhatəsinin planlaşdırılmasında nəzərə alınmalı olan üstünlükləri və məhdudiyyətləri var.
Big Bang — sistemin bütün komponentlərinin eyni anda birləşdirildiyi və ümumi test icrasının aparıldığı yanaşmadır. Bu metod həyata keçirmək üçün sadədir: stub yazmaq və ya ayrı-ayrı modulları emulyasiya etmək tələb olunmur. Ancaq səhv aşkar edildikdə, onun hansı komponentdən qaynaqlandığını müəyyən etmək çətindir. Big Bang modulların sayı beşi keçməyən, sadə arxitekturalı kiçik layihələrdə əsaslandırılmışdır.
Bottom-Up — inteqrasiya testinin aşağı səviyyəli komponentlərdən başladığı strategiyadır: verilənlər bazası, şəbəkə qatı, sistem xidmətləri. Hər səviyyə yoxlandıqdan sonra testlər tədricən yuxarı modulları — repozitoriləri, Use Case siniflərini və ViewModel-i birləşdirir. Əsas üstünlük tətbiqin fundamental qatlarında qüsurların erkən aşkar edilməsidir ki, bu da inkişafın sonrakı mərhələlərində kaskad səhvlər riskini azaldır.
Top-Down — testin yuxarı səviyyəli komponentlərdən — UI ekranları və naviqasiyadan başladığı, aşağı səviyyəli modulların isə stub və ya mock-larla təqlid edildiyi yanaşmadır. Bu, server hissəsi və ya verilənlər bazası tam tətbiq edilməmişdən əvvəl istifadəçi ssenarilərini yoxlamağa imkan verir. Top-Down xüsusilə müştəri və server hissələrinin paralel inkişafı zamanı, backend hələ real inteqrasiyaya hazır olmadıqda faydalıdır.
Mobil tətbiqlərin inteqrasiya testi üçün üç kateqoriyaya bölünən bir sıra ixtisaslaşmış alətlərdən istifadə olunur: server emulyasiyası üçün kitabxanalar, verilənlər bazaları ilə işləmək üçün freymvorklar və sistem xidmətlərinin yoxlanılması vasitələri. Konkret alətin seçimi platformadan — Android və ya iOS — və layihənin texnologiya stack-indən asılıdır.
Android və iOS üçün inteqrasiya testlərinin praktik nümunələrini nəzərdən keçirək. Android platforması üçün MockWebServer JUnit ilə birlikdə, iOS üçün isə XCTest OHHTTPStubs kitabxanası ilə istifadə olunur. Hər iki nümunə API-dən verilənlərin alınması və onların lokal repozitoridə saxlanılması ssenarisini yoxlayır.
Bu test emulyasiya edilmiş serverə Retrofit sorğusunun düzgün JSON qaytardığını və repozitorinin cavabı domen modelinə çevirdiyini yoxlayır. MockWebServer sorğunu ələ keçirir və müəyyən edilmiş JSON-u qaytarır, bundan sonra test gözlənilən nəticəni faktiki ilə müqayisə edir.
class UserRepositoryTest {
private val mockServer = MockWebServer()
@Before
fun setup() {
mockServer.start()
}
@Test
fun fetchUser_returnsCorrectData() {
val json = "{ \`"id\`": 1, \`"name\`": \`"Alice\`" }"
mockServer.enqueue(MockResponse()
.setBody(json)
.setResponseCode(200))
val repository = UserRepository(
createRetrofit(mockServer.url("/").toString()))
val user = repository.fetchUser(1)
assertEquals(1, user.id)
assertEquals("Alice", user.name)
}
@After
fun tearDown() {
mockServer.shutdown()
}
}
iOS üçün oxşar test URL sorğularını ələ keçirmək üçün OHHTTPStubs-dan istifadə edir. Kitabxana URL Loading System sistem freymvorku səviyyəsində server cavabını əvəz edir ki, bu da istənilən şəbəkə kitabxanasını — URLSession, Alamofire və ya Moya-nı test etməyə imkan verir.
import XCTest
import OHHTTPStubs
import OHHTTPStubsSwift
class UserRepositoryTests: XCTestCase {
func testFetchUser_returnsCorrectData() {
stub(condition: isPath("/users/1")) { _ in
return HTTPStubsResponse(
jsonObject: ["id": 1, "name": "Alice"],
statusCode: 200,
headers: nil
)
}
let repository = UserRepository()
let expectation = expectation(description: "fetch user")
repository.fetchUser(id: 1) { user in
XCTAssertEqual(user.id, 1)
XCTAssertEqual(user.name, "Alice")
expectation.fulfill()
}
waitForExpectations(timeout: 2.0)
}
}
Effektiv inteqrasiya testi testlərin sabitliyini artıran və onlara dəstək xərclərini azaldan bir sıra təcrübələrə riayət etməyi tələb edir. Xarici asılılıqları təcrid edin: istehsal nümunələri əvəzinə in-memory verilənlər bazalarından istifadə edin və xarici API-ləri test stub kitabxanaları vasitəsilə emulyasiya edin. Bu, şəbəkənin əlçatanlığı və ya xarici xidmətlərin vəziyyəti səbəbindən qeyri-deterministik nasazlıqları aradan qaldırır.
Testlərin müstəqilliyini qoruyun: hər bir inteqrasiya testi digər testlərin nəticələrindən asılı olmayaraq təcrid olunmuş şəkildə işləməlidir. Test mühitinin hazırlanması və təmizlənməsi üçün JUnit-də @Before və @After annotasiyalarından və ya XCTest-də setUp və tearDown-dan istifadə edin. Bu, testlərin qarşılıqlı təsirinin qarşısını alır və səhv diaqnostikasını sadələşdirir.
Sərhəd halları əhatə edin: inteqrasiya testləri yalnız uğurlu ssenariləri (happy path) deyil, həm də xəta idarəetməsini — vaxt aşımları, HTTP 4xx və 5xx kodları, boş cavablar, zədələnmiş JSON yoxlamalıdır. Google Testing Blog (2022) məlumatlarına görə, istehsal hadisələrinin 60%-i testlərlə əhatə olunmayan sərhəd hallarının səhv idarə edilməsi ilə bağlıdır.
Tez-tez verilən suallar
Vahid testlər bir sinfi və ya funksiyanı təcrid şəraitində yoxlayır, asılılıqları stublarla əvəz edir. İnteqrasiya testləri bir neçə real komponentin — məsələn, şəbəkə əlaqəsi və verilənlər bazasının eyni vaxtda qarşılıqlı əlaqəsini yoxlayır.
İnteqrasiya testlərini işə salmaq adətən testlərin sayından və mühitin mürəkkəbliyindən asılı olaraq 2 dəqiqədən 15 dəqiqəyə qədər vaxt aparır. Böyük layihələr üçün merge-dən əvvəl ümumi yoxlama vaxtını qısaltmaq üçün testləri CI sistemində paralel job-lara bölmək tövsiyə olunur.
İlk növbədə inteqrasiya testləri şəbəkə qatı, verilənlər bazası və sistem xidmətləri — bildirişlər, kamera, geolokasiya üçün yazılır. Backend-ə API sorğuları və lokal yaddaşla əməliyyatlar ən yüksək ROI verir, çünki bu komponentlər daha tez-tez reqressiya mənbəyinə çevrilir.
Bir ekran üçün ViewModel-in vahid testləri və UI testləri kifayətdir. İnteqrasiya testləri bir ekran üçün yalnız o halda əsaslandırılır ki, ekran bir neçə verilənlər mənbəyi ilə qarşılıqlı əlaqədə olur — məsələn, iki fərqli API-dən cavabları birləşdirir və ya eyni anda şəbəkəyə və lokal bazaya verilənlər yazır.
İnteqrasiya testləri hər pull request-də CI pipeline-da və əsas buraxılışlardan əvvəl işə salınır. Həmçinin asılılıqlarda və ya test mühitində dəyişikliklərlə bağlı qüsurları aşkar etmək üçün gecə (nightly build) tam inteqrasiya testləri dəstini işə salmaq tövsiyə olunur.
Xülasə
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