تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
تتيح لك واجهة برمجة التطبيقات لاختبار الوحدات في Glance اختبار رمز Glance بدون تضخيم طرق العرض أو الحاجة إلى أداة UI Automator. على سبيل المثال، تتيح لك واجهة برمجة التطبيقات لاختبار الوحدات التحقّق من الشروط، مثل ما إذا كانت العناصر في قائمة أو ما إذا تم وضع علامة في المربّعات، وذلك باستخدام أدوات المطابقة مثل hasContentDescriptionEqualTo أو isChecked.
تتميّز واجهة برمجة التطبيقات هذه بأنّها بسيطة ولا تتطلّب الكثير من الإعدادات، ما يتيح لك إجراء عملية تطوير مستندة إلى الاختبار أثناء تطوير أجزاء فردية من تطبيقك المصغّر وتنظيمها لتحسين إعادة استخدام الرموز.
ضبط إعدادات الميزة
يتم عرض العناصر التابعة المطلوبة لاستخدام مكتبة اختبارات الوحدات في الأمثلة التالية:
// Other Glance and Compose runtime dependencies....testImplementation'androidx.glance:glance-testing:1.1.1'testImplementation'androidx.glance:glance-appwidget-testing:1.1.1'testImplementation'org.robolectric:robolectric:4.11.1'...// You may include additional dependencies, such as Robolectric, if your test// needs to set a LocalContext.
بنية الاختبار
نظِّم الدوال القابلة للإنشاء خارج فئة GlanceAppWidget لتفعيل إعادة استخدام الرمز البرمجي واختبار الوحدات. قلِّل من تعقيد الوحدات التي يتم اختبارها قدر الإمكان.
classMyGlanceComposableTest{@TestfunmyNewsItemComposable_largeSize_hasAuthorAsSubtitle()=runGlanceAppWidgetUnitTest{// Prepare inputs and statesetAppWidgetSize(100.dp,100.dp)// Set the composable under testprovideComposable{MyNewsItemComposable(TEST_NEWS_ITEM)}// Perform assertionsonNode(hasTestTag("subTitle")).assertHasText(TEST_NEWS_ITEM.authorName)}}
ضبط السياق والحجم للاختبار
إذا كانت الدالة البرمجية القابلة للإنشاء تقرأ السياق باستخدام طريقة LocalContext.current()، عليك ضبط السياق باستخدام setContext(). وإلّا، تكون هذه الخطوة اختيارية.
يمكنك استخدام أي إطار عمل لاختبار الوحدات على Android يستند إلى آلة جافا الافتراضية (JVM)، مثل Roboletric، لتوفير السياق.
إذا كانت الدالة البرمجية القابلة للإنشاء تصل إلى LocalSize، اضبط الحجم المطلوب للاختبار قبل توفير دالة برمجية قابلة للإنشاء في الاختبار. الحجم التلقائي هو 349 وحدة بكسل غير مرتبطة بالكثافة × 455 وحدة بكسل غير مرتبطة بالكثافة، وهو ما يعادل أداة 5×4 معروضة على جهاز Pixel 4 في الوضع العمودي.
إذا كان AppWidget يستخدم sizeMode == Single، يمكنك ضبط ذلك على minWidth وminHeight في ملف info.xml الخاص بالأداة.
إذا كان AppWidget يستخدم sizeMode == Exact، يمكنك تحديد الأحجام التي تريد اختبارها بطريقة مشابهة لتحديد حجم الأداة وتحديد أحجام الوضع الأفقي والعمودي التي قد تظهر عليها الأداة واختبارها.
إذا كان AppWidget يستخدِم sizeMode == Responsive، يمكنك ضبط هذا الخيار على أحد الأحجام من القائمة التي تقدّمها عند تحديد sizeMode.
المدة التلقائية لانتهاء مهلة الاختبار هي ثانية واحدة، ولكن يمكنك تمرير مدة مخصّصة كمعلَمة إلى الطريقة runGlanceAppWidgetUnitTest إذا كانت البنية الأساسية للاختبار تفرض مهلة مختلفة.
لمزيد من المعلومات وعيّنات التعليمات البرمجية، راجِع المستندات المرجعية الخاصة بـ
runGlanceAppWidgetUnitTest.
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-08-21 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","easyToUnderstand","thumb-up"],["ساعَدني المحتوى في حلّ مشكلتي.","solvedMyProblem","thumb-up"],["غير ذلك","otherUp","thumb-up"]],[["لا يحتوي على المعلومات التي أحتاج إليها.","missingTheInformationINeed","thumb-down"],["الخطوات معقدة للغاية / كثيرة جدًا.","tooComplicatedTooManySteps","thumb-down"],["المحتوى قديم.","outOfDate","thumb-down"],["ثمة مشكلة في الترجمة.","translationIssue","thumb-down"],["مشكلة في العيّنات / التعليمات البرمجية","samplesCodeIssue","thumb-down"],["غير ذلك","otherDown","thumb-down"]],["تاريخ التعديل الأخير: 2025-08-21 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],null,["# Unit testing with Glance\n\nThe Glance unit test API let you test your Glance code without inflating views\nor needing a UI automator. For example, the unit test API lets you verify\nconditions, such as whether elements are in a list or whether boxes have been\nchecked, using matchers such as `hasContentDescriptionEqualTo` or `isChecked`.\n\nThis API is lightweight and requires less setup, so you can perform test driven\ndevelopment as you develop individual pieces of your widget and organize them to\nimprove code reuse.\n| **Note:** The test doesn't render the composables under test, so it doesn't let you perform clicks. Instead, it uses matchers, which let you perform assertions on actions in clickables such as starting a service or activity.\n\nSetup\n-----\n\nThe dependencies required to use the unit test library are shown in the\nfollowing examples: \n\n // Other Glance and Compose runtime dependencies.\n ...\n testImplementation 'androidx.glance:glance-testing:1.1.1'\n testImplementation 'androidx.glance:glance-appwidget-testing:1.1.1'\n testImplementation 'org.robolectric:robolectric:4.11.1'\n ...\n // You may include additional dependencies, such as Robolectric, if your test\n // needs to set a LocalContext.\n\nTest structure\n--------------\n\nOrganize composable functions outside of the `GlanceAppWidget` class to enable\ncode reuse and unit testing. Reduce the complexity of your units under test as\nmuch as possible. \n\n class MyGlanceComposableTest {\n @Test\n fun myNewsItemComposable_largeSize_hasAuthorAsSubtitle() = runGlanceAppWidgetUnitTest {\n // Prepare inputs and state\n setAppWidgetSize(100.dp, 100.dp)\n\n // Set the composable under test\n provideComposable {\n MyNewsItemComposable(TEST_NEWS_ITEM)\n }\n\n // Perform assertions\n onNode(hasTestTag(\"subTitle\"))\n .assertHasText(TEST_NEWS_ITEM.authorName)\n }\n }\n\nSet context and size for the test\n---------------------------------\n\nIf your composable function reads context using the `LocalContext.current()`\nmethod, you must set a context using `setContext()`. Otherwise, this step is\noptional.\n\nYou can use any JVM-based Android unit testing framework, such as Roboletric, to\nprovide the context.\n\nIf your composable function accesses `LocalSize`, set the intended size\nfor the test before providing a composable in the test. The default size is\n349.dp x 455.dp, which is equivalent to a 5x4 widget shown on a Pixel 4 device\nin portrait mode.\n\n- If your AppWidget uses `sizeMode == Single`, you can set this to the `minWidth` and `minHeight` in your widget's `info.xml` file.\n- If your AppWidget uses `sizeMode == Exact`, you can identify the sizes to test in a similar way to how you [determine a size for your widget](/develop/ui/views/appwidgets/layouts#anatomy_determining_size) and identify landscape and portrait sizes that your widget may appear on and test for them.\n- If your AppWidget uses `sizeMode == Responsive`, you can set this to one of the sizes from the list that you provide when specifying the `sizeMode`.\n\nThe default duration for a test timeout is 1 second, but you can pass a custom\nduration as an argument to the `runGlanceAppWidgetUnitTest` method if your test\ninfrastructure enforces a different timeout.\n\nFor more information and code samples, see the reference documentation for\n[`runGlanceAppWidgetUnitTest`](/reference/kotlin/androidx/glance/appwidget/testing/unit/package-summary#runGlanceAppWidgetUnitTest(kotlin.time.Duration,kotlin.Function1))."]]