أوامر واجهة أوامر الجهاز

أثناء اختبار VTS، يتم استخدام أوامر shell لتنفيذ ملف ثنائي لاختبار على الجانب المستهدف، والحصول على السمات ومتغيرات البيئة ومعلومات النظام أو ضبطها، وبدء إطار عمل Android أو إيقافه. يمكنك تنفيذ أوامر ملف شل جهاز VTS باستخدام الأمر adb shell أو برنامج تشغيل ملف شل VTS الذي يعمل على الجهاز (إجراء يُنصح به).

استخدام أداة ADB shell

إنّ الاختبارات التي تتطلّب إغلاق منفذ USB أو إعادة تشغيل الجهاز أثناء الاختبار يجب أن تستخدم ADB shell لأنّ برنامج تشغيل shell في VTS غير متاح بدون اتصال USB مستمر. يمكنك استدعاء shell ADB من عنصر AndroidDevice في نص اختبار Python. أمثلة:

  • الحصول على عنصر جهاز Android:
    self.device = self.android_devices[0]
    
  • أدخِل أمرًا واحدًا لوحدة التحكّم في البرامج:
    result = self.device.adb.shell(‘ls')
    

استخدام برنامج تشغيل shell في VTS

سائق shell في VTS هو ملف ثنائي للوكيل يتم تشغيله على الجهاز وتنفيذه أوامر shell. يستخدم VTS تلقائيًا برنامج تشغيل shell إذا كان البرنامج قيد التشغيل على الجهاز لأنّ هذه الطريقة تتميز بوقت استجابة أقل من استخدام الأمر adb shell.

الشكل 1: برنامج تشغيل shell في VTS

يتيح إطار عمل VTS اختبار الأجهزة المتعددة حيث يتم تمثيل كل جهاز Android ككائن AndroidDevice في أداة التشغيل الأساسية. يُرسِل إطار عمل VTS الثنائيات الخاصة ببرنامج تشغيل VTS shell ووكيل VTS تلقائيًا إلى كل جهاز Android ويُنشئ اتصالات بروتوكول التحكم في الإرسال (TCP) مع وكلاء VTS على هذه الأجهزة.

لتنفيذ أمر shell، يُجري النص البرمجي Python من جهة المضيف دالة استدعاء للكائن ShellMirror داخل كائن AndroidDevice. يُجمِّع عنصر ShellMirror نصوص أوامر shell في رسالة protobuf ويرسلها (عبر قناة TCP) إلى وكيل VTS على جهاز Android. بعد ذلك، يعيد الوكيل الذي يعمل على الجهاز توجيه الأمر المُرسَل إلى shell إلى ملف تعريف قاعدة بيانات VTS driver عبر مقبس Unix.

عندما يتلقّى برنامج تشغيل واجهة سطر أوامر VTS أمرًا من واجهة سطر الأوامر، ينفّذ الأمر من خلال nohup في واجهة سطر أوامر الجهاز لمنع تعليقه. بعد ذلك، يتم retrievingاسترداد Stdout وstderr ورمز الإرجاع من nohup وإرساله مرة أخرى إلى موظّف دعم VTS. أخيرًا، يردّ موظّف الدعم على المضيف من خلال تضمين نتائج الأوامر في رسالة protobuf.

الإيجابيات

تشمل مزايا استخدام برنامج تشغيل shell في VTS بدلاً من adb shell ما يلي:

  • الموثوقية: يستخدم برنامج تشغيل shell في VTS nohup لتنفيذ الأوامر على الإعداد التلقائي. بما أنّ اختبارات VTS هي اختبارات HAL والنواة من المستوى الأدنى في الغالب، يضمن nohup عدم تعليق nohupأوامر shell أثناء التنفيذ.
  • الأداء: على الرغم من أنّ الأمر adb shell يخزِّن مؤقتًا بعض النتائج (مثل إدراج الملفات في دليل)، إلا أنّه يستهلك موارد إضافية عند تنفيذ مهام مثل تنفيذ ملف ثنائي اختباري. يحافظ برنامج تشغيل VTS shell على اتصال نشط طوال الاختبار، لذا فإنّ التكلفة الإضافية الوحيدة هي تواصل USB. في اختباراتنا، كان استخدام برنامج تشغيل shell في VTS لتنفيذ أمر يحتوي على 100 طلب إلى ملف gtest ثنائي فارغ أسرع بنسبة %20 تقريبًا من استخدام adb shell، وكان الفرق الفعلي أكبر لأنّ ملف تواصل VTS shell يتضمّن تسجيلًا مكثّفًا.
  • الاحتفاظ بالحالة: يحافظ برنامج تشغيل shell في VTS على جلسة محطة لكل اسم محطة (اسم المحطة التلقائي هو default). لا تتوفّر متغيّرات البيئة التي تم ضبطها في جلسة وحدة طرفية واحدة إلا للأوامر اللاحقة في الجلسة نفسها.
  • قابلة للتمديد: يتم لف اتصالات أوامر Shell بين إطار عمل VTS وبرنامج تشغيل الجهاز في protobuf لتفعيل إمكانيات ملف protobuf في ما يتعلّق بالضغط والاتصال عن بُعد والتشفير وما إلى ذلك في المستقبل. تتوفّر أيضًا احتمالات أخرى لتحسين الأداء، بما في ذلك تحليل النتائج من جهة الجهاز عندما تصبح النفقات العامة للتواصل أكبر من تحليل سلسلة النتائج.

السلبيات

تشمل عيوب استخدام برنامج تشغيل shell في VTS بدلاً من adb shell ما يلي:

  • الثنائيات الإضافية يجب دفع ملفات وكيل فحص الفيديو إلى الجهاز وتنظيفها بعد تنفيذ الاختبار.
  • تتطلّب هذه الميزة اتصالاً نشطًا. إذا انقطع اتصال بروتوكول النقل المتعدّد (TCP) بين العميل والوكيل أثناء الاختبار (بسبب انقطاع الاتصال عبر USB أو إيقاف المنفذ أو تعطُّل الجهاز أو غير ذلك) سواءً عن قصد أو عن غير قصد، لا يمكن إرسال أحد أوامر shell إلى وكيل فحص الأداء الظاهري. حتى في حال التبديل التلقائي إلى adb shell، لن تكون نتيجة الأمر وحالته قبل انقطاع الاتصال معلومة.

أمثلة

أمثلة على استخدام أوامر shell في نص اختبار Python على جانب مضيف VTS:

  • الحصول على عنصر جهاز Android:
    self.device = self.android_devices[0]
    
  • الحصول على عنصر shell للجهاز المحدّد:
    self.shell = self.device.shell
    
  • أدخِل أمرًا واحدًا لوحدة التحكّم في البرامج:
    results = self.shell.Execute(‘ls')
    
  • يمكنك إصدار قائمة بأوامر shell:
    results = self.shell.Execute([‘cd /data/local/tmp', ‘ls'])
    

عنصر نتيجة الأمر

عنصر الإرجاع من تنفيذ أمر shell هو قاموس يحتوي على مفاتيح 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')