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

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

ארכיטקטורה

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

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

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

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

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

מכיני מבחנים

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

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

מבחן מודולים

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

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

כל המכשירים שהוקצו שמורים לתוכנית הבדיקה, למרות שמודול בדיקה בתוכנית משתמש רק במכשיר אחד.

תקשורת מכשיר במהלך הבדיקה

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

סוג 1: בדיקות HAL בצד המארח

בדיקות HAL בצד המארח יכולות להשתמש בדרייברים של VTS HAL שנדחפים למכשירים כברירת מחדל:

איור 2. בדיקת HAL בצד המארח.

בתרחיש הזה:

  • לוגיקה של בדיקה מופעלת על המארח.
  • סקריפט בדיקה בצד המארח מנפיק קריאות RPC למנהלי ההתקן בכל מכשיר.
  • צד המארח מתאם את האינטראקציות של המכשיר.

סוג 2: בדיקות מבוססות סוכנים בצד המארח

במקום להשתמש בסוכני VTS במכשיר, בדיקה בצד המארח יכולה גם לדחוף סוכן משלו (אפליקציה או בינארי) לכל מכשיר:

איור 3. בדיקה מבוססת סוכן בצד המארח.

בתרחיש הזה:

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

לדוגמה, מבחני Next Billion User ב-VTS repo הנוכחי הם מבחני צד מארח, מבוססי אפליקציה, מרובי מכשירים.

סוג 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')