הרצת בדיקות במספר מכשירים

בדף הזה מוסבר איך להשתמש ב-Trade Federation Test Harness עם כמה מכשירים במהלך הבדיקה.קודם כדאי להכיר את השימוש הרגיל כפי שמתואר בדוגמה מקצה לקצה.

מה ההבדל בין מכשירים שונים?

יש כמה הבדלים בהגדרה ובהרצה של בדיקות במספר מכשירים ב-Trade Federation, במיוחד:

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

<! -- TODO: הבהר את המשפט שלמעלה על ידי הוספת דוגמה לתרחיש לדוגמה של מכשיר אחד, כי הוא קשור למצב ריבוי מכשירים במשפט שני. -->>

הגדרות אישיות של כמה מכשירים

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

<configuration description="A simple multi-devices example in Tradefed">

    <device name="device1">
        <target_preparer class="com.android.tradefed.targetprep.DeviceSetup" />
    </device>

    <device name="device2">
        <target_preparer class="com.android.tradefed.targetprep.DeviceSetup" />
    </device>

    <option name="log-level" value="verbose" />
    <test class="com.android.tradefed.HelloWorldMultiDevices" />

    <logger class="com.android.tradefed.log.FileLogger" />
    <result_reporter class="com.android.tradefed.result.ConsoleResultReporter" />

</configuration>

יש לציין כמה דברים לגבי המבנה:

  • צפוי <device> לכל מכשיר שיהיה צורך.
  • אם צריך, צריך לכלול את התגים <build_provider>, ‏<target_preparer>, ‏<device_recovery>, ‏<device_requirements> ו-<device_options> בתג <device>. אחרת, תופיע חריגה.
  • המאפיין name של <device> הוא חובה וצריך להיות ייחודי לכל המכשירים שמופיעים בהגדרה. הוא משמש להתייחסות למכשיר הספציפי שמשויך אליו. כך תוכלו לטרגט את הבדיקה למכשיר מסוים.
  • ל-<option> יכול להיות היקף גלובלי כשהוא נמצא ברמה הבסיסית של ההגדרה, או היקף מוגבל למכשיר כשהוא מצוין בתוך התג <device>.

כל שאר הכללים שחלים על הגדרה במכשיר יחיד עדיין רלוונטיים כאן. לפרטים נוספים, ראו דוגמה של Hello World.

עדכון שורת הפקודה

כשמציינים אפשרויות בשורת הפקודה של TF, אפשר גם לציין היקף מכשיר באמצעות {<device name>}, כאשר <device name> הוא השם שצוין בתצורת ה-XML.

בדוגמה שלמעלה, האפשרויות הבאות הורשו:

  • --com.android.tradefed.targetprep.DeviceSetup:disable
  • --device-setup:disable

אפשר לטרגט רק לאחד מהאובייקטים build_provider של המכשיר באמצעות שם המכשיר, כך:

--{device2}device-setup:disable

בדוגמה הזו, device2 מדלג על הגדרת המכשיר, בעוד ש-device1 לא.

איך TF בוחרת את המכשירים?

Trade Federation מחפש מכשיר שתואם ל-device_requirements (בדרך כלל סוג המכשיר, המוצר וכו') לפי סדר הופעתו בהגדרות. בכל פעם שמוקצה מכשיר, TF מנסה להקצות את המכשיר הבא. אם לא ניתן להקצות את כל המכשירים, כולם ישוחררו והפקודה תבוצע מחדש כשכל המכשירים יתואמו.

איך TF מכין את המכשירים?

שלב ההכנה למכשירים מרובים דומה בעיקר לשלב ההכנה למכשיר יחיד. כל מכשיר מוכן על ידי קריאה ל-<target_preparer> לפי סדר ההופעה ב-<device>.

אפשר גם להשתמש ב-<multi_target_preparer> שצוין ברמה הבסיסית של ההגדרה, כדי להפעיל שלבי הכנה שדורשים כמה מכשירים, כמו התאמת מכשירים. היא פועלת אחרי השלב target_preparer.

אפשרות אחרת היא <pre_multi_target_preparer> שפועלת לפני השלב target_preparer.

  • יש להשתמש ב-<pre_multi_target_preparer> להגדרה שחייבת לבצע לפני הגדרת מכשיר פרטנית.
  • צריך להשתמש ב-<multi_target_preparer> להגדרות שצריך לבצע אחרי ההגדרות של המכשירים השונים.

לדוגמה:

flash מכשיר 1 (target_preparer) Flash מכשיר פלאש 2 (target_preparer) Bluetooth חיבור שני המכשירים (multi_target_preparer)

כתיבת בדיקה במספר מכשירים

כשיוצרים בדיקה רגילה במכשיר אחד, מטמיעים את הממשק IDeviceTest.

כדי שהבדיקות יקבלו את המכשירים שנבדקים, אפשר להטמיע את IMultiDeviceTest או את IInvocationContextReceiver.

הכלי IMultiDeviceTest נותן מפה ישירה של המכשיר אל IBuildInfo שלו, ובשלב מאוחר יותר IInvocationContextReceiver נותן את ההקשר המלא (device, IBuildInfo ומטא-נתונים).

לאחר מכן תוכלו להשתמש בממשקי ה-API הרגילים של ITestDevice ש-TF הגדיר לצורך כתיבת בדיקות.

עדיין אין ממשקי API לביצוע פעולות ממכשיר אחד למכשיר אחר, כמו device1.sync(device2). אם לדעתכם יש לכם תרחיש לדוגמה שצריך לתמוך בו, תוכלו לשלוח את נימוקיכם לרשימה android-platform.

דוגמה ל-Hello World במספר מכשירים

הוספנו הגדרה לדוגמה שדומה ל-Hello World:‏ multi-devices.xml. יש גם דוגמה להטמעה של multi_target_preparerHelloWorldMultiTargetPreparer שמראה איך לקבל את רשימת המכשירים וה-builds שלהם.

זו דוגמה מלאה שכוללת:

  • הקצאת שני מכשירים
  • גישה לשני המכשירים דרך multi_target_preparer
  • הפעלת בדיקה שמשתמשת בשני המכשירים

אחרי שמפתחים את רכיב המסחר, אפשר להשתמש בפקודה הבאה במעטפת של TF:

run example/multi-devices

הפלט אמור להכיל את הפרטים הבאים:

08-15 10:52:43 I/HelloWorldMultiDevices: Hello World! device '00b4e73b4cbcd162' with build id '3146108'
08-15 10:52:43 I/HelloWorldMultiDevices: Hello World! device 'LP5A390056' with build id '3146108'
08-15 10:52:43 I/HelloWorldMultiDevices: Hello World! device '00b4e73b4cbcd162' from context with build 'com.android.tradefed.build.DeviceBuildInfo@c99cbc1'
08-15 10:52:43 I/HelloWorldMultiDevices: Hello World! device 'LP5A390056' from context with build 'com.android.tradefed.build.DeviceBuildInfo@b41f20c5'

כדי להפעיל את הפעולות שלמעלה, צריך שני מכשירים מחוברים. אפשר לבדוק זאת דרך: adb devices

בזמן ההפעלה אפשר לעקוב אחריה כמו מכשירים בודדים באמצעות list i ו-list d:

tf >list i
Command Id  Exec Time  Device                          State
1           0m:35      [00b4e73b4cbcd162, LP5A390056]  fetching build
tf >list d
Serial            State      Product   Variant   Build   Battery
00b4e73b4cbcd162  Allocated  bullhead  bullhead  NRD90O  100
LP5A390056        Allocated  shamu     shamu     NRD90I  100

אמורה להופיע רשימה של המכשירים שקשורים לכל קריאה, וגם כל המכשירים הזמינים והסטטוס שלהם.

שימו לב שבדוגמה הזו קראנו לשני המכשירים בתצורה device1 ו-device2. אם אפשר, כדאי לתת שם תיאורי יותר, בהתאם לסוג המכשיר שאתם מצפים להגדיר.