בדף הזה מוסבר איך להשתמש ב-Trade Federation Test Harness עם כמה מכשירים במהלך הבדיקה.קודם כדאי להכיר את השימוש הרגיל כפי שמתואר בדוגמה מקצה לקצה.
מה ההבדל כשמשתמשים במספר מכשירים?
יש כמה הבדלים בהגדרה ובהרצה של בדיקות במספר מכשירים ב-Trade Federation, במיוחד:
כל הגדרה קיימת למכשיר אחד תקפה למצב של כמה מכשירים.
<! -- TODO: Clarify the sentence immediately above by adding an example of a use case with one device as it relates to multi-device mode in a second sentence. -->>
הגדרה של כמה מכשירים
במסמך הזה אנו יוצאים מנקודת הנחה שכבר ידוע לכם איך מגדירים בדיקות ב-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 device 1 (target_preparer) flash device 2 (target_preparer) bluetooth connect both devices (multi_target_preparer)
כתיבת בדיקה במספר מכשירים
כשכותבים בדיקה רגילה במכשיר אחד, מטמיעים את הממשק IDeviceTest.
כדי שהבדיקות יקבלו את המכשירים שנבדקים, אפשר להטמיע את IMultiDeviceTest או את IInvocationContextReceiver.
באמצעות IMultiDeviceTest אפשר לקבל מפה ישירה של המכשיר ל-IBuildInfo שלו, ואילו באמצעות IInvocationContextReceiver אפשר לקבל בהמשך את ההקשר המלא (מכשיר, IBuildInfo ומטא-נתונים).
לאחר מכן תוכלו להשתמש בממשקי ה-API הרגילים של ITestDevice ש-TF הגדיר לצורך כתיבת בדיקות.
עדיין אין ממשקי API לביצוע פעולות ממכשיר אחד למכשיר אחר, כמו device1.sync(device2)
. אם לדעתכם יש לכם תרחיש לדוגמה שראוי לקבל תמיכה, תוכלו לשלוח את נימוקיכם לרשימה android-platform.
דוגמה ל-Hello World במספר מכשירים
הוספנו הגדרה לדוגמה שדומה ל-Hello World: multi-devices.xml. יש גם דוגמה להטמעה של multi_target_preparer
HelloWorldMultiTargetPreparer שמראה איך לקבל את רשימת המכשירים וה-builds שלהם.
זו דוגמה מלאה שכוללת:
- הקצאת שני מכשירים
- גישה לשני המכשירים דרך
multi_target_preparer
- הפעלת בדיקה שמשתמשת בשני המכשירים
אחרי שתיצרו את Tradefed, תוכלו להשתמש בפקודה הבאה במסוף 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
. אם אפשר, כדאי לתת שם תיאורי יותר, בהתאם לסוג המכשיר שאתם מצפים להגדיר.