كتابة اختبار موجَّه من المضيف في Trade Federation

توضّح هذه الصفحة كيفية كتابة اختبار جهاز على غرار JUnit4 يُجريه المضيف. وهذا يعني أنّ جانب المضيف من الحزام سيؤدي إلى تنفيذ إجراءات ضد الجهاز.

يُرجى العِلم أنّنا نعتبر أنّ الاختبارات "من جهة المضيف" والاختبارات "المدفوعة من المضيف" متماثلة قليلاً:

  • الاختبار المستنِد إلى المضيف: هو اختبار يتم تشغيله على المضيف الذي يتفاعل مع جهاز واحد أو أكثر. لا يكون النظام الذي يتم اختباره (SUT) على المضيف نفسه، ولكن يتم اختباره من المضيف.
  • الاختبار من جهة المضيف: هو اختبار يتم تنفيذه على المضيف فقط واختبار ملف شخصي على المضيف فقط، مثل اختبارات الوحدة.

لماذا يجب إنشاء اختبار موجَّه من المضيف بدلاً من اختبار أداة القياس؟

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

يمكن أن تؤدي الاختبارات المستندة إلى المضيف أيضًا إلى خطوات إعداد إضافية تتطلّب التفاعل مع الأجهزة الخارجية التي يعتمد عليها الاختبار.

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

كيف يتم كتابة الاختبارات المستندة إلى المضيف في TF؟

في ما يلي مثال:

@RunWith(DeviceJUnit4ClassRunner.class)
public class SampleHostJUnit4DeviceTest extends BaseHostJUnit4Test {
    @Before
    public void setUp() throws Exception {
       // Some setup
    }

    @Test
    public void testCheckWeHaveDevice() throws Exception {
        Assert.assertNotNull(getDevice());
    }
}

يتم تشغيل الاختبارات المستندة إلى المضيف في Trade Federation بواسطة أداة تشغيل اختبار JUnit4‏ DeviceJUnit4ClassRunner. البنية العامة لفئة الاختبار هي نفسها بنية اختبار JUnit4 العادي:

  • @BeforeClass
  • @Before
  • @Test
  • @After
  • @AfterClass
  • "Assume" و"Assert"

إنّ توسيع نطاق BaseHostJunit4Test هو طريقة اكتساب واجهة برمجة تطبيقات مفيدة لأدوات الاختبار، مثل:

  • installPackage: يسمح بتثبيت حزمة APK على الجهاز المستهدَف.
  • installPackageAsUser: يسمح بتثبيت حزمة APK بصفتك مستخدمًا على الجهاز المستهدف.
  • uninstallPackage: يسمح بإلغاء تثبيت حزمة APK.
  • isPackageInstalled: التحقّق مما إذا كانت الحزمة مثبّتة أم لا
  • hasDeviceFeature: التحقّق مما إذا كان الجهاز متوافقًا مع ميزة معيّنة أم لا (pm list features)
  • runDeviceTests(DeviceTestRunOptions options): يمكنك إجراء اختبار instrumentation على جهاز مستهدَف باستخدام DeviceTestRunOptions للتعامل مع جميع الخيارات الممكنة.

عليك أيضًا توفير إذن الوصول إلى عنصر جهاز Tradefed:

  • getDevice(): تعرِض هذه الدالة عنصر جهاز TF للتلاعب بالجهاز.
  • getBuild(): عرض عنصر TF لمعلومات الإصدار للحصول على معلومات عن الإصدار
  • getAbi(): عرض معرّف ABI الذي يتم تشغيل الاختبار عليه

دعم Tradefed: إعداد الأجهزة وتنظيفها حسب الفئة

لا ينطبق @BeforeClass و@AfterClass في JUnit4 إلا على الطرق الثابتة، ما يجعل من المستحيل استخدام معالِج #getDevice() لإجراء بعض عمليات الإعداد أو التنظيف لكل فئة أو لمرة واحدة خاصة بالجهاز. لحلّ هذه المشكلة، استخدِم التعليق التوضيحي Tradefed.

  • ‫@BeforeClassWithInfo: يتم تنفيذها قبل التعليقات التوضيحية @BeforeClass
  • ‫@AfterClassWithInfo: يتم تنفيذها بعد التعليقات التوضيحية @AfterClass
   @BeforeClassWithInfo
   public static void beforeClassWithDevice(TestInformation testInfo) {
       assertNotNull(testInfo.getDevice());
       testInfo.properties().put("mytest:test-prop", "test");
   }

   @AfterClassWithInfo
   public static void afterClassWithDevice(TestInformation testInfo) {
       assertNotNull(testInfo.getDevice());
       testInfo.properties().put("mytest:test-prop", "test");
   }

تسمح لك السمة TestInformation باستخدام سمات الجهاز والمتجر التي يمكن استخدامها في النطاق الثابت أو غير الثابت. تتيح BaseHostJUnit4Test الحصول على TestInformation في نطاق غير ثابت من خلال #getTestInformation().

إذا لم تكن بصدد توسيع BaseHostJUnit4Test، يمكنك تنفيذ ITestInformationReceiver لتلقّي عنصر TestInformation.

كيف يمكن إعداد اختبار موجَّه من المضيف في Tradefed؟

في ملف إعداد XML الخاص بـ Tradefed، يتم تنفيذ الاختبارات المستندة إلى المضيف من خلال أداة تنفيذ HostTest.

<test class="com.android.tradefed.testtype.HostTest" >
    <option name="class" value="android.sample.cts.SampleHostJUnit4DeviceTest" />
</test>