إعداد الاختبار المتقدم

الاختبار في استوديو Android والاختبار من سطر الأوامر يشرحان كيفية إعداد وتشغيل إعدادات الاختبار الأساسية. ومع ذلك، عندما يصبح تطبيقك ومتطلبات الاختبار فيه أكثر تقدمًا، قد تحتاج إلى تكييف إعدادات الاختبار بشكل أكبر. على سبيل المثال، قد تحتاج إلى إعداد اختبار متقدم عندما تريد إجراء ما يلي:

  • إجراء الاختبارات المؤدّية إلى إصدار معيّن فقط من إصدار محدّد أو إلغاء إعدادات المظهر
  • يمكنك تغيير نوع الإصدار الذي تُجري اختباراتك عليه أو ضبط خيارات Gradle.
  • استخرِج اختبارات المعدات في وحدة الاختبار الخاصة بها.
  • يمكنك إجراء اختبار أكثر تقدمًا كجزء من إعداد عملية الدمج المستمر.

تصف هذه الصفحة طرقًا مختلفة لتهيئة اختباراتك عندما لا تتناسب الإعدادات الافتراضية مع احتياجاتك.

إنشاء اختبار مُعدّ لنسخة الإصدار

وإذا كان مشروعك يتضمن إنشاء صيغ باستخدام مجموعات مصادر فريدة، يمكنك تضمين الاختبارات المساعِدة التي تتوافق مع مجموعات المصادر هذه. يحافظ هذا على رمز الاختبار منظمًا ويتيح لك إجراء الاختبارات التي تنطبق فقط على متغير إصدار معين.

لربط الاختبارات المُعدَّلة بنُسخة إصدار معيّن، يمكنك وضعها في مجموعة المصادر الخاصة بها، وهي متوفّرة على الرابط src/androidTestVariantName.

تتم مشاركة الاختبارات المضبوطة في مجموعة المصدر src/androidTest/ من خلال جميع صيغ الإصدارات. عند إنشاء ملف APK تجريبي لنسخة "MyFlavor" من تطبيقك، تجمع لعبة Gradle بين مجموعتي المصادر src/androidTest/ وsrc/androidTestMyFlavor/.

لإضافة مجموعة مصدر اختبار لنسخة الإصدار في "استوديو Android"، يُرجى اتّباع الخطوات التالية:

  1. في نافذة المشروع، انقر على القائمة واختَر طريقة عرض المشروع.
  2. ضمن مجلد الوحدة المناسب، انقر بزر الماوس الأيمن على مجلد src وانقر على جديد > دليل.
  3. بالنسبة إلى اسم الدليل، أدخِل "androidTestVariantName". على سبيل المثال، إذا كان لديك إصدار إصدار باسم "MyFlavor"، استخدِم اسم الدليل androidTestMyFlavor.
  4. انقر على حسنًا.
  5. انقر بزر الماوس الأيمن على الدليل الجديد واختر جديد > الدليل.
  6. أدخِل "java" كاسم الدليل، ثم انقر على OK (حسنًا).

يمكنك الآن إضافة اختبارات إلى مجموعة المصدر الجديدة هذه من خلال اتّباع خطوات إضافة اختبار جديد. عند الوصول إلى مربع الحوار اختيار دليل الوجهة، اختر مجموعة مصادر اختبار المتغيّر الجديدة.

يعرض الجدول التالي مثالاً لكيفية وضع ملفات اختبار قياس الأداء في مجموعات المصادر التي تتوافق مع مجموعات مصادر التعليمات البرمجية للتطبيق:

الجدول 1. رمز مصدر التطبيق وملفات اختبار الأدوات المقابلة

المسار إلى فئة التطبيق مسار فئة اختبار قياس حالة التطبيق
src/main/java/Example.java src/androidTest/java/AndroidExampleTest.java
src/myFlavor/java/Example.java src/androidTestMyFlavor/java/AndroidExampleTest.java

تمامًا كما يحدث مع مجموعات مصادر التطبيقات، يتم دمج وتجاوز إصدار Gradle للملفات من مجموعات مصادر الاختبار المختلفة. في هذه الحالة، سيؤدي الملف AndroidExampleTest.java في مجموعة المصدر androidTestMyFlavor إلى إلغاء الإصدار الوارد في مجموعة المصدر androidTest. وذلك لأن مجموعة مصدر نكهة المنتج لها الأولوية على مجموعة المصدر الرئيسية.

عند اختيار نكهات مختلفة في أداة اختيار خيارات الإصدار، يتم عرض مجلدات androidTest المناسبة في طريقة عرض Android لعرض المجلدات المستخدَمة:

تم تحديد صيغة MyFlavor ويظهر مجلد androidTestMyFlavor
        في طريقة عرض Android
الشكل 1. تم اختيار صيغة واحدة (MyFlavor)، وسيظهر المجلد androidTestMyFlavor في طريقة العرض Android.

لا يظهر المجلد androidTestMyFlavor عند تحديد خيار مختلف:

تم اختيار صيغة OtherFlavor ومجلد androidTestMyFlavor لا يظهر في طريقة عرض Android.
الشكل 2. تم اختيار صيغة واحدة (OtherFlavor)، ولا يظهر المجلد androidTestMyFlavor في طريقة العرض Android.

يبدو هذا مختلفًا قليلاً إذا كنت تستخدم عرض المشروع، ولكن ينطبق المبدأ نفسه:

تم تحديد صيغة MyFlavor ومجلد androidTestMyFlavor نشط
        في عرض المشروع
الشكل 3. تم اختيار صيغة واحدة (MyFlavor)، لأنّ المجلد androidTestMyFlavor نشط في عرض المشروع.

عند تحديد خيار مختلف، سيظل مجلد androidTestMyFlavor مرئيًا، ولكن لن يتم عرضه كنشط:

تم اختيار صيغة OtherFlavor ومجلد androidTestMyFlavor ليس نشطًا في عرض المشروع.
الشكل 4. تم اختيار صيغة واحدة (OtherFlavor)، لأنّ المجلد androidTestMyFlavor غير نشط في طريقة عرض المشروع.

لمزيد من المعلومات عن كيفية دمج مجموعات المصادر، راجِع مجموعات المصادر.

ضبط إعدادات بيان الأدوات

يتم تضمين الاختبارات المساعِدة في ملف APK منفصل يتضمّن ملف AndroidManifest.xml خاص بها. عندما تنشئ Gradle ملف APK التجريبي، تُنشئ ملف AndroidManifest.xml تلقائيًا وتضبطه باستخدام العقدة <instrumentation>. أحد الأسباب التي تجعل Gradle يضبط هذه العقدة لك هو التأكّد من أنّ السمة targetPackage تحدّد اسم الحزمة الصحيح للتطبيق الذي يخضع للاختبار.

لتغيير إعدادات أخرى لهذه العقدة، يمكنك إنشاء ملف بيان آخر في مجموعة مصدر الاختبار أو ضبط ملف build.gradle على مستوى الوحدة، كما هو موضّح في نموذج الرمز التالي. يمكن العثور على القائمة الكاملة للخيارات في مرجع واجهة برمجة التطبيقات BaseFlavor.

رائع

android {
    ...
    defaultConfig {
        ...
        testApplicationId "com.example.test"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        testHandleProfiling true
        testFunctionalTest true
    }
}

لغة Kotlin

android {
    ...
    defaultConfig {
        ...
        testApplicationId = "com.example.test"
        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
        testHandleProfiling = true
        testFunctionalTest = true
    }
}

Each product flavor you configure can override properties in the defaultConfig {} block. To learn more, go to Configure product flavors.

The properties in the snippet are:

Setting Description
testApplicationId Specifies the application ID for the test APK.
testInstrumentationRunner Specifies the fully qualified class name of the test instrumentation runner.
testHandleProfiling If set to true, enables the instrumentation class to start and stop profiling.
If set to false, profiling occurs the entire time the instrumentation class is running.
testFunctionalTest If set to true, indicates that the Android system should run the instrumentation class as a functional test.
The default value is false.

Change the test build type

By default, all instrumentation tests run against the debug build type. You can change this to another build type by using the testBuildType property in your module-level build.gradle file. For example, if you want to run your tests against your staging build type, edit the file as shown in the following snippet:

Groovy

android {
    ...
    testBuildType "staging"
}

لغة Kotlin

android {
    ...
    testBuildType = "staging"
}

ضبط خيارات اختبار Gradle

يتيح لك مكوّن Gradle الإضافي Android تحديد خيارات معيّنة لجميع اختباراتك أو لبعضها فقط. في ملف build.gradle على مستوى الوحدة، استخدِم كتلة testOptions لتحديد الخيارات التي تغيّر كيفية إجراء Gradle لجميع اختباراتك:

رائع

android {
    ...
    // Encapsulates options for running tests.
    testOptions {
        reportDir "$rootDir/test-reports"
        resultsDir "$rootDir/test-results"
    }
}

لغة Kotlin

android {
    ...
    // Encapsulates options for running tests.
    testOptions {
        reportDir "$rootDir/test-reports"
        resultsDir = "$rootDir/test-results"
    }
}

تغيّر السمة reportDir الدليل الذي تحفظ فيه أداة Gradle تقارير الاختبار. يحفظ Gradle تلقائيًا تقارير الاختبارات في دليل path_to_your_project/module_name /build/outputs/reports/. تحدّد $rootDir المسار المرتبط بالدليل الجذري للمشروع الحالي.

تغيّر السمة resultsDir الدليل الذي يحفظ فيه Gradle نتائج الاختبار. تحفظ أداة Gradle تلقائيًا نتائج الاختبار في دليل path_to_your_project/module_name /build/outputs/test-results/. تحدّد $rootDir المسار المرتبط بالدليل الجذري للمشروع الحالي.

لتحديد خيارات اختبارات الوحدات المحلية فقط، يمكنك ضبط مجموعة unitTests داخل testOptions.

رائع

android {
    ...
    testOptions {
        ...
        // Encapsulates options for local unit tests.
        unitTests {
            returnDefaultValues true

            all {
                jvmArgs '-XX:MaxPermSize=256m'

                if (it.name == 'testDebugUnitTest') {
                    systemProperty 'debug', 'true'
                }
                ...
            }
        }
    }
}

لغة Kotlin

android {
    ...
    testOptions {
        ...
        // Encapsulates options for local unit tests.
        unitTests {
            returnDefaultValues = true

            all {
                jvmArgs = listOf("-XX:MaxPermSize=256m")

                 if (it.name == "testDebugUnitTest") {
                    systemProperty = mapOf("debug" to "true")
                }
                ...
            }
        }
    }
}

بشكل تلقائي، تُطرح اختبارات الوحدات المحلية استثناءً في أي وقت يحاول فيه الرمز الذي تختبره الوصول إلى واجهات برمجة تطبيقات نظام Android الأساسي، إلا إذا اشرحت حول تبعيات Android بنفسك أو باستخدام إطار عمل اختبار مثل Mockito. مع ذلك، يمكنك تفعيل السمة returnDefaultValues بحيث يعرض الاختبار إما القيمة "فارغ" أو "صفر" عند الوصول إلى واجهات برمجة تطبيقات النظام الأساسي، بدلاً من طرح استثناء.

تضم مجموعة all خيارات للتحكم في كيفية تنفيذ Gradle لاختبارات الوحدات المحلية. للحصول على قائمة بجميع الخيارات التي يمكنك تحديدها، يُرجى الاطّلاع على المستندات المرجعية لمنصة Gradle.

تحدّد السمة jvmArgs وسيطات آلة متجه الدعم لاختبارات آلة متجه الدعم.

يمكنك أيضًا التحقق من اسم المهمة لتطبيق الخيارات على الاختبارات التي تحددها فقط. في مثال المقتطف، تم ضبط السمة debug على true ولكن لمهمة testDebugUnitTest فقط.

استخدام وحدات اختبار منفصلة للاختبارات المعدّة

إذا أردت الحصول على وحدة مخصصة للاختبارات الآلية، لعزل باقي التعليمات البرمجية عن اختباراتك، قم بإنشاء وحدة اختبار منفصلة وضبط إصدارها على غرار تلك الموجودة في وحدة المكتبة.

لإنشاء وحدة اختبار، يُرجى اتّباع الخطوات التالية:

  1. أنشئ وحدة مكتبة.
  2. في ملف build.gradle على مستوى الوحدة، طبِّق المكوِّن الإضافي com.android.test بدلاً من com.android.library.
  3. انقر على مشروع المزامنة .

بعد إنشاء وحدة الاختبار، يمكنك تضمين رمز الاختبار في مجموعة المصادر الرئيسية أو مجموعة المصادر (على سبيل المثال، src/main/java أو src/variant/java). إذا كانت وحدة التطبيق تحدد نكهات منتجات متعددة، يمكنك إعادة إنشاء هذه النكهات في وحدة الاختبار. باستخدام إدارة التبعية الواعية للمتغيرات، تحاول وحدة الاختبار اختبار النكهة المطابقة في الوحدة المستهدفة.

تحتوي وحدات الاختبار تلقائيًا على صيغة تصحيح الأخطاء واختبارها. ومع ذلك، يمكنك إنشاء أنواع إصدار جديدة لتتناسب مع مشروع التطبيق الذي تم اختباره. لجعل وحدة الاختبار تختبر نوع إصدار مختلف وليس نوع تصحيح الأخطاء، استخدِم VariantFilter لإيقاف صيغة تصحيح الأخطاء في المشروع التجريبي، كما هو موضّح:

رائع

android {
    variantFilter { variant ->
        if (variant.buildType.name.equals('debug')) {
            variant.setIgnore(true);
        }
    }
}

لغة Kotlin

android {
    variantFilter {
        if (buildType.name == "debug") {
            ignore = true
        }
    }
}

إذا كنت تريد أن تستهدف وحدة اختبارية نكهات معيّنة فقط أو تنشئ أنواعًا معيّنة من التطبيق، يمكنك استخدام السمة matchingFallbacks لاستهداف الصِيَغ التي تريد اختبارها فقط. هذا أيضا يمنع وحدة الاختبار من الاضطرار إلى تهيئة هذه المتغيرات لنفسها.