دستورات پوسته دستگاه

در طول تست VTS، از دستورات پوسته برای اجرای یک باینری تست سمت هدف، برای دریافت/تنظیم خصوصیات، متغیرهای محیطی و اطلاعات سیستم، و برای شروع/توقف چارچوب اندروید استفاده می‌شود. می توانید دستورات پوسته دستگاه VTS را با استفاده از دستور adb shell یا درایور پوسته VTS که روی دستگاه اجرا می شود (توصیه می شود) اجرا کنید.

با استفاده از پوسته ADB

آزمایش‌هایی که نیاز به خاموش کردن درگاه USB یا راه‌اندازی مجدد دستگاه در طول آزمایش دارند، باید از پوسته ADB استفاده کنند زیرا درایور پوسته VTS بدون اتصال USB دائمی در دسترس نیست. می توانید پوسته ADB را از شی AndroidDevice در اسکریپت تست پایتون فراخوانی کنید. مثال ها:

  • یک شی دستگاه Android دریافت کنید:
    self.device = self.android_devices[0]
    
  • یک فرمان تک پوسته را صادر کنید:
    result = self.device.adb.shell(‘ls')
    

با استفاده از درایور پوسته VTS

درایور پوسته VTS یک باینری عامل است که روی دستگاه اجرا می شود و دستورات پوسته را اجرا می کند. به‌طور پیش‌فرض، اگر درایور روی دستگاه اجرا می‌شود، VTS از درایور پوسته استفاده می‌کند، زیرا این روش تأخیر کمتری نسبت به دستور adb shell دارد.

شکل 1. درایور پوسته VTS.

چارچوب VTS از تست چند دستگاهی پشتیبانی می‌کند که در آن هر دستگاه Android به عنوان یک شی AndroidDevice در اجرای پایه نمایش داده می‌شود. به‌طور پیش‌فرض، چارچوب VTS باینری‌های عامل VTS و درایور پوسته VTS را به هر دستگاه اندرویدی فشار می‌دهد و اتصالات TCP را با عوامل VTS در آن دستگاه‌ها برقرار می‌کند.

برای اجرای یک فرمان پوسته، اسکریپت پایتون سمت میزبان یک تابع را با شی ShellMirror در داخل شی AndroidDevice فراخوانی می کند. شی ShellMirror متون فرمان پوسته را در یک پیام پروتوباف بسته بندی می کند و آن را (از طریق کانال TCP) به عامل VTS در دستگاه Android ارسال می کند. عاملی که روی دستگاه اجرا می شود، سپس فرمان پوسته را از طریق سوکت یونیکس به درایور پوسته VTS ارسال می کند.

هنگامی که درایور پوسته 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 و درایور دستگاه در پروتوباف پیچیده شده است تا در آینده امکان فشرده سازی، از راه دور، رمزگذاری و غیره را فراهم کند. سایر امکانات برای بهبود عملکرد نیز در دسترس است، از جمله تجزیه نتیجه در سمت دستگاه زمانی که سربار ارتباط بزرگتر از تجزیه رشته نتیجه می شود.

معایب

معایب استفاده از درایور پوسته VTS به جای adb shell عبارتند از:

  • باینری های اضافی فایل های عامل VTS باید به دستگاه فشار داده شوند و پس از اجرای آزمایش پاک شوند.
  • به اتصال فعال نیاز دارد . اگر اتصال TCP بین میزبان و عامل در حین تست قطع شود (به دلیل قطع USB، خاموش شدن پورت، خرابی دستگاه و غیره) عمدا یا ناخواسته، یک فرمان پوسته نمی تواند به عامل VTS منتقل شود. حتی با تغییر خودکار به adb shell ، نتیجه و وضعیت فرمان قبل از قطع ارتباط ناشناخته خواهد بود.

مثال ها

نمونه هایی از استفاده از دستورات پوسته در اسکریپت تست پایتون سمت میزبان 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')