במהלך בדיקת VTS, פקודות מעטפת משמשות לביצוע בדיקה בצד היעד
בינארית, כדי לקבל/להגדיר מאפיינים, משתני סביבה ונתוני מערכת,
כדי להפעיל/להפסיק את ה-framework של Android. אפשר להפעיל מעטפת של מכשיר VTS
פקודות באמצעות הפקודה adb shell
או מנהל התקן המעטפת של VTS
פועלות במכשיר (מומלץ).
שימוש במעטפת ADB
בדיקות שמחייבות כיבוי של יציאת ה-USB או הפעלה מחדש של המכשיר במהלך
חייבים להשתמש במעטפת ADB, כי מנהל התקן המעטפת של VTS לא זמין ללא
חיבור USB קבוע. אפשר להפעיל מעטפת ADB
AndroidDevice
בסקריפט הבדיקה של Python. לדוגמה:
- אחזור אובייקט במכשיר Android:
self.device = self.android_devices[0]
- שולחים פקודת מעטפת אחת:
result = self.device.adb.shell(‘ls')
שימוש במנהל המעטפת של VTS
מנהל התקן המעטפת של VTS הוא קובץ בינארי של סוכן שרץ במכשיר ומבצע
פקודות מעטפת. כברירת מחדל, VTS משתמש במנהל המעטפת אם הנהג פועל
במכשיר, כי לשיטה הזו יש פחות זמן אחזור בהשוואה לשימוש בפקודה adb
shell
.
מסגרת VTS תומכת בבדיקות מרובות מכשירים כאשר כל מכשיר Android מיוצגת כאובייקט AndroidDevice ב-Base Runner. כברירת מחדל, VTS תוכנת framework דוחפת את הקבצים הבינאריים של סוכן VTS ומעטפת של מעטפת VTS לכל מכשיר Android וליצור חיבורי TCP לסוכני VTS במכשירים האלה.
כדי להריץ פקודת מעטפת, סקריפט Python בצד המארח יוצר פונקציה לקריאה לאובייקט ShellMirror שבתוך אובייקט AndroidDevice. מראה הצדפה הטקסט של פקודת המעטפת מקבץ את הטקסטים protobuf ושולחת אותה (דרך ערוץ ה-TCP) לסוכן VTS ב-Android במכשיר. הנציג פועל במכשיר ולאחר מכן מעביר את פקודת המעטפת למעטפת של VTS דרך שקע Unix.
כשמנהל המעטפת של VTS מקבל פקודת מעטפת, הוא מבצע את הפקודה
דרך nohup ב-
מעטפת המכשיר כדי למנוע תלייה. לאחר מכן, Stdout, stderr וקוד החזרה
אחזור מ-nohup
ונשלח בחזרה לנציג VTS. לבסוף, הנציג
משיב למארח על ידי גלישת תוצאות הפקודות
הודעה אחת (protobuf
).
יתרונות
היתרונות של שימוש במנהל המעטפת של VTS במקום adb
shell
כוללים:
- אמינות. מנהל המעטפת של VTS משתמש
nohup
כדי להריץ פקודות בהגדרת ברירת המחדל. ככל שבדיקות VTS בדיקות HAL ובדיקות ליבה נמוכות יותר ברובן,nohup
מבטיחה שהמעטפת הפקודות לא תלויות במהלך הביצוע. - ביצועים. בזמן שהפקודה
adb shell
שומר תוצאות מסוימות במטמון (למשל, הצגת קבצים בספרייה) שיש לו חיבור תקורה בזמן ביצוע משימות, כמו הרצת קובץ בינארי לבדיקה. מנהל התקן מעטפת VTS שומר על חיבור פעיל במהלך הבדיקה, כך שהתקורה היחידה היא USB. תקשורת בלתי מכוונת. בבדיקות שלנו, השתמשנו במנהל התקן המעטפת של VTS כדי להריץ פקודה עם 100 קריאות לבינארי gtest ריק הוא מהיר יותר ב-20 אחוז בערך משימושadb shell
; ההבדל בפועל גדול יותר מאז מעטפת VTS לתקשורת הזו יש רישום נרחב ביומן. - ניהול מדינה. מנהל המעטפת של VTS מחזיק בטרמינל סשן לכל שם טרמינל (שם הטרמינל המוגדר כברירת מחדל הוא ברירת מחדל). משתני סביבה שמוגדרים בסשן אחד בטרמינל הם זמין רק לפקודות הבאות באותו סשן.
- ניתנת להרחבה. תקשורת פקודות במעטפת בין VTS framework ומנהל התקן של המכשיר עטופים ב-protobuf כדי להפעיל פוטנציאל דחיסה, העברת נתונים, הצפנה וכו' בעתיד. אפשרויות נוספות עבור אפשר גם לשפר את הביצועים, כולל ניתוח תוצאות בצד המכשיר כאשר תקורת התקשורת הופכת גדולה יותר מניתוח מחרוזות התוצאה.
חסרונות
החסרונות בשימוש במנהל המעטפת של VTS במקום adb
shell
הם:
- קבצים בינאריים נוספים. יש לדחוף את קובצי סוכן VTS אל המכשיר ותנקה לאחר ביצוע הבדיקה.
- נדרש חיבור פעיל. אם חיבור ה-TCP בין
המארח והסוכן אבדו במהלך הבדיקה (עקב ניתוק USB, כיבוי יציאות,
של קריסת מכשיר וכו') באופן מכוון או לא מכוון, פקודת מעטפת
לא ניתן להעביר לסוכן VTS. גם עם מעבר אוטומטי אל
adb shell
, התוצאה והמצב של הפקודה לפני הניתוק לא יהיה ידוע.
דוגמאות
דוגמאות לשימוש בפקודות מעטפת בסקריפט בדיקה של Python בצד המארח של VTS:
- אחזור אובייקט במכשיר Android:
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')