تست چند دستگاهی

VTS از تست هایی پشتیبانی می کند که نیاز به تعامل بین چندین دستگاه اندرویدی دارند.

معماری

VTS از چارچوب TradeFed برای دریافت و ارسال سریال های دستگاه برای آزمایش ماژول ها استفاده می کند.

شکل 1. سریال های دستگاه عبور VTS.

الزامات دستگاه، مانند تعداد دستگاه ها و انواع دستگاه، در پیکربندی طرح آزمایشی مشخص شده است. به عنوان مثال، می توانید یک برنامه آزمایشی را مشخص کنید که به دو دستگاه اندرویدی با اهداف ساخت Sailfish نیاز دارد.

تخصیص دستگاه

زیرساخت تست (معمولاً زمان‌بندی تست) دستگاه‌های موجود را که الزامات مشخص‌شده در پیکربندی طرح آزمایشی را برآورده می‌کنند به چارچوب VTS اختصاص می‌دهد. دستگاه های اختصاص داده شده برای طرح تست رزرو می شوند حتی اگر ماژول تست از آنها استفاده نکند. باینری‌های عامل VTS سپس به همه دستگاه‌های اختصاص‌یافته فشار داده می‌شوند و روی آن‌ها اجرا می‌شوند (مگر اینکه به‌طور خاص دستور داده نشده است که اجرا نشوند). این تضمین می کند که اتصالات TCP برای دستورات پوسته و HAL RPC برای همه دستگاه ها در یک اسکریپت آزمایشی در دسترس هستند.

آماده کنندگان آزمون

این فریم ورک آماده‌کننده‌های آزمایشی را برای همه دستگاه‌هایی که شماره سریال دریافت کرده است اجرا می‌کند. آماده‌کننده‌های هدف می‌توانند تک یا چند دستگاهی باشند:

  • آماده‌کننده‌های هدف تک‌دستگاهی (مثال در VtsDeviceInfoCollector ):
    • را می توان فقط در پیکربندی طرح آزمایشی با لیست دستگاه مورد نیاز مشخص کرد (نسخه های آینده پیکربندی سطح ماژول را امکان پذیر می کند).
    • فقط یک سریال دستگاه دریافت کنید.
    • کارهای آماده سازی و پاکسازی را در برابر یک دستگاه خاص اجرا کنید.
  • آماده‌کننده‌های هدف چند دستگاهی (به عنوان مثال در VtsPythonVirtualenvPreparer ):
    • را می توان در پیکربندی طرح آزمایشی یا پیکربندی ماژول تست مشخص کرد
    • دریافت تمام سریال های دستگاه
    • کارهای آماده سازی و پاکسازی را برای هر دستگاه یا همه دستگاه ها اجرا کنید.

ماژول های تست

ماژول‌های آزمایشی پس از پایان راه‌اندازی میزبان/دستگاه‌های آماده‌کننده آزمون، فهرستی از دستگاه‌ها را دریافت می‌کنند. یک ماژول تست پایتون سمت میزبان برای هر ماژول تست چند دستگاهی اجرا می شود. دستگاه‌های Android اختصاص‌یافته از ماژول‌های تست پایتون به‌عنوان فهرستی از اشیاء AndroidDevice قابل دسترسی هستند:

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

همه دستگاه‌های اختصاص‌یافته برای طرح آزمایشی رزرو شده‌اند، حتی اگر یک ماژول آزمایشی در طرح فقط از یک دستگاه استفاده می‌کند.

ارتباط دستگاه در حین آزمایش

تست های موثر چند اندرویدی شامل ارتباط بین دستگاه های اختصاص داده شده است. هنگام توسعه چنین آزمایشاتی، باید نحوه برقراری ارتباط بین دستگاه های اختصاص داده شده را تعیین کنید. بخش‌های زیر سه مثال ارتباطی ارائه می‌کنند (با این حال، توسعه‌دهندگان آزمایشی در طراحی مدل‌های دیگر آزاد هستند).

نوع 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>

مثال: اسکریپت تست پایتون سمت میزبان

برای جزئیات و مثال‌هایی درباره آماده‌کننده‌های آزمون، آماده‌کننده‌های آزمون را ببینید. برای مثال کامل چند دستگاه سمت میزبان، به 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')