בדיקה במכשירים מרובים

VTS תומך בבדיקות שמחייבות אינטראקציה בין כמה מכשירי Android מכשירים.

ארכיטקטורה

VTS משתמש ב-framework של TradeFed כדי לקבל ולהעביר מספרים סידוריים לצורך בדיקה מודולים.

איור 1. העברת מספרים סידוריים של VTS.

דרישות המכשירים, כמו מספר המכשירים וסוגי המכשירים, שצוינו בהגדרה של תוכנית הבדיקה. לדוגמה, אפשר לציין תוכנית לבדיקה שנדרשים להם שני מכשירי Android עם יעדי build של Sailfish.

הקצאת מכשירים

תשתית הבדיקה (בדרך כלל מתזמן הבדיקות) מקצה זמינות מכשירים שעומדים בדרישות שצוינו בתצורה של תוכנית הבדיקה כדי במסגרת VTS. המכשירים שהוקצו שמורים לתוכנית הבדיקה, גם אם מודול הבדיקה לא משתמש בהם. לאחר מכן, הקבצים הבינאריים של סוכני VTS נדחפים ומפעילים כל המכשירים שהוקצו (אלא אם הוראה ספציפית לא לפעול). כך אפשר להבטיח שחיבורי TCP לפקודות מעטפת וערכי HAL RPC זמינים לכולם מכשירים בסקריפט בדיקה.

מתכוננים למבחנים

תוכנת ה-framework מפעילה הכנה לבדיקה לכל המכשירים שעבורם היא קיבלה של מספרים סידוריים. האנשים שמכינים את היעדים יכולים להיות מוגדרים במכשיר אחד או בכמה מכשירים:

  • מכשירים להכנת יעד למכשיר יחיד (לדוגמה: VtsDeviceInfoCollector):
    • אפשר לציין אותן רק בהגדרה של תוכנית הבדיקה עם רשימת מכשירים (גרסאות עתידיות יאפשרו הגדרה ברמת המודול).
    • אפשר לקבל רק מספר סידורי אחד של המכשיר.
    • אפשר להריץ משימות הכנה וניקוי במכשיר ספציפי.
  • כלים להכנת יעד לכמה מכשירים (לדוגמה: VtsPythonVirtualenvPreparer):
    • אפשר לציין אותן בהגדרה של תוכנית הבדיקה או במודול הבדיקה הגדרה
    • קבלת כל המספרים הסידוריים של המכשירים
    • אפשר להריץ משימות הכנה וניקוי לכל מכשיר או לכל המכשירים.

מודולים לבדיקה

המודולים לבדיקה מקבלים רשימה של מכשירים לאחר סיום ההגדרה של ההכנה לבחינות המארח/המכשירים. מודול בדיקת Python אחד בצד המארח פועל לכל מכשירים מרובים מודול הבדיקה. מכשירי Android שהוקצו נגישים ממודולים לבדיקה של Python לרשימה של AndroidDevice (מכשיר Android) אובייקטים:

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 מבוססת-יעד.

במקרה כזה:

  • לוגיקת הבדיקה מופעלת במכשירים.
  • ה-framework בצד המארח מספק זיהוי מכשיר ראשוני.
  • הקובץ הבינארי לבדיקה בצד היעד מחייב סנכרון:
    • אותו בינארי לבדיקה בכל המכשירים.
    • קבצים בינאריים שונים לבדיקה לכל תפקיד.

דוגמה: תוכנית בדיקה לכמה מכשירים

הדוגמה הזו מציינת הגדרה לשני מכשירים:

  • מכשיר 1 כולל ספק build וגם מכין יעד 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')