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

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

باستخدام قذيفة ADB

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

  • احصل على كائن جهاز Android:
    self.device = self.android_devices[0]
    
  • قم بإصدار أمر shell واحد:
    result = self.device.adb.shell(‘ls')
    

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

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

الشكل 1. سائق قذيفة VTS.

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

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

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

مزايا

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

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

سلبيات

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

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

أمثلة

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

  • احصل على كائن جهاز Android:
    self.device = self.android_devices[0]
    
  • الحصول على كائن قذيفة للجهاز المحدد:
    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')