Detox — Wix komandası tərəfindən xüsusi olaraq React Native layihələri üçün yaradılmış mobil tətbiqlərin gray-box E2E-testi üçün freymvorkdur. Black-box yanaşmalarından fərqli olaraq, Detox tətbiqin daxili vəziyyətinə çıxış əldə edir ki, bu da əl ilə timeautlar olmadan avtomatik sinxronizasiyaya imkan verir. Wix Engineering, 2026 məlumatlarına görə, avtomatik sinxronizasiya testlərin icra müddətini ənənəvi fasilələrlə müqayisədə 40% azaldır.
Əsas məqamlar
Detox — 2017-ci ildə Wix şirkəti tərəfindən hazırlanmış mobil tətbiqlərin kompleks (E2E) testi üçün freymvorkdur. React Native layihələri üçün nəzərdə tutulub, lakin iOS və Android-də tam nativ tətbiqləri də dəstəkləyir. Detox gray-box modeli ilə işləyir, yəni tətbiqin daxili mexanizmlərinə çıxışı var.
Detox-un Appium və ya Calabash-dan əsas fərqi tətbiqlə avtomatik sinxronizasiyadır. Freymvork növbəti hərəkəti yerinə yetirməzdən əvvəl animasiyaların, şəbəkə sorğularının və hadisələrin işlənməsinin tamamlanmasını gözləyir. Bu, testləri ləngidən Thread.sleep() və ya waitForElement ehtiyacını tamamilə aradan qaldırır.
Detox iOS (XCTest və Xcode vasitəsilə) və Android (Espresso və UI Automator vasitəsilə) platformalarını dəstəkləyir. React Native tətbiqləri üçün Fabric və köhnə arxitektura üçün tam dəstək təmin edilir. iOS-da testlər simulyatorda, Android-də isə emulyatorda və ya real cihazda işə salınır.
Detox arxitekturası üç əsas komponentdən ibarətdir: Detox CLI, Detox test-ranneri və Detox Native Driver. Detox CLI tətbiqin qurulması, quraşdırılması və testlərin işə salınmasını idarə edir. Test-ranner (Jest və ya Mocha) test ssenarilərini icra edir və WebSocket vasitəsilə tətbiqlə əlaqə saxlayır.
Gray-box testi o deməkdir ki, Detox nativ körpü vasitəsilə tətbiqin daxili vəziyyətinə çıxış əldə edir. Freymvork şəbəkə sorğularını, animasiyaları, taymerləri və əməliyyat növbəsini izləyir. Bütün növbələr boş olduqda — Detox tətbiqi növbəti addıma hazır hesab edir.
Sinxronizasiya tətbiqin əsas axınının (main thread) izlənməsinə əsaslanır. Detox bütün animasiyaların tamamlanmasını, HTTP sorğularının cavab qaytarmasını və hadisə emalçılarının icrasını gözləyir. Test sonsuz animasiya səbəbindən donarsa — konkret kod bloku üçün sinxronizasiyanı məcburi şəkildə söndürmək olar.
// Problemli sahə üçün sinxronizasiyanın söndürülməsi
await device.disableSynchronization();
// Uzun animasiyalı hərəkət
await element(by.id('loader')).swipe('down');
await device.enableSynchronization();
Detox-un quraşdırılması npm və ya yarn vasitəsilə paketin əlavə edilməsi ilə başlayır. Quraşdırmadan sonra hər bir platforma üçün qurma və işə salma parametrlərini təsvir edən .detoxrc.js konfiqurasiya faylı yaradılmalıdır. Detox iOS üçün Xcode konfiqurasiyasına əsaslanan öz qurma tipindən istifadə edir.
Konfiqurasiya tətbiqə gedən yolu (app), qurucu tipini (build), qurma arqumentlərini və cihaz parametrlərini (device) əhatə edir. iOS üçün appleSimulator, Android üçün androidEmulator istifadə olunur. Həmçinin simulyatorun dili və ya regionu kimi işə salma arqumentləri də göstərilə bilər.
// .detoxrc.js — konfiqurasiya nümunəsi
module.exports = {
testRunner: { args: { '$0': 'jest', config: 'e2e/config.json' } },
apps: {
'ios.debug': { type: 'ios.app', build: 'xcodebuild ...' },
'android.debug': { type: 'android.apk', build: 'cd android && ./gradlew ...' }
},
devices: {
simulator: { type: 'ios.simulator', device: { type: 'iPhone 15' } },
emulator: { type: 'android.emulator', device: { avdName: 'Pixel_4_API_34' } }
}
};
Konfiqurasiyadan sonra əmrlər mövcuddur: detox build — test flaqları ilə tətbiqin qurulması və detox test — testlərin işə salınması. Detox --workers flaqı vasitəsilə bir neçə cihazda paralel işə salmanı dəstəkləyir.
Detox testləri JavaScript və ya TypeScript dilində element axtarışı (matchers) və hərəkətlərə (actions) əsaslanan API-dən istifadə edərək yazılır. Matchers elementi identifikator, mətn, tip və ya ekrandakı mövqeyə görə tapmağa imkan verir. Actions toxunma, mətn daxiletmə, sürüşdürmə və kaydırma əməliyyatlarını yerinə yetirir.
Tipik test aşağıdakı ardıcıllıq kimi görünür: elementi tap → hərəkəti yerinə yetir → nəticəni yoxla. Yoxlamaq üçün elementin mövcudluğu, görünməsi və ya mətni üzrə matchers ilə expect-API istifadə olunur. Detox Jest ilə inteqrasiya vasitəsilə describe/it sintaksisini dəstəkləyir.
describe('Login flow', () => {
beforeEach(async () => {
await device.reloadReactNative();
});
it('should log in with valid credentials', async () => {
await element(by.id('emailInput')).typeText('user@test.com');
await element(by.id('passwordInput')).typeText('password123');
await element(by.id('loginButton')).tap();
await expect(element(by.id('homeScreen'))).toBeVisible();
});
});
Detox bütün populyar gestləri dəstəkləyir: tap, longPress, swipe, scroll, pinch, multiTap. Scroll üçün istiqamət, sürət və dayanma mövqeyi göstərilə bilər. Bu, pull-to-refresh və ya karusellər kimi mürəkkəb ssenariləri test etməyə imkan verir.
Detox məşhur CI sistemləri ilə yaxşı inteqrasiya olunur: GitHub Actions, CircleCI, Bitrise və Jenkins. CI-də işə salmaq üçün virtual simulyator iOS (GUI-siz) və aparat sürətləndirilməsi ilə Android emulyatoru konfiqurasiya edilməlidir. Detox uğursuz testlərin təhlili üçün artefaktlar — ekran görüntüləri və loglar təqdim edir.
CI-da testlərin icrasını sürətləndirmək üçün --workers flaqı ilə şardinqdən (paralelləşdirmə) istifadə etmək tövsiyə olunur. Detox test fayllarını avtomatik olaraq bir neçə simulyator arasında bölüşdürür. Quraşdırma müddətini qısaltmaq üçün tətbiq buildlərinin işə salmalar arasında keşləşdirilməsi də faydalıdır.
# GitHub Actions — Detox-un iOS-da işə salınması
- name: Install Dependencies
run: npm ci
- name: Build Detox App
run: npx detox build --configuration ios.sim
- name: Run Detox Tests
run: npx detox test --configuration ios.sim --workers 2
timeout-minutes: 30
Sabit və sürətli E2E-testlər üçün bir neçə qaydaya riayət etmək tövsiyə olunur. sleep()-dən qaçın — Detox avtomatik sinxronizasiya təmin edir və açıq gecikmələr testləri yalnız ləngidir və qeyri-sabit edir. Test timing səbəbindən uğursuz olarsa, əvvəlcə sinxronizasiyanın söndürülmədiyini yoxlayın. Həmçinin testləri funksiyalara görə qruplaşdırmaq və onları müstəqil işə salmaq faydalıdır — bu, uğursuzluq səbəbinin tapılmasını asanlaşdırır.
Detox vəziyyəti idarə etmək üçün bir neçə device metodu təqdim edir: device.reloadReactNative() bendlı yenidən yükləyir, device.launchNewApp() tətbiqi yeni parametrlərlə işə salır, device.sendToHome() tətbiqi minimuma endirir. device.setURLBlacklist() müəyyən URL-ləri sinxronizasiyadan çıxarmağa imkan verir ki, bu da analitika və long-polling birləşmələri üçün faydalıdır.
Hər bir test üçün izolə edilmiş vəziyyət yaratmaq tövsiyə olunur. Tətbiqi device.reloadReactNative() vasitəsilə yenidən yükləmək üçün beforeEach istifadə edin. Xüsusi məlumat tələb edən testlər üçün serverdə məlumat hazırlamaq üçün fabriklər və ya API müştəriləri yaradın. Testlər arasında asılılıqlardan qaçın — hər bir test müstəqil olmalıdır.
Detox WebView testini web.element() və web.invoke() metodları vasitəsilə dəstəkləyir. Veb elementləri ilə qarşılıqlı əlaqə üçün by.web(id, css və ya className) istifadə olunur. WebView-in yüklənmə üçün əlavə vaxt tələb etdiyini xatırlamaq vacibdir — sinxronizasiya işləmirsə, waitFor vasitəsilə yüklənmə gözləməsi əlavə edin.
// WebView-in Detox-da test edilməsi
const webView = web(by.id('webview'));
await webView.element(by.web.cssSelector('#submit-btn')).tap();
const result = await webView.element(
by.web.cssSelector('.result-text')
).getText();
await expect(result).toEqual('Success');
Detox detox-image-matching plaqini vasitəsilə ekran görüntülərinin müqayisəsini dəstəkləyir. Ekran görüntüləri vizual reqressiyaları aşkar etməyə imkan verir: yerdəyişmiş elementlər, səhv rənglər, itkin ikonalar. Sabit ekran görüntüləri üçün animasiyaları söndürün və sabit simulyator ölçüsündən istifadə edin.
Detox-un ən çox rast gəlinən problemləri sinxronizasiya ilə bağlıdır: sonsuz animasiyalar, uzun şəbəkə sorğuları və ya donmuş taymerlər. --loglevel trace flaqı ilə loglama Detox-un hansı resursları gözlədiyini göstərir. Detox donarsa — problemli kod sahəsi üçün device.disableSynchronization() istifadə edin.
iOS simulyatorunda Detox tətbiqin iphonesimulator konfiqurasiyası ilə xcodebuild vasitəsilə əvvəlcədən qurulmasını tələb edir. Ümumi səhv — Debug əvəzinə Release sxeminin istifadəsi, test flaqlarını söndürür. Android üçün AVD-nin tətbiqinizlə uyğun API ilə yaradıldığına və Intel HAXM sürətləndirilməsinin aktiv olduğuna əmin olun. macOS-də CI mühitləri üçün GitHub Actions-dan macOS-ranneri ilə istifadə etmək rahatdır, burada Xcode və simulyatorlar artıq əvvəlcədən quraşdırılıb.
Testlər mütəmadi olaraq timeaut səbəbindən uğursuz olarsa, yoxlayın: sinxronizasiyanın qlobal səviyyədə söndürülmədiyini, tətbiq kodunda təmizlənmədən setTimeout və ya setInterval istifadə edilmədiyini və uzunmüddətli əməliyyatın əsas axını bloklamadığını. Bəzən detoxrc.js-də testRunner.args.jest.$.testTimeout vasitəsilə timeoutu artırmaq kömək edir. Problemli sahələri tapmaq üçün Detox izləmə loglamasını aktivləşdirin — bu, freymvork tərəfindən hazırda hansı resursların və taymerlərin gözlənildiyini göstərir.
Testlərin icrasından sonra Detox artefaktlar yaradır: uğursuz testlərin ekran görüntüləri, tətbiq logları və JUnit XML hesabatları. Ekran görüntüləri test uğursuz olduqda avtomatik çəkilir və problemi vizual olaraq müəyyən etməyə kömək edir. CI üçün artefaktlar bulud yaddaşına yüklənir və uğursuzluq səbəblərini təhlil etmək üçün veb interfeysi vasitəsilə əlçatan olur.
Tez-tez verilən suallar
Detox tətbiqin daxili vəziyyətinə çıxışı və avtomatik sinxronizasiyası ilə gray-box yanaşmasından istifadə edir. Appium WebDriver vasitəsilə black-box modeli ilə işləyir və əl ilə gözləmələr tələb edir. Detox React Native layihələri üçün daha sürətli və sabitdir.
Detox testləri JavaScript və ya TypeScript dilində yazılır. Freymvork test-ranner kimi Jest və Mocha ilə inteqrasiya olunur. iOS üçün nativ mühərrik Swift-də, Android üçün isə Kotlin və Java-da yazılıb.
Bəli, Detox iOS (XCTest vasitəsilə) və Android (Espresso vasitəsilə) nativ tətbiqlərini dəstəkləyir. Lakin Detox-un əsas hədəf auditoriyası React Native tərtibatçılarıdır, çünki nativ layihələr üçün daha yetkin həllər mövcuddur.
Detox artefaktlar təqdim edir: ekran görüntüləri, tətbiq logları və HTML hesabatları. Yerli debug üçün --loglevel trace flaqı, CI üçün isə buluda yükləmə ilə avtomatik artefakt kollektoru istifadə olunur.
Bu, React Native tətbiqinin JavaScript-bendlını yenidən quraşdırmadan yenidən yükləyən Detox API metodudur. Hər testdən əvvəl tətbiqin vəziyyətini ilkin ekrana sıfırlamaq üçün beforeEach-də istifadə olunur.
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