فئة AndroidJUnitRunner
هي أداة لتشغيل اختبارات JUnit، وتتيح لك
إجراء اختبارات JUnit 4 مزوّدة بأدوات قياس الأداء على أجهزة Android،
بما في ذلك الاختبارات التي تستخدم إطارات عمل اختبار Espresso وUI Automator وCompose.
يُجري مشغّل الاختبار عملية تحميل حزمة الاختبار والتطبيق الذي يتم اختباره على أحد الأجهزة، وتشغيل اختباراتك، وإعداد تقارير عن نتائج الاختبار.
يتيح مشغّل الاختبار هذا تنفيذ العديد من مهام الاختبار الشائعة، بما في ذلك ما يلي:
كتابة اختبارات JUnit
يوضِّح المقتطف التالي من الرمز البرمجي كيفية كتابة اختبار JUnit 4
مزوَّد بأدوات للتحقّق من أنّ عملية changeText
في فئة ChangeTextBehavior
تعمل بشكل صحيح:
Kotlin
@RunWith(AndroidJUnit4::class) @LargeTest // Optional runner annotation class ChangeTextBehaviorTest { val stringToBeTyped = "Espresso" // ActivityTestRule accesses context through the runner @get:Rule val activityRule = ActivityTestRule(MainActivity::class.java) @Test fun changeText_sameActivity() { // Type text and then press the button. onView(withId(R.id.editTextUserInput)) .perform(typeText(stringToBeTyped), closeSoftKeyboard()) onView(withId(R.id.changeTextBt)).perform(click()) // Check that the text was changed. onView(withId(R.id.textToBeChanged)) .check(matches(withText(stringToBeTyped))) } }
Java
@RunWith(AndroidJUnit4.class) @LargeTest // Optional runner annotation public class ChangeTextBehaviorTest { private static final String stringToBeTyped = "Espresso"; @Rule public ActivityTestRule<MainActivity>; activityRule = new ActivityTestRule<>;(MainActivity.class); @Test public void changeText_sameActivity() { // Type text and then press the button. onView(withId(R.id.editTextUserInput)) .perform(typeText(stringToBeTyped), closeSoftKeyboard()); onView(withId(R.id.changeTextBt)).perform(click()); // Check that the text was changed. onView(withId(R.id.textToBeChanged)) .check(matches(withText(stringToBeTyped))); } }
الوصول إلى سياق التطبيق
عند استخدام AndroidJUnitRunner
لتشغيل اختباراتك، يمكنك الوصول إلى السياق
للتطبيق الذي يتم اختباره من خلال استدعاء الأسلوب الثابت
ApplicationProvider.getApplicationContext()
. إذا أنشأت فئة فرعية مخصّصة
لنوع Application
في تطبيقك، تُرجع هذه الطريقة سياق الفئة الفرعية المخصّصة.
إذا كنت من منفّذِي الأدوات، يمكنك الوصول إلى واجهات برمجة تطبيقات الاختبار من المستوى الأدنى باستخدام فئة
InstrumentationRegistry
. تتضمّن هذه الفئة عنصر
Instrumentation
وعنصر التطبيق المستهدَف Context
وعنصر
التطبيق Context
للاختبار ووسيطات سطر الأوامر التي تم تمريرها إلى اختبارك.
اختبارات الفلاتر
في اختبارات JUnit 4.x، يمكنك استخدام التعليقات التوضيحية لضبط عملية إجراء الاختبار. تعمل هذه الميزة على الحدّ من الحاجة إلى إضافة النصوص النموذجية والرموز البرمجية الشَرطية في اختباراتك. بالإضافة إلى التعليقات التوضيحية العادية التي يتوافق معها JUnit 4، يتيح أداة بدء الاختبار أيضًا استخدام التعليقات التوضيحية الخاصة بنظام التشغيل Android، بما في ذلك التعليقات التالية:
-
@RequiresDevice
: تُحدِّد هذه السمة أنّه يجب تنفيذ الاختبار على الأجهزة الحقيقية فقط، وليس على المحاكيات. -
@SdkSuppress
: يمنع الاختبار من التشغيل على مستوى واجهة برمجة التطبيقات أدنى من المستوى المحدَّد. على سبيل المثال، لإيقاف تشغيل الاختبارات على جميع مستويات واجهة برمجة التطبيقات التي تقل عن 23، استخدِم التعليق التوضيحي@SDKSuppress(minSdkVersion=23)
. -
@SmallTest
و@MediumTest
و@LargeTest
: يمكنك تصنيف المدة التي يجب أن يستغرقها تنفيذ الاختبار، وبالتالي عدد المرات التي يمكنك فيها تنفيذ الاختبار. يمكنك استخدام هذا التعليق التوضيحي لفلترة الاختبارات التي تريد إجراؤها، من خلال ضبط السمةandroid.testInstrumentationRunnerArguments.size
:
-Pandroid.testInstrumentationRunnerArguments.size=small
اختبارات الشرائح
إذا كنت بحاجة إلى إجراء اختباراتك بشكل موازٍ، ونشرها على
خوادم متعددة لتشغيلها بشكل أسرع، يمكنك تقسيمها إلى مجموعات أو
شرائح. يتيح أداة تشغيل الاختبار تقسيم حزمة اختبار واحدة إلى عدة
شرائح، ما يتيح لك بسهولة تشغيل الاختبارات التي تنتمي إلى الشريحة نفسها معًا كأحد
المجموعات. يتم تحديد كل شريحة برقم فهرس. عند إجراء الاختبارات، استخدِم الخيار
-e numShards
لتحديد عدد الشرائح المنفصلة التي تريد إنشاؤها والخيار
-e shardIndex
لتحديد الشريحة التي تريد تشغيلها.
على سبيل المثال، لتقسيم مجموعة الاختبار إلى 10 أجزاء وتشغيل الاختبارات فقط المجمَّعة في الجزء الثاني، استخدِم أمر adb التالي:
adb shell am instrument -w -e numShards 10 -e shardIndex 2
استخدام "منسّق الاختبارات من Android"
يتيح لك "منظِّم اختبارات Android" تنفيذ كل اختبار من اختبارات تطبيقك ضمن
استدعاء Instrumentation
الخاص به. عند استخدام الإصدار 1.0
من AndroidJUnitRunner أو إصدار أحدث، يمكنك الوصول إلى أداة Android Test Orchestrator.
يوفّر "منسّق اختبارات Android" المزايا التالية لبيئة الاختبار:
- الحد الأدنى من الحالة المشتركة: يتم تشغيل كل اختبار في مثيل
Instrumentation
خاص به. لذلك، إذا كانت اختباراتك تشارك حالة التطبيق، تتم إزالة معظم هذه الحالة المشترَكة من وحدة المعالجة المركزية أو الذاكرة في جهازك بعد كل اختبار. لإزالة كل الحالة المشتركة من وحدة المعالجة المركزية (CPU) والذاكرة في جهازك بعد كل اختبار، استخدِم العلامةclearPackageData
. اطّلِع على قسم تفعيل من Gradle للاطّلاع على مثال. - العطل معزول: حتى إذا تعطّل اختبار واحد، لن يؤدي ذلك إلا إلى إيقاف
مثيل
Instrumentation
الخاص به. وهذا يعني أنّ الاختبارات الأخرى في مجموعة الاختبار ستظلّ جارية، ما يقدّم نتائج اختبار كاملة.
يؤدي هذا العزل إلى زيادة محتملة في وقت تنفيذ الاختبار لأنّ أداة Android Test Orchestrator تعيد تشغيل التطبيق بعد كل اختبار.
يتضمّن كلّ من "استوديو Android" و"مركز الاختبار الافتراضي من Firebase" أداة Android Test Orchestrator مُثبَّتة مسبقًا، ولكن عليك تفعيل الميزة في "استوديو Android".
تفعيل الميزة من Gradle
لتفعيل أداة "منسّق الاختبارات من Android" باستخدام أداة سطر أوامر Gradle، أكمِل الخطوات التالية:
- الخطوة 1: عدِّل ملف gradle. أضِف العبارات التالية إلىملف
build.gradle
في مشروعك:
android {
defaultConfig {
...
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
// The following argument makes the Android Test Orchestrator run its
// "pm clear" command after each test invocation. This command ensures
// that the app's state is completely cleared between tests.
testInstrumentationRunnerArguments clearPackageData: 'true'
}
testOptions {
execution 'ANDROIDX_TEST_ORCHESTRATOR'
}
}
dependencies {
androidTestImplementation 'androidx.test:runner:1.1.0'
androidTestUtil 'androidx.test:orchestrator:1.1.0'
}
- الخطوة 2: تشغيل "منسّق اختبارات Android" من خلال تنفيذ الأمر التالي:
./gradlew connectedCheck
التفعيل من "استوديو Android"
لتفعيل أداة "تنسيق اختبارات Android" في "استوديو Android"، أضِف العبارات المعروضة في تفعيل من Gradle إلى ملف build.gradle
في تطبيقك.
التفعيل من سطر الأوامر
لاستخدام أداة Android Test Orchestrator في سطر الأوامر، نفِّذ الأوامر التالية في نافذة وحدة طرفية:
DEVICE_API_LEVEL=$(adb shell getprop ro.build.version.sdk)
FORCE_QUERYABLE_OPTION=""
if [[ $DEVICE_API_LEVEL -ge 30 ]]; then
FORCE_QUERYABLE_OPTION="--force-queryable"
fi
# uninstall old versions
adb uninstall androidx.test.services
adb uninstall androidx.test.orchestrator
# Install the test orchestrator.
adb install $FORCE_QUERYABLE_OPTION -r path/to/m2repository/androidx/test/orchestrator/1.4.2/orchestrator-1.4.2.apk
# Install test services.
adb install $FORCE_QUERYABLE_OPTION -r path/to/m2repository/androidx/test/services/test-services/1.4.2/test-services-1.4.2.apk
# Replace "com.example.test" with the name of the package containing your tests.
# Add "-e clearPackageData true" to clear your app's data in between runs.
adb shell 'CLASSPATH=$(pm path androidx.test.services) app_process / \
androidx.test.services.shellexecutor.ShellMain am instrument -w -e \
targetInstrumentation com.example.test/androidx.test.runner.AndroidJUnitRunner \
androidx.test.orchestrator/.AndroidTestOrchestrator'
كما تُظهر بنية الأمر، عليك تثبيت أداة Android Test Orchestrator، ثم استخدامها مباشرةً.
adb shell pm list instrumentation
استخدام سلاسل أدوات مختلفة
إذا كنت تستخدِم سلسلة أدوات مختلفة لاختبار تطبيقك، سيظل بإمكانك استخدام أداة Android Test Orchestrator من خلال إكمال الخطوات التالية:
- أدرِج الحِزم اللازمة في ملف إنشاء تطبيقك.
- فعِّل أداة "منسق الاختبارات من Android" من سطر الأوامر.
هندسة معمارية
يتم تخزين حزمة APK لخدمة "منظِّم عمليات الاختبار" في عملية منفصلة عن حزمة APK الاختبارية وحزمة APK للتطبيق الذي يخضع للاختبار:
يجمع أداة "تنسيق اختبارات Android" اختبارات JUnit في بداية تنفيذ ملف اختبار
Instrumentation
، ولكنّها تنفّذ بعد ذلك كل اختبار بشكل منفصل في مثيل خاص به من
Instrumentation
.
مزيد من المعلومات
للتعرّف على مزيد من المعلومات عن استخدام AndroidJUnitRunner، اطّلِع على مرجع واجهة برمجة التطبيقات.
مصادر إضافية
لمزيد من المعلومات حول استخدام AndroidJUnitRunner
، يُرجى الاطّلاع على المراجع التالية.
نماذج
- AndroidJunitRunnerSample: يعرض التعليقات التوضيحية للاختبارات، والاختبارات المُعرَّفة بالمَعلمات، وإنشاء حزمة اختبار.