اختبار التطبيقات المحمولة هو عملية التحقق من أن التطبيق يعمل بشكل صحيح، ولا يتعطل، ويلبي المتطلبات. وفقًا لـ Software Testing Help (2025)، فإن الاختبار الآلي يقلل وقت فحوصات الانحدار بنسبة 70–80% مقارنة بالاختبار اليدوي. في هذه المقالة، سنستعرض مستويات الاختبار، أدوات iOS و Android، TDD و BDD، بالإضافة إلى CI/CD للاختبارات.
النقاط الرئيسية
اختبارات الوحدة هي أساس اختبار التطبيقات المحمولة. تتحقق من أصغر وحدة كود — دالة واحدة، طريقة أو فصل دراسي بشكل معزول عن بقية النظام. في التطوير المحمول، تُكتب اختبارات الوحدة باستخدام JUnit (Android) و XCTest (iOS). يجب أن يكون اختبار الوحدة الجيد سريعًا ومستقلًا وقابلًا للتكرار — يجب ألا يعتمد على الشبكة أو قاعدة البيانات أو مكونات الواجهة. للعزل، تُستخدم مضاعفات الاختبار: mocks و stubs و fakes.
Mockito (Java/Kotlin) و MockK (Kotlin-first) هما مكتبتان شائعتان لإنشاء كائنات mock على Android. على iOS، يُستخدم OCMock أو Cuckoo أو البروتوكولات اليدوية. القاعدة: يجب أن تغطي اختبارات الوحدة منطق الأعمال ونماذج البيانات. يجب ألا تكرر اختبارات الواجهة اختبارات الوحدة — فهي تتحقق من تفاعل المستخدم مع الواجهة.
اختبارات التكامل تتحقق من التفاعل بين المكونات: المستودع مع قاعدة البيانات، ViewModel مع خدمة API، التنقل بين الشاشات. على عكس اختبارات الوحدة، تستخدم اختبارات التكامل تبعيات حقيقية أو قريبة من الواقع (مثل قاعدة بيانات في الذاكرة أو خادم mock). Robolectric هو إطار عمل لتشغيل اختبارات Android على JVM بدون محاكي، مما يسرع اختبارات التكامل بمقدار 10 مرات.
اختبارات اللقطة (Golden Tests) هي نوع خاص من اختبارات التكامل تقارن مكون واجهة معروضًا بصورة مرجعية (لقطة). إذا تغير المظهر، يفشل الاختبار — يرى المطور ما تغير. Facebook SnapshotTestCase (iOS) و Shot (Android) هما أدوات شائعة لاختبارات اللقطة.
اختبارات E2E (من البداية إلى النهاية) تتحقق من سيناريو المستخدم الكامل من البداية إلى النهاية: تشغيل التطبيق، تسجيل الدخول، تنفيذ إجراء، التحقق من النتيجة. اختبارات الواجهة هي مجموعة فرعية من E2E تركز على الواجهة. الأدوات: Espresso (Android)، XCUITest (iOS)، Detox (React Native). اختبارات E2E هي الأبطأ، لذا تُشغل بشكل منفصل على CI — عادة في البناء الليلي.
XCTest هو إطار عمل Apple المدمج لاختبار الوحدة للتطبيقات المحمولة. XCTestRunner يشغل الاختبارات على المحاكي أو جهاز حقيقي. ترث الاختبارات من XCTestCase، وتحتوي على setUp و tearDown للتحضير والتنظيف. يتضمن XCTest XCTAssert للتحقق (XCTAssertEqual، XCTAssertNil، XCTAssertTrue) و XCTWaiter لانتظار العمليات غير المتزامنة.
مثال لاختبار XCTest بسيط: إنشاء نموذج User، التحقق من صحة التهيئة، تنسيق الاسم وحساب العمر. تغطية الكود في Xcode تظهر أي أسطر الكود مغطاة بالاختبارات — الهدف للمشاريع التجارية: 70–80% على الأقل من تغطية منطق الأعمال. XCTest متكامل مع Xcode Server وأنظمة CI عبر xcodebuild test.
XCUITest هو إطار عمل Apple لاختبار الواجهة. يعمل من خلال معرفات الوصول: XCUIElementQuery يجد الأزرار وحقول الإدخال والجداول حسب label أو identifier أو النوع. يسجل XCUITest تسلسل الإجراءات (تسجيل/تشغيل) ويولد كود الاختبار. مهم: يجب أن تحتوي جميع عناصر الواجهة على accessibilityIdentifier لضمان استقرار عمل الاختبارات.
JUnit هو الإطار الأساسي لاختبار الوحدة للتطبيقات المحمولة على Java/Kotlin. على Android، يُستخدم JUnit 4 (آخر إصدار ثابت 4.13.2) و JUnit 5 للمشاريع الجديدة. Mockito هي مكتبة لإنشاء كائنات mock: when(mock.method()).thenReturn(value) — نمط قياسي لعزل الفئة المختبرة عن التبعيات.
مثال لاختبار JUnit لـ Android:
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class LoginViewModelTest {
@Mock
AuthRepository authRepository;
@Test
public void login_emptyEmail_returnsError() {
LoginViewModel vm = new LoginViewModel(authRepository);
String result = vm.login("", "password123");
assertEquals("Email cannot be empty", result);
verify(authRepository, never()).authenticate(any());
}
}
Espresso هو إطار عمل Google لاختبارات واجهة Android. يتزامن Espresso تلقائيًا مع سلسلة الواجهة: onView(withId(R.id.button)).perform(click()).check(matches(isDisplayed())). Espresso سهل الكتابة ومستقر بفضل الانتظار المدمج لحالة الخمول. UI Automator هو إطار عمل للاختبارات عبر التطبيقات يمكنه التفاعل مع عناصر النظام (حوارات الأذونات، ستارة الإشعارات).
Detox هو إطار عمل E2E من نوع الصندوق الرمادي لاختبار تطبيقات React Native المحمولة من Wix. يعمل Detox على كلتا المنصتين من قاعدة كود اختبار واحدة، باستخدام Espresso (Android) و XCUITest (iOS) تحت الغطاء. ينتظر Detox تلقائيًا حتى يصبح التطبيق خاملاً (لا رسوم متحركة، طلبات شبكة، مؤقتات) وعندها فقط ينفذ الإجراء التالي.
Appium هو إطار عمل عالمي عبر المنصات يدعم Android و iOS والويب والتطبيقات الهجينة. يستخدم Appium بروتوكول WebDriver ويدعم أي لغة برمجة (Java، Python، JS، Ruby). يعمل خادم Appium كخادم HTTP يترجم الأوامر إلى أوامر UI Automator / XCUITest الأصلية. العيب الرئيسي لـ Appium هو السرعة: الاختبارات تعمل بشكل أبطأ من Espresso أو XCUITest الأصليين.
| المعيار | iOS | Android |
|---|---|---|
| اختبارات الوحدة | XCTest | JUnit 4/5 + Mockito |
| اختبارات الواجهة | XCUITest | Espresso, UI Automator |
| اختبارات اللقطة | FBSnapshotTestCase | Shot, Roborazzi |
| أتمتة الإيماءات | XCUIGesture | UiAutomator touch |
| تغطية الكود | Xcode Code Coverage | Jacoco |
| تكامل CI | xcodebuild test | Gradle connectedCheck |
TDD هو منهجية اختبار التطبيقات المحمولة حيث يُكتب الاختبار قبل كود التنفيذ. دورة Red-Green-Refactor: (1) كتابة اختبار يفشل (Red)، (2) كتابة الحد الأدنى من الكود لنجاح الاختبار (Green)، (3) إعادة هيكلة الكود مع الحفاظ على نجاح الاختبار. يوفر TDD تغطية اختبارية 100% للوظائف الجديدة وهندسة نظيفة، لأن الاختبار هو أول مواصفات للمتطلب.
BDD هو امتداد لـ TDD حيث تُكتب الاختبارات بلغة طبيعية بتنسيق Given-When-Then. Given (سياق) — When (إجراء) — Then (نتيجة متوقعة). اختبارات BDD مفهومة لجميع أعضاء الفريق: المطورين والمختبرين والمحللين والعملاء. Mock vs Stub vs Fake: Mock يتحقق من التفاعل (هل تم استدعاء الطريقة)، Stub يعيد بيانات ثابتة، Fake هو تنفيذ عمل مبسط (مثل قاعدة بيانات في الذاكرة). في IT Sectr، نستخدم TDD لمنطق الأعمال الحرج و BDD لسيناريوهات القبول.
مضاعفات الاختبار هو الاسم العام للكائنات التي تحل محل التبعيات الحقيقية في الاختبارات. هناك أربعة أنواع: Dummy (كائن لملء المعاملات، لا يُستخدم)، Stub (يعيد قيمًا محددة)، Spy (يسجل الاستدعاءات للتحقق)، Mock (يحدد مسبقًا الاستدعاءات المتوقعة). فهم الفرق أمر بالغ الأهمية لتصميم الاختبارات بشكل صحيح.
CI/CD — التكامل المستمر والتسليم المستمر: ممارسة البناء والاختبار التلقائي للتطبيقات المحمولة مع كل تغيير في الكود. في التطوير المحمول، يشمل خط أنابيب CI/CD: التحليل الثابت، اختبارات الوحدة، اختبارات التكامل، بناء APK/IPA واختبارات الواجهة. GitHub Actions و Bitrise هما منصتان شائعتان لـ CI/CD المحمول. يجب أن تعمل الاختبارات بسرعة: اختبارات الوحدة في 1–2 دقيقة، اختبارات التكامل في 5–10، اختبارات الواجهة في 15–30 دقيقة.
Device Farm هي مزرعة أجهزة حقيقية للاختبار. Firebase Test Lab (Android) و Xcode Cloud (iOS) يوفران وصولًا سحابيًا لمئات نماذج الأجهزة. يكشف Device Farm مشكلات غير مرئية على المحاكيات: أحجام شاشات مختلفة، أداء على الأجهزة القديمة، مشكلات التوافق. في IT Sectr، نستخدم Firebase Test Lab لـ Android و Xcode Cloud لـ iOS بشكل منتظم.
الأسئلة الشائعة
للمشاريع التجارية، 70–80% على الأقل من تغطية منطق الأعمال. كود الواجهة أصعب في التغطية — 50% كافية. المهم ليس النسبة المئوية بل جودة الاختبارات: اختبر السيناريوهات الحرجة والحالات الحدودية ومعالجة الأخطاء.
Mock يتحقق من التفاعل — هل تم استدعاء طريقة معينة بمعاملات محددة. Stub يعيد بيانات محددة مسبقًا. Mock يتحقق من السلوك، Stub يتحقق من الحالة.
نعم، ولكن فقط لـ السيناريوهات الحرجة: تسجيل الدخول، التسجيل، إتمام الطلب، الدفع. اختبارات الواجهة بطيئة وهشة — لا تكتب اختبارًا لكل شاشة. ركز على سيناريوهات E2E للمستخدم.
اختبار Snapshot (Golden Test) يقارن مكون واجهة معروضًا بصورة مرجعية. إذا تغير المظهر (خط، حشوة، لون)، يفشل الاختبار — يتحقق المطور مما إذا كان التغيير مقصودًا. مثالي لمكتبات المكونات.
شغل اختبارات E2E بالتوازي على أجهزة متعددة، استخدم Cloud Device Farm وقسم الاختبارات إلى مجموعات مستقلة. حسّن الاختبارات: قلل فترات الانتظار، استخدم mocks لطلبات الشبكة.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.