VTS পরীক্ষার সময়, শেল কমান্ডগুলি একটি টার্গেট-সাইড টেস্ট বাইনারি চালানো, বৈশিষ্ট্যগুলি, পরিবেশের ভেরিয়েবল এবং সিস্টেমের তথ্য পেতে/সেট করতে এবং অ্যান্ড্রয়েড ফ্রেমওয়ার্ক শুরু/বন্ধ করতে ব্যবহার করা হয়। আপনি adb shell
কমান্ড বা ডিভাইসে চলমান VTS শেল ড্রাইভার ব্যবহার করে VTS ডিভাইস শেল কমান্ড চালাতে পারেন (প্রস্তাবিত)।
ADB শেল ব্যবহার করুন
যে পরীক্ষাগুলির জন্য USB পোর্ট বন্ধ করতে হবে বা পরীক্ষার সময় ডিভাইসটি রিবুট করতে হবে সেগুলিকে অবশ্যই ADB শেল ব্যবহার করতে হবে কারণ একটি স্থায়ী USB সংযোগ ছাড়া VTS শেল ড্রাইভার অনুপলব্ধ। আপনি পাইথন টেস্ট স্ক্রিপ্টে AndroidDevice
অবজেক্ট থেকে ADB শেল আহ্বান করতে পারেন। উদাহরণ:
- একটি অ্যান্ড্রয়েড ডিভাইস অবজেক্ট পান:
self.device = self.android_devices[0]
- একটি একক শেল কমান্ড ইস্যু করুন:
result = self.device.adb.shell(‘ls')
VTS শেল ড্রাইভার ব্যবহার করুন
VTS শেল ড্রাইভার হল একটি এজেন্ট বাইনারি যা ডিভাইসে চলে এবং শেল কমান্ড চালায়। ডিফল্টরূপে, ড্রাইভারটি ডিভাইসে চললে VTS শেল ড্রাইভার ব্যবহার করে কারণ এই পদ্ধতিতে adb shell
কমান্ড ব্যবহারের চেয়ে কম লেটেন্সি রয়েছে।
ভিটিএস ফ্রেমওয়ার্ক মাল্টি-ডিভাইস টেস্টিং সমর্থন করে যেখানে প্রতিটি অ্যান্ড্রয়েড ডিভাইস বেস রানারে একটি অ্যান্ড্রয়েডডিভাইস অবজেক্ট হিসেবে উপস্থাপন করা হয়। ডিফল্টরূপে, VTS ফ্রেমওয়ার্ক VTS এজেন্ট এবং VTS শেল ড্রাইভার বাইনারিগুলিকে প্রতিটি Android ডিভাইসে পুশ করে এবং সেই ডিভাইসগুলিতে VTS এজেন্টদের সাথে TCP সংযোগ স্থাপন করে।
একটি শেল কমান্ড চালানোর জন্য, হোস্ট-সাইড পাইথন স্ক্রিপ্ট AndroidDevice অবজেক্টের ভিতরে ShellMirror অবজেক্টে একটি ফাংশন কল করে। ShellMirror অবজেক্ট শেল কমান্ডের পাঠ্যগুলিকে একটি প্রোটোবাফ বার্তায় প্যাক করে এবং এটি (TCP চ্যানেলের মাধ্যমে) Android ডিভাইসে VTS এজেন্টকে পাঠায়। ডিভাইসে চলমান এজেন্ট তারপর শেল কমান্ডটি ইউনিক্স সকেটের মাধ্যমে VTS শেল ড্রাইভারের কাছে ফরোয়ার্ড করে।
যখন VTS শেল ড্রাইভার একটি শেল কমান্ড পায়, তখন এটি হ্যাং হওয়া প্রতিরোধ করার জন্য ডিভাইস শেলটিতে nohup- এর মাধ্যমে কমান্ডটি কার্যকর করে। Stdout, stderr, এবং রিটার্ন কোড তারপর nohup
থেকে পুনরুদ্ধার করা হয় এবং VTS এজেন্টের কাছে ফেরত পাঠানো হয়। অবশেষে, এজেন্ট কমান্ডের ফলাফল(গুলি) একটি protobuf
বার্তায় মোড়ানোর মাধ্যমে হোস্টকে উত্তর দেয়।
সুবিধা
adb shell
পরিবর্তে ভিটিএস শেল ড্রাইভার ব্যবহার করার সুবিধার মধ্যে রয়েছে:
- নির্ভরযোগ্যতা। VTS শেল ড্রাইভার ডিফল্ট সেটিং-এ কমান্ড চালানোর জন্য
nohup
ব্যবহার করে। যেহেতু VTS পরীক্ষাগুলি বেশিরভাগ নিম্ন স্তরের HAL এবং কার্নেল পরীক্ষা,nohup
নিশ্চিত করে যে শেল কমান্ডগুলি কার্যকর করার সময় হ্যাং না হয়। - কর্মক্ষমতা যদিও
adb shell
কমান্ড কিছু ফলাফল ক্যাশ করে (যেমন একটি ডিরেক্টরিতে ফাইল তালিকাভুক্ত করা) এটি একটি কানেকশন ওভারহেড থাকে যখন একটি টেস্ট বাইনারি চালানোর মতো কাজগুলি সম্পাদন করে। VTS শেল ড্রাইভার পরীক্ষা জুড়ে একটি সক্রিয় সংযোগ বজায় রাখে তাই একমাত্র ওভারহেড হল USB যোগাযোগ। আমাদের পরীক্ষায়, একটি খালি gtest বাইনারিতে 100টি কল সহ একটি কমান্ড কার্যকর করতে VTS শেল ড্রাইভার ব্যবহার করাadb shell
ব্যবহারের চেয়ে প্রায় 20 শতাংশ দ্রুত; ভিটিএস শেল কমিউনিকেশনে ব্যাপক লগিং থাকায় প্রকৃত পার্থক্য বড়। - রাষ্ট্র পালন 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
কী রয়েছে। শেল কমান্ড একটি একক স্ট্রিং বা কমান্ড স্ট্রিংগুলির একটি তালিকা হিসাবে দেওয়া হোক না কেন, ফলাফল অভিধানের প্রতিটি মান সর্বদা একটি তালিকা।
কমান্ডের একটি তালিকার রিটার্ন কোড যাচাই করতে, পরীক্ষার স্ক্রিপ্টটি সূচকগুলি পরীক্ষা করতে হবে। উদাহরণ:
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')