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

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

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

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

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

יתרונות

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

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

חסרונות

החסרונות בשימוש במנהל הפגז של VTS במקום adb shell כוללים:

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

דוגמאות

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

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

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