פקודות מעטפת מכשיר

במהלך בדיקת VTS, נעשה שימוש בפקודות מעטפת לביצוע בדיקה בינארית בצד היעד, לקבל/להגדיר מאפיינים, משתני סביבה ומידע מערכת, וכדי להפעיל/להפסיק את מסגרת Android. אתה יכול לבצע פקודות מעטפת של מכשיר VTS באמצעות פקודת adb shell או מנהל ההתקן של VTS shell הפועל על המכשיר (מומלץ).

השתמש במעטפת ADB

בדיקות הדורשות כיבוי של יציאת ה-USB או אתחול מחדש של ההתקן במהלך הבדיקה חייבות להשתמש במעטפת ADB מכיוון שמנהל ההתקן של מעטפת VTS אינו זמין ללא חיבור USB מתמשך. אתה יכול להפעיל מעטפת ADB מאובייקט AndroidDevice בסקריפט הבדיקה של Python. דוגמאות:

  • קבל אובייקט של מכשיר אנדרואיד:
    self.device = self.android_devices[0]
    
  • הפק פקודת מעטפת אחת:
    result = self.device.adb.shell(‘ls')
    

השתמש במנהל ההתקן של מעטפת VTS

מנהל ההתקן של ה-VTS הוא סוכן בינארי הפועל על המכשיר ומבצע פקודות מעטפת. כברירת מחדל, VTS משתמש במנהל ההתקן של המעטפת אם מנהל ההתקן פועל במכשיר מכיוון שלשיטה זו יש פחות זמן אחזור מאשר שימוש בפקודת adb shell .

איור 1. מנהל התקן פגז VTS.

מסגרת ה-VTS תומכת בבדיקות מרובות מכשירים כאשר כל מכשיר אנדרואיד מיוצג כאובייקט AndroidDevice ב-base runner. כברירת מחדל, מסגרת VTS דוחפת קבצים בינאריים של סוכן VTS ו-VTS מעטפת לכל מכשיר אנדרואיד ומקימה חיבורי TCP לסוכני VTS במכשירים אלה.

כדי לבצע פקודת מעטפת, הסקריפט של Python בצד המארח מבצע קריאת פונקציה לאובייקט ShellMirror בתוך אובייקט AndroidDevice. האובייקט ShellMirror אורז את טקסטי פקודת המעטפת להודעת protobuf ושולח אותה (דרך ערוץ TCP) לסוכן VTS במכשיר האנדרואיד. הסוכן שפועל במכשיר מעביר את פקודת המעטפת למנהל ההתקן של VTS מעטפת דרך שקע ה-Unix.

כאשר מנהל התקן מעטפת VTS מקבל פקודת מעטפת, הוא מבצע את הפקודה באמצעות nohup במעטפת המכשיר כדי למנוע תלייה. Stdout, stderr וקוד החזרה מאוחזרים מ- nohup ונשלחים חזרה לסוכן VTS. לבסוף, הסוכן משיב למארח על ידי גלישת תוצאות הפקודה להודעת protobuf .

יתרונות

היתרונות של השימוש במנהל ההתקן של VTS במקום adb shell כוללים:

  • מהימנות. מנהל התקן המעטפת של VTS משתמש nohup כדי לבצע פקודות בהגדרת ברירת המחדל. מכיוון שבדיקות VTS הן לרוב בדיקות HAL וגרעין ברמה נמוכה יותר, nohup מבטיח שפקודות מעטפת לא יתקעו במהלך הביצוע.
  • ביצועים . בעוד שפקודת ה- adb shell מאחסנת תוצאות מסוימות (כגון רישום קבצים בספריה), יש לה תקורה של חיבור בעת ביצוע משימות כגון ביצוע קובץ בינארי לבדיקה. מנהל ההתקן של ה-VTS שומר על חיבור פעיל לאורך כל הבדיקה ולכן התקורה היחידה היא תקשורת USB. בבדיקה שלנו, השימוש במנהל ההתקן של VTS shell לביצוע פקודה עם 100 קריאות לקובץ בינארי gtest ריק הוא מהיר יותר בכ-20 אחוזים משימוש adb shell ; ההבדל בפועל גדול יותר מכיוון שתקשורת מעטפת VTS כוללת רישום נרחב.
  • שמירה על המדינה . מנהל ההתקן של ה-VTS שומר על הפעלת מסוף עבור כל שם מסוף (שם מסוף ברירת המחדל הוא ברירת המחדל ). משתני סביבה המוגדרים בהפעלה מסוף אחת זמינים רק לפקודות עוקבות באותה הפעלה.
  • ניתן להרחבה . תקשורת פקודת מעטפת בין מסגרת VTS ומנהל ההתקן עטופה בפרוטובוף כדי לאפשר דחיסה פוטנציאלית, ריחוק, הצפנה וכו' בעתיד. אפשרויות אחרות לשיפור הביצועים זמינות גם כן, כולל ניתוח תוצאות בצד ההתקן כאשר תקורה התקשורת נהיית גדולה יותר מניתוח מחרוזת התוצאה.

חסרונות

החסרונות של שימוש במנהל ההתקן של ה-VTS במקום adb shell כוללים:

  • קבצים בינאריים נוספים . יש לדחוף קבצי סוכן VTS למכשיר ולנקות אותם לאחר ביצוע הבדיקה.
  • דורש חיבור פעיל . אם חיבור ה-TCP בין המארח לסוכן אבד במהלך הבדיקה (עקב ניתוק USB, כיבוי יציאות, קריסת מכשיר וכו') בכוונה או שלא בכוונה, לא ניתן להעביר פקודת מעטפת לסוכן VTS. אפילו עם מעבר אוטומטי ל- adb shell , התוצאה והמצב של הפקודה לפני הניתוק לא יהיו ידועים.

דוגמאות

דוגמאות לשימוש בפקודות מעטפת בסקריפט בדיקה של Python בצד המארח של VTS:

  • קבל אובייקט מכשיר אנדרואיד:
    self.device = self.android_devices[0]
    
  • קבל אובייקט מעטפת עבור המכשיר הנבחר:
    self.shell = self.device.shell
    
  • הפק פקודת מעטפת אחת:
    results = self.shell.Execute(‘ls')
    
  • הפק רשימה של פקודות מעטפת:
    results = self.shell.Execute([‘cd /data/local/tmp', ‘ls'])
    

אובייקט תוצאת פקודה

אובייקט ההחזרה מביצוע פקודת מעטפת הוא מילון המכיל את המפתחות stdouts , stderrs ו- return_codes . לא משנה אם פקודת המעטפת מסופקת כמחרוזת בודדת או כרשימה של מחרוזות פקודות, כל ערך של מילון התוצאות הוא תמיד רשימה.

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

asserts.assertFalse(any(results[‘return_codes']), ‘some command failed.')

לחלופין, הסקריפט יכול לבדוק כל אינדקס פקודה בנפרד. דוגמא:

asserts.assertEqual(results[‘return_codes'][0], 0, ‘first command failed')
asserts.assertEqual(results[‘return_codes'][1], 0, ‘second command failed')