اختبار متعدد الأجهزة

يدعم VTS الاختبارات التي تتطلب التفاعل بين أجهزة Android المتعددة.

بنيان

يستخدم VTS إطار عمل TradeFed للحصول على المسلسلات الخاصة بالجهاز وتمريرها لاختبار الوحدات.

الشكل 1. VTS تمرير المسلسلات الجهاز.

يتم تحديد متطلبات الجهاز، مثل عدد الأجهزة وأنواع الأجهزة، في تكوين خطة الاختبار. على سبيل المثال، يمكنك تحديد خطة اختبار تتطلب جهازين يعملان بنظام Android مع أهداف إنشاء Sailfish.

تخصيص الجهاز

تقوم البنية التحتية للاختبار (عادةً ما تكون جدولة الاختبار) بتخصيص الأجهزة المتاحة التي تلبي المتطلبات المحددة في تكوين خطة الاختبار لإطار عمل VTS. يتم حجز الأجهزة المخصصة لخطة الاختبار حتى لو كانت وحدة الاختبار لا تستخدمها. يتم بعد ذلك دفع ثنائيات وكيل VTS إلى كافة الأجهزة المخصصة وتشغيلها (ما لم يُطلب منك تحديدًا عدم التشغيل). وهذا يضمن أن اتصالات TCP لأوامر shell وHAL RPCs متاحة لجميع الأجهزة في برنامج نصي للاختبار.

المجهزون للاختبار

يقوم الإطار بتشغيل مُعدي الاختبار لجميع الأجهزة التي حصل على أرقام تسلسلية لها. يمكن أن تكون أدوات إعداد الأهداف فردية أو متعددة الأجهزة:

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

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

تحصل وحدات الاختبار على قائمة بالأجهزة بعد أن ينتهي معدو الاختبار من إعداد المضيف/الأجهزة. يتم تشغيل وحدة اختبار Python واحدة من جانب المضيف لكل وحدة اختبار متعددة الأجهزة. يمكن الوصول إلى أجهزة Android المخصصة من خلال وحدات اختبار Python كقائمة بكائنات AndroidDevice :

devices = self.android_devices
device1 = devices[0]
device1_serial = device1.serial

يتم حجز جميع الأجهزة المخصصة لخطة الاختبار، على الرغم من أن وحدة الاختبار في الخطة تستخدم جهازًا واحدًا فقط.

اتصالات الجهاز أثناء الاختبار

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

النوع 1: اختبارات HAL من جانب المضيف

يمكن أن تستخدم اختبارات HAL من جانب المضيف برامج تشغيل VTS HAL التي يتم دفعها إلى الأجهزة بشكل افتراضي:

الشكل 2. اختبار HAL من جانب المضيف.

في هذا السيناريو:

  • يتم تنفيذ منطق الاختبار على المضيف.
  • يُصدر البرنامج النصي للاختبار من جانب المضيف مكالمات RPC إلى برامج التشغيل على كل جهاز.
  • ينسق الجانب المضيف تفاعلات الجهاز.

النوع 2: الاختبارات المستندة إلى الوكيل من جانب المضيف

بدلاً من استخدام وكلاء VTS على الجهاز، يمكن للاختبار من جانب المضيف أيضًا دفع الوكيل الخاص به (التطبيق أو البرنامج الثنائي) إلى كل جهاز:

الشكل 3. الجانب المضيف، الاختبار القائم على الوكيل.

في هذا السيناريو:

  • يتم تنفيذ منطق الاختبار على المضيف.
  • يتم تثبيت تطبيق الوكيل (أو الثنائي) على كل جهاز.
  • يُصدر البرنامج النصي للاختبار من جانب المضيف أوامر للتطبيقات الموجودة على كل جهاز.
  • ينسق الجانب المضيف تفاعلات الجهاز.

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

النوع 3: اختبارات HIDL من جانب الهدف

تضع اختبارات HIDL متعددة الأجهزة من جانب الهدف كل منطق الاختبار على ثنائيات الاختبار من جانب الجهاز، الأمر الذي يتطلب من الاختبارات مزامنة الأجهزة أثناء تنفيذ الاختبار:

الشكل 4. اختبار HIDL القائم على الهدف.

في هذا السيناريو:

  • يتم تنفيذ منطق الاختبار على الأجهزة.
  • يوفر إطار عمل جانب المضيف تعريفًا أوليًا للجهاز.
  • يتطلب الاختبار الثنائي من جانب الهدف المزامنة:
    • نفس الاختبار الثنائي لجميع الأجهزة.
    • ثنائيات اختبار مختلفة لكل دور.

مثال: خطة اختبار متعددة الأجهزة

يحدد هذا المثال التكوين لجهازين:

  • يتضمن الجهاز 1 موفر البنية ومُعد الهدف VtsDeviceInfoCollector .
  • يشتمل الجهاز 2 على مُعد FilePusher إضافي يقوم بدفع مجموعة من الملفات ذات الصلة التي يحركها المضيف إلى الجهاز.
<configuration description="VTS Codelab Plan">
  ...
<device name="device1">
<build_provider class="com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider" />
<target_preparer class="com.android.tradefed.targetprep.VtsDeviceInfoCollector" />
</device>
<device name="device2" >
<build_provider class="com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider" />
<target_preparer class="com.android.tradefed.targetprep.VtsDeviceInfoCollector" />
<target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsFilePusher">
<option name="push-group" value="HostDrivenTest.push" />
</target_preparer>
</device>
<option name="compatibility:include-filter" value="VtsCodelabHelloWorldMultiDeviceTest" />
</configuration>

مثال: البرنامج النصي لاختبار Python من جانب المضيف

للحصول على تفاصيل وأمثلة عن مُعدي الاختبار، راجع مُعدو الاختبار . للحصول على مثال كامل للأجهزة المتعددة من جانب المضيف، راجع hello_world_multi codelab .

def setUpClass(self):
logging.info('number of device: %s', self.android_devices)
asserts.assertEqual(len(self.android_devices), 2, 'number of device is wrong.')
self.dut1 = self.android_devices[0]
self.dut2 = self.android_devices[1]
self.shell1 = self.dut1.shell
self.shell2 = self.dut2.shell

def testSerialNotEqual(self):
'''Checks serial number from two device not being equal.'''
command = 'getprop | grep ro.serial'
res1 = self.shell1.Execute(command)
res2 = self.shell2.Execute(command)

def getSerialFromShellOutput(output):
'''Get serial from getprop query'''
return output[const.STDOUT][0].strip().split(' ')[-1][1:-1]
serial1 = getSerialFromShellOutput(res1)
serial2 = getSerialFromShellOutput(res2)

logging.info('Serial number of device 1 shell output: %s', serial1)
logging.info('Serial number of device 2 shell output: %s', serial2)
asserts.assertNotEqual(serial1, serial2, 'serials from two devices should not be the same')
asserts.assertEqual(serial1, self.dut1.serial, 'serial got from device system property is different from allocated serial')
asserts.assertEqual(serial2, self.dut2.serial, 'serial got from device system property is different from allocated serial')