الاختبار في تطوير التطبيقات المحمولة: ما هو، أنواعه وكيفية تنظيمه

المؤلف: IT Sectr نُشر: 2026-03-31 وقت القراءة: 9 دق

اختبار التطبيقات المحمولة هو عملية التحقق من أن التطبيق يعمل بشكل صحيح، ولا يتعطل، ويلبي المتطلبات. وفقًا لـ Software Testing Help (2025)، فإن الاختبار الآلي يقلل وقت فحوصات الانحدار بنسبة 70–80% مقارنة بالاختبار اليدوي. في هذه المقالة، سنستعرض مستويات الاختبار، أدوات iOS و Android، TDD و BDD، بالإضافة إلى CI/CD للاختبارات.

النقاط الرئيسية

  • اختبارات الوحدة تتحقق من الوظائف والفئات الفردية؛ اختبارات التكامل تتحقق من تفاعل الوحدات؛ E2E تغطي سيناريو المستخدم الكامل.
  • iOS: XCTest لاختبارات الوحدة، XCUITest لاختبارات الواجهة. Android: JUnit + Mockito + Espresso.
  • أطر عمل عبر المنصات: Detox (React Native)، Appium (عالمي)، XCUITest (iOS).
  • TDD (التطوير المبني على الاختبار) — الاختبار أولاً، ثم الكود؛ BDD — سيناريوهات بلغة واضحة.
  • CI/CD: يتم تشغيل الاختبارات تلقائيًا مع كل push — وهذا معيار إلزامي للتطوير التجاري.

مستويات الاختبار: Unit، Integration، E2E

اختبار الوحدة

اختبارات الوحدة هي أساس اختبار التطبيقات المحمولة. تتحقق من أصغر وحدة كود — دالة واحدة، طريقة أو فصل دراسي بشكل معزول عن بقية النظام. في التطوير المحمول، تُكتب اختبارات الوحدة باستخدام 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 (من البداية إلى النهاية) تتحقق من سيناريو المستخدم الكامل من البداية إلى النهاية: تشغيل التطبيق، تسجيل الدخول، تنفيذ إجراء، التحقق من النتيجة. اختبارات الواجهة هي مجموعة فرعية من E2E تركز على الواجهة. الأدوات: Espresso (Android)، XCUITest (iOS)، Detox (React Native). اختبارات E2E هي الأبطأ، لذا تُشغل بشكل منفصل على CI — عادة في البناء الليلي.

أدوات iOS: XCTest و XCUITest

XCTest

XCTest هو إطار عمل Apple المدمج لاختبار الوحدة للتطبيقات المحمولة. XCTestRunner يشغل الاختبارات على المحاكي أو جهاز حقيقي. ترث الاختبارات من XCTestCase، وتحتوي على setUp و tearDown للتحضير والتنظيف. يتضمن XCTest XCTAssert للتحقق (XCTAssertEqual، XCTAssertNil، XCTAssertTrue) و XCTWaiter لانتظار العمليات غير المتزامنة.

مثال لاختبار XCTest بسيط: إنشاء نموذج User، التحقق من صحة التهيئة، تنسيق الاسم وحساب العمر. تغطية الكود في Xcode تظهر أي أسطر الكود مغطاة بالاختبارات — الهدف للمشاريع التجارية: 70–80% على الأقل من تغطية منطق الأعمال. XCTest متكامل مع Xcode Server وأنظمة CI عبر xcodebuild test.

XCUITest

XCUITest هو إطار عمل Apple لاختبار الواجهة. يعمل من خلال معرفات الوصول: XCUIElementQuery يجد الأزرار وحقول الإدخال والجداول حسب label أو identifier أو النوع. يسجل XCUITest تسلسل الإجراءات (تسجيل/تشغيل) ويولد كود الاختبار. مهم: يجب أن تحتوي جميع عناصر الواجهة على accessibilityIdentifier لضمان استقرار عمل الاختبارات.

أدوات Android: JUnit، Espresso، Robolectric

JUnit و Mockito

JUnit هو الإطار الأساسي لاختبار الوحدة للتطبيقات المحمولة على Java/Kotlin. على Android، يُستخدم JUnit 4 (آخر إصدار ثابت 4.13.2) و JUnit 5 للمشاريع الجديدة. Mockito هي مكتبة لإنشاء كائنات mock: when(mock.method()).thenReturn(value) — نمط قياسي لعزل الفئة المختبرة عن التبعيات.

مثال لاختبار JUnit لـ Android:

java
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 و UI Automator

Espresso هو إطار عمل Google لاختبارات واجهة Android. يتزامن Espresso تلقائيًا مع سلسلة الواجهة: onView(withId(R.id.button)).perform(click()).check(matches(isDisplayed())). Espresso سهل الكتابة ومستقر بفضل الانتظار المدمج لحالة الخمول. UI Automator هو إطار عمل للاختبارات عبر التطبيقات يمكنه التفاعل مع عناصر النظام (حوارات الأذونات، ستارة الإشعارات).

أدوات عبر المنصات: Detox، Appium

Detox لـ React Native

Detox هو إطار عمل E2E من نوع الصندوق الرمادي لاختبار تطبيقات React Native المحمولة من Wix. يعمل Detox على كلتا المنصتين من قاعدة كود اختبار واحدة، باستخدام Espresso (Android) و XCUITest (iOS) تحت الغطاء. ينتظر Detox تلقائيًا حتى يصبح التطبيق خاملاً (لا رسوم متحركة، طلبات شبكة، مؤقتات) وعندها فقط ينفذ الإجراء التالي.

Appium

Appium هو إطار عمل عالمي عبر المنصات يدعم Android و iOS والويب والتطبيقات الهجينة. يستخدم Appium بروتوكول WebDriver ويدعم أي لغة برمجة (Java، Python، JS، Ruby). يعمل خادم Appium كخادم HTTP يترجم الأوامر إلى أوامر UI Automator / XCUITest الأصلية. العيب الرئيسي لـ Appium هو السرعة: الاختبارات تعمل بشكل أبطأ من Espresso أو XCUITest الأصليين.

مقارنة أدوات اختبار iOS و Android
المعيار 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 و BDD: منهجيات الاختبار

TDD: التطوير المبني على الاختبار

TDD هو منهجية اختبار التطبيقات المحمولة حيث يُكتب الاختبار قبل كود التنفيذ. دورة Red-Green-Refactor: (1) كتابة اختبار يفشل (Red)، (2) كتابة الحد الأدنى من الكود لنجاح الاختبار (Green)، (3) إعادة هيكلة الكود مع الحفاظ على نجاح الاختبار. يوفر TDD تغطية اختبارية 100% للوظائف الجديدة وهندسة نظيفة، لأن الاختبار هو أول مواصفات للمتطلب.

BDD: التطوير المبني على السلوك

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 و Device Farm

أتمتة الاختبارات في CI/CD

CI/CD — التكامل المستمر والتسليم المستمر: ممارسة البناء والاختبار التلقائي للتطبيقات المحمولة مع كل تغيير في الكود. في التطوير المحمول، يشمل خط أنابيب CI/CD: التحليل الثابت، اختبارات الوحدة، اختبارات التكامل، بناء APK/IPA واختبارات الواجهة. GitHub Actions و Bitrise هما منصتان شائعتان لـ CI/CD المحمول. يجب أن تعمل الاختبارات بسرعة: اختبارات الوحدة في 1–2 دقيقة، اختبارات التكامل في 5–10، اختبارات الواجهة في 15–30 دقيقة.

Device Farm

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 يعيد بيانات محددة مسبقًا. Mock يتحقق من السلوك، Stub يتحقق من الحالة.

هل يجب كتابة اختبارات للواجهة؟

نعم، ولكن فقط لـ السيناريوهات الحرجة: تسجيل الدخول، التسجيل، إتمام الطلب، الدفع. اختبارات الواجهة بطيئة وهشة — لا تكتب اختبارًا لكل شاشة. ركز على سيناريوهات E2E للمستخدم.

ما هو اختبار Snapshot؟

اختبار Snapshot (Golden Test) يقارن مكون واجهة معروضًا بصورة مرجعية. إذا تغير المظهر (خط، حشوة، لون)، يفشل الاختبار — يتحقق المطور مما إذا كان التغيير مقصودًا. مثالي لمكتبات المكونات.

كيف يمكن تسريع اختبارات E2E؟

شغل اختبارات E2E بالتوازي على أجهزة متعددة، استخدم Cloud Device Farm وقسم الاختبارات إلى مجموعات مستقلة. حسّن الاختبارات: قلل فترات الانتظار، استخدم mocks لطلبات الشبكة.

الملخص

  • اختبارات الوحدة — أساس هرم الاختبار: سريعة، معزولة، تغطي منطق الأعمال.
  • iOS: XCTest للوحدة، XCUITest للواجهة. Android: JUnit + Mockito، Espresso للواجهة، Robolectric لاختبارات التكامل السريعة.
  • أطر عمل عبر المنصات: Detox (React Native)، Appium (عالمي)، XCUITest (iOS-أصلي).
  • TDD — اختبار قبل الكود، BDD — سيناريوهات بلغة الأعمال (Given-When-Then).
  • CI/CD — التشغيل التلقائي للاختبارات مع كل push إلزامي للتطوير الحديث.
  • Device Farm — اختبار على أجهزة حقيقية في السحابة لتحديد مشكلات硬件.
  • هرم الاختبار: الكثير من الوحدة، أقل للتكامل، حتى أقل لـ E2E — التوازن الأمثل بين السرعة والتغطية.

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع