בדיקות E2E ל-React Native: הגדרת Detox ו-CI
אתה מריץ CI, ובדיקות נכשלות ללא סיבה נראית לעין — לא חיכו לאנימציה, לא נמצא אלמנט. נשמע מוכר? אחד הלקוחות שלנו — אפליקציית FinTech עם 50 מסכים — סבל מ-30% כשלונות לא יציבים בכל build. מפתחים בילו שעות בהפעלה מחדש, ושחרורים התעכבו בשבועות. לאחר הטמעת Detox, הפחתנו את שיעור הכשלונות ל-5% וקיצרנו את זמן הריצה פי שלושה באמצעות ביצוע מקבילי. Detox הוא framework מסוג gray-box שמטמיע שרת בדיקות ישירות בתהליך האפליקציה. בניגוד ל-Appium, Detox מסתנכרן אוטומטית עם לולאת האירועים של React Native, ומספק בדיקות יציבות ללא sleep(). זה חשוב במיוחד לפרויקטים עם אנימציות דינמיות ובקשות רשת תכופות. הניסיון שלנו — 5+ שנים ויותר מ-15 פרויקטים מיושמים — מאפשר לנו להבטיח יציבות בדיקות אפילו בממשקי משתמש מורכבים.
למה Detox, לא Appium?
| קריטריון | Detox | Appium |
|---|---|---|
| סוג גישה | Gray-box (שרת מוטמע) | Black-box (חיצוני) |
| סנכרון | אוטומטי עם thread של JS | דורש sleep() והמתנות |
| יציבות ב-RN | גבוהה | נמוכה (נכשל לעתים קרובות) |
| תמיכה באנימציות | מובנית | דרך המתנות |
| מהירות ביצוע | מהיר יותר | איטי יותר עקב עיכובים |
| שיעור כשלונות ב-CI | 5-10% | 30-50% |
אנחנו משתמשים ב-Detox כי זה ה-framework היחיד שמבין את הפעולה הפנימית של React Native. התוצאה — בדיקות שלא נכשלות באקראי ב-CI.
איך אנחנו מגדירים את Detox: מלכודות ראשונות
הגדרת Detox לוקחת יותר זמן ממה שנראה. במיוחד ב-iOS. הנה התצורה ברירת המחדל שאנחנו משתמשים בה:
{ "detox": {
"testRunner": {
"args": {
"$0": "jest",
"config": "e2e/jest.config.js"
},
"jest": {
"setupTimeout": 120000
}
},
"apps": {
"ios.debug": {
"type": "ios.app",
"binaryPath": "ios/build/Build/Products/Debug-iphonesimulator/MyApp.app",
"build": "xcodebuild -workspace ios/MyApp.xcworkspace -scheme MyApp -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build"
},
"android.debug": {
"type": "android.apk",
"binaryPath": "android/app/build/outputs/apk/debug/app-debug.apk",
"build": "cd android && ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug"
}
},
"devices": {
"simulator": {
"type": "ios.simulator",
"device": {
"type": "iPhone 15",
"os": "iOS 17.4"
}
},
"emulator": {
"type": "android.emulator",
"device": {
"avdName": "Pixel_7_API_34"
}
}
}
}
}בעיה נפוצה: ה-APK חייב להיבנות עם { "detox": { "testRunner": { "args": { "$0": "jest", "config": "e2e/jest.config.js" }, "jest": { "setupTimeout": 120000 } }, "apps": { "ios.debug": { "type": "ios.app", "binaryPath": "ios/build/Build/Products/Debug-iphonesimulator/MyApp.app", "build": "xcodebuild -workspace ios/MyApp.xcworkspace -scheme MyApp -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build" }, "android.debug": { "type": "android.apk", "binaryPath": "android/app/build/outputs/apk/debug/app-debug.apk", "build": "cd android && ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug" } }, "devices": { "simulator": { "type": "ios.simulator", "device": { "type": "iPhone 15", "os": "iOS 17.4" } }, "emulator": { "type": "android.emulator", "device": { "avdName": "Pixel_7_API_34" } } } } } — אחרת הסנכרון לא עובד. ב-iOS, רק build של סימולטור (assembleAndroidTest). מכשירים פיזיים דורשים profiling וחתימה נפרדים. כמו כן, הגדר -sdk iphonesimulator — לפרויקטים גדולים אנחנו משתמשים ב-120 שניות כדי שבדיקות יוכלו לאתחל.
איך להימנע מבדיקות לא יציבות?
בדיקות לא יציבות הן הכאב העיקרי ב-CI. Detox מפחית אותן אבל לא מבטל לחלוטין. הנה טבלה עם גורמים אופייניים ופתרונות:
| גורם | פתרון |
|---|---|
| אנימציות אינסופיות | השבת ב-test build באמצעות דגל setupTimeout או detoxDisableHierarchyDump מותאם אישית |
| בקשות רשת שלא הושלמו | השתמש ב-IS_TESTING עם timeout, או יירט בקשות דרך waitFor |
| מצב מסך לא מאופס | קרא ל-mock לפני כל בדיקה |
| timeouts לא מספקים של Jest | הגדל device.reloadReactNative() ל-120 שניות |
| גרסאות iOS/Android שונות | בדוק על אותן גרסאות כמו ב-CI |
אנחנו גם משתמשים במוסכמת jest.setTimeout: testID. זה מפשט תחזוקה ואיתור אלמנטים.
בדיקות מקבילות: איך להאיץ CI?
Detox תומך בביצוע מקבילי דרך Jest sharding. פקודה:
detox test --configuration android.debug --workers 3 דרושים 3 אמולטורים או סימולטורים. ב-macOS, אתה צריך 16 GB RAM עבור 3 סימולטורים. AVDs נוצרים אוטומטית עם הרשאות מתאימות. ביצוע מקבילי מקצר את זמן הריצה המלא מ-45 דקות ל-15 דקות — פי שלושה מהר יותר.
אינטגרציית CI: מתכון ל-GitHub Actions
עבור iOS, השתמש ב-macOS runner; עבור Android, Ubuntu עם screen_component_action. דוגמה ל-build ובדיקה:
---
jobs:
e2e-ios:
runs-on: macos-14
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm ci
- run: npx pod-install
- run: npx detox build --configuration ios.debug
- run: npx detox test --configuration ios.debug --headless
עבור Android, detox test --configuration android.debug --workers 3 הוא חובה; אחרת, האמולטור לא ימצא תצוגה. כמו כן, שמור במטמון סימולטורים ואמולטורים כדי להימנע מיצירתם מאפס.
פקודות Detox אופייניות לניפוי באגים
-
reactivecircus/android-emulator-runner— שימוש חוזר במכשיר שכבר הופעל. -
jobs: e2e-ios: runs-on: macos-14 steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: { node-version: '20' } - run: npm ci - run: npx pod-install - run: npx detox build --configuration ios.debug - run: npx detox test --configuration ios.debug --headless— הקלטת לוגים של כל הבדיקות. -
--headless— שמירת לוג build. -
detox test —reuse— ריצה עם מצב debug.
מה כלול
- הגדרת Detox מלאה ל-iOS ו-Android
- כתיבת בדיקות לזרימות משתמש מרכזיות (אימות, ניווט, תשלומים)
- תיעוד להגדרה והרחבת בדיקות
- אינטגרציה ל-CI/CD שלך (GitHub Actions, GitLab CI, Jenkins)
- הדרכת צוות (שעתיים + גישה להקלטה)
- הבטחת יציבות בדיקות: לא יותר מ-5% כשלונות לא יציבים
ציר זמן ועלות
הגדרת תצורה בסיסית וכיסוי זרימות מרכזיות לוקחת 5 ימים. עם מודולים native מורכבים (התראות push, ביומטריה, מצלמה) — עד 7 ימים. העלות מחושבת באופן אישי — צור קשר, וננתח את האפליקציה שלך ונציע תוכנית אופטימלית.
אנחנו מבטיחים יציבות בדיקות בכל השלבים. פנה אלינו — נעזור לצוות שלך לשכוח מבדיקות לא יציבות ולהאיץ את מחזור השחרור. קבל ייעוץ: שלח בקשה, וניצור איתך קשר תוך יום.







