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

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

هندسة معمارية

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

الشكل 1. السلاسل التسلسلية للأجهزة التي تجتاز اختبار VTS

متطلبات الأجهزة، مثل عدد الأجهزة وأنواعها: المحدد في تهيئة خطة الاختبار. على سبيل المثال، يمكنك تحديد خطة اختبار يتطلب استخدام جهازَي Android مع أهداف تصميم Sailfish.

تخصيص الجهاز

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

أدوات الاستعداد للاختبار

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

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

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

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

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

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

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

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

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

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

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

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

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

النوع 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 درس تطبيقي حول الترميز.

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')