בדיקות אינטגרציה עבור Flutter הן הנשק המרכזי שלך נגד רגרסיות. כאשר האפליקציה שלך מייצרת הכנסות, כל קריסה בפרודקשן היא הפסד. אנו רואים באופן קבוע פרויקטים שבהם בדיקות widget עוברות, אך משתמשים לא יכולים להשלים הזמנה עקב באג בניווט. בדיקות widget רצות בסביבה מבודדת: הן לא מחקות רינדור אמיתי, אנימציות או קריאות מערכת. בדיקות אינטגרציה על מכשירים אמיתיים תופסות תרחישים כאלה לפני השחרור. הצוות שלנו, עם 5 שנות ניסיון ב-Flutter, כותב בדיקות אינטגרציה שמפחיתות באגים קריטיים ב-70%. לקוח אחד גילה 12 באגים נסתרים בעגלת הקניות לאחר יישום בדיקות אינטגרציה—באגים שבדיקות widget פספסו במשך שישה חודשים. קבל את אותה יציבות—הזמן ביקורת לפרויקט שלך, ונעריך אותו תוך יום אחד.
לפי התיעוד הרשמי של Flutter, בדיקות אינטגרציה מאמתות תרחישי משתמש מלאים עם סנכרון אנימציות ודיאלוגים אמיתיים. זו הדרך היחידה להבטיח שתהליך התשלום עובד על כל המכשירים.
איך לכתוב את בדיקת האינטגרציה הראשונה שלך?
הגישה המודרנית היא החבילה integration_test מה-SDK של Flutter. היא החליפה את flutter_driver המיושן החל מגרסה 2.5.
pubspec.yaml:
dev_dependencies: integration_test: sdk: flutter flutter_test: sdk: flutter מבנה התיקיות:
integration_test/ app_test.dart test_driver/ integration_test.dart # только для запуска через flutter drive הרצה על מכשיר מחובר:
flutter test integration_test/app_test.dart הרצה ב-Firebase Test Lab או BrowserStack דרך dev_dependencies: integration_test: sdk: flutter flutter_test: sdk: flutter + העלאת APK.
בדיקה טיפוסית מכסה זרימת משתמש מלאה: פתיחת אפליקציה → התחברות → מעבר לקטלוג → הוספת פריט → תשלום → ראיית אישור.
void main() {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
testWidgets('Full checkout flow', (tester) async {
app.main();
await tester.pumpAndSettle();
await tester.enterText(find.byKey(Key('email')), '[email protected]');
await tester.enterText(find.byKey(Key('password')), 'password123');
await tester.tap(find.byKey(Key('login_btn')));
await tester.pumpAndSettle(timeout: Duration(seconds: 10));
expect(find.byKey(Key('home_screen')), findsOneWidget);
await tester.tap(find.byKey(Key('product_card_1')));
await tester.pumpAndSettle();
await tester.tap(find.byKey(Key('add_to_cart_btn')));
await tester.pumpAndSettle();
expect(find.text('1'), findsOneWidget);
});
}integration_test/ app_test.dart test_driver/ integration_test.dart # только для запуска через flutter drive — timeout הוא חובה. בלעדיו, באמולטור איטי הבדיקה תיכשל לפני שהאנימציה תסתיים.
אילו תרחישים בדיקות אינטגרציה צריכות לכסות?
כסה את נתיב המשתמש הקריטי: התחברות, חיפוש מוצרים, הוספה לעגלה, תשלום, סליקה. תרחישים עם deep linking, התראות push ומשימות רקע דורשים גם הם אימות. מניסיוננו, 80% מהבאגים הקריטיים מתרחשים ב-20% מהתרחישים. התחל עם אלה—הם נותנים את התשואה הגבוהה ביותר.
למה בדיקות אינטגרציה יכולות להיות לא יציבות?
בדיקות flaky הן אתגר נפוץ. גורמים עיקריים ופתרונות:
שלושת הגורמים העיקריים לבדיקות flaky והפתרונות שלהם
| גורם | פתרון |
|---|---|
| אנימציות אינסופיות (אינדיקטורים, Lottie) | השתמש ב-flutter test integration_test/app_test.dart וב-flutter build apk --target integration_test/app_test.dart |
| מקלדת שמכסה את הכפתור | void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); testWidgets('Full checkout flow', (tester) async { app.main(); await tester.pumpAndSettle(); await tester.enterText(find.byKey(Key('email')), '[email protected]'); await tester.enterText(find.byKey(Key('password')), 'password123'); await tester.tap(find.byKey(Key('login_btn'))); await tester.pumpAndSettle(timeout: Duration(seconds: 10)); expect(find.byKey(Key('home_screen')), findsOneWidget); await tester.tap(find.byKey(Key('product_card_1'))); await tester.pumpAndSettle(); await tester.tap(find.byKey(Key('add_to_cart_btn'))); await tester.pumpAndSettle(); expect(find.text('1'), findsOneWidget); }); } או pumpAndSettle(timeout: Duration(seconds: 10)) |
| פסק זמן של הבדיקה | הגדל: tester.pump(Duration(milliseconds: 500)) |
לפי הנתונים שלנו, 90% מהבדיקות ה-flaky נגרמות על ידי שלושת הגורמים הללו. שימוש ב-pump עם המתנה מפורשת ל-widget מפחית כשלים כוזבים ב-60%. בדיקות widget רצות מהר יותר, אבל בדיקות אינטגרציה מוצאות פי 4 יותר באגים הקשורים לניווט ואנימציות. הניסיון שלנו מאשר זאת: לאחר המעבר לבדיקות אינטגרציה, זמן הדיבוג ירד ב-40%.
איך להגדיר הרצה מקבילית ב-CI?
קובץ בדיקה אחד = סשן מכשיר אחד. להרצות מקבילות, השתמש במטריצה ב-GitHub Actions:
---
strategy:
matrix:
test-file: [auth_test.dart, checkout_test.dart, profile_test.dart]
steps:
- run: flutter test integration_test/${{ matrix.test-file }}
כל job מקבל אמולטור משלו דרך waitFor.
Backend אמיתי או Mocks לרשת?
Backend אמיתי דורש סביבת בדיקה (staging) עם נתונים קבועים. Mock server — השתמש ב-await tester.testTextInput.receiveAction(TextInputAction.done)/FocusManager.instance.primaryFocus?.unfocus() ברמת המאגר או בשרת HTTP מקומי דרך החבילה @Timeout(Duration(minutes: 5)). האפשרות השנייה קרובה יותר למציאות: האפליקציה מבצעת בקשות HTTP אמיתיות, אבל ל-strategy: matrix: test-file: [auth_test.dart, checkout_test.dart, profile_test.dart] steps: - run: flutter test integration_test/${{ matrix.test-file }} . מעבר דרך reactivecircus/android-emulator-runner@v2.
מקרה אמיתי: איך בדיקת אינטגרציה הצילה שחרור
בפרויקט אחד, לפני השחרור הרצנו בדיקת אינטגרציה לתשלום. הבדיקה נכשלה בבחירת אמצעי התשלום—לאחר עדכון ספריית התשלומים, כפתור התשלום הפך לבלתי נגיש ברוחב מסך מסוים. בדיקות widget פספסו זאת כי הן לא מרנדרות את ה-UI האמיתי. הבאג תוקן תוך שעה, והשחרור עבר חלק.
מה כלול בעבודה?
- ביקורת על הארכיטקטורה הנוכחית של האפליקציה
- פיתוח אסטרטגיית בדיקות
- כתיבת בדיקות אינטגרציה לתרחישי משתמש מרכזיים
- שילוב בדיקות ב-CI/CD (GitHub Actions, GitLab CI)
- הגדרת הרצה מקבילית על אמולטורים
- תיעוד להרצה ותחזוקה של בדיקות
- הכשרת הצוות של הלקוח
לוח זמנים ועלות
| היקף העבודה | לוח זמנים |
|---|---|
| 3–5 זרימות מרכזיות (auth, קטלוג, תשלום) | 3 ימים |
| תרחישים מורכבים (תשלומים, ניווט עמוק) | עד 5 ימים |
| כיסוי מלא של האפליקציה | החל משבועיים |
העלות מחושבת באופן אישי לאחר הביקורת. קבל ייעוץ—נעריך את הפרויקט שלך תוך יום אחד.
אנחנו מבטיחים: חודשיים של תמיכה חינם לאחר המסירה. מעל 20 פרויקטי Flutter מוצלחים. צור קשר לייעוץ—ננתח את האפליקציה שלך ונציע אסטרטגיית בדיקות.







