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

VTS תומך בבדיקות הדורשות אינטראקציה בין מספר מכשירי אנדרואיד.

ארכיטקטורה

VTS משתמש במסגרת TradeFed כדי לקבל ולהעביר סדרות מכשירים למודולי בדיקה.

איור 1. סדרת מכשירי העברת VTS.

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

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

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

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

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

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

מודולי בדיקה

מודולי בדיקה מקבלים רשימת מכשירים לאחר שמכיני הבדיקה מסיימים את הגדרת המארח / המכשירים. מודול בדיקת פייתון אחד בצד המארח פועל עבור כל מודול בדיקה מרובה התקנים. ניתן לגשת למכשירי אנדרואיד המוקצים ממודולי בדיקת Python כרשימה של אובייקטים של 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 יעד 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 .

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