वीटीएस टेस्टिंग के दौरान, शेल कमांड का इस्तेमाल टारगेट-साइड टेस्ट बाइनरी को चलाने, प्रॉपर्टी, एनवायरमेंट वैरिएबल, और सिस्टम की जानकारी पाने/सेट करने के साथ-साथ, Android फ़्रेमवर्क को शुरू/बंद करने के लिए किया जाता है. adb shell
कमांड या डिवाइस पर चल रहे VTS शेल ड्राइवर (सुझाया गया) का इस्तेमाल करके, VTS डिवाइस शेल कमांड चलाए जा सकते हैं.
ADB shell का इस्तेमाल करना
जिन टेस्ट के लिए यूएसबी पोर्ट को बंद करना ज़रूरी है या टेस्ट के दौरान डिवाइस को रीबूट करना ज़रूरी है उनके लिए ADB शेल का इस्तेमाल करना होगा. ऐसा इसलिए, क्योंकि यूएसबी कनेक्शन के बिना VTS शेल ड्राइवर उपलब्ध नहीं होता. Python टेस्ट स्क्रिप्ट में,
AndroidDevice
ऑब्जेक्ट से ADB शेल को शुरू किया जा सकता है. उदाहरण:
- Android डिवाइस का ऑब्जेक्ट पाएं:
self.device = self.android_devices[0]
- एक शेल कमांड जारी करें:
result = self.device.adb.shell(‘ls')
VTS शेल ड्राइवर का इस्तेमाल करना
VTS शेल ड्राइवर एक एजेंट बाइनरी है, जो डिवाइस पर चलता है और शेल निर्देशों को लागू करता है. अगर ड्राइवर डिवाइस पर चल रहा है, तो डिफ़ॉल्ट रूप से VTS, शेल ड्राइवर का इस्तेमाल करता है. इसकी वजह यह है कि adb
shell
कमांड का इस्तेमाल करने की तुलना में, इस तरीके में इंतज़ार का समय कम होता है.
VTS फ़्रेमवर्क, एक से ज़्यादा डिवाइसों पर टेस्टिंग की सुविधा देता है. इसमें, हर Android डिवाइस को बेस रनर में AndroidDevice ऑब्जेक्ट के तौर पर दिखाया जाता है. डिफ़ॉल्ट रूप से, VTS फ़्रेमवर्क हर Android डिवाइस पर VTS एजेंट और VTS शेल ड्राइवर बाइनरी को पुश करता है. साथ ही, उन डिवाइसों पर VTS एजेंट के लिए टीसीपी कनेक्शन बनाता है.
शेल कमांड को लागू करने के लिए, होस्ट-साइड Python स्क्रिप्ट, AndroidDevice ऑब्जेक्ट में मौजूद ShellMirror ऑब्जेक्ट को फ़ंक्शन कॉल करती है. ShellMirror ऑब्जेक्ट, शेल कमांड टेक्स्ट को protobuf मैसेज में पैक करता है और उसे Android डिवाइस पर मौजूद VTS एजेंट को भेजता है. ऐसा, टीसीपी चैनल के ज़रिए किया जाता है. इसके बाद, डिवाइस पर चल रहा एजेंट, यूनिक्स सॉकेट की मदद से, शेल कमांड को VTS शेल ड्राइवर को फ़ॉरवर्ड करता है.
जब VTS शेल ड्राइवर को कोई शेल निर्देश मिलता है, तो वह डिवाइस शेल पर nohup के ज़रिए निर्देश को लागू करता है, ताकि डिवाइस हैंग न हो. इसके बाद, nohup
से स्टडआउट, स्टर्डआउट, और रिटर्न कोड वापस पाया जाता है और उन्हें VTS एजेंट को भेजा जाता है. आखिर में, एजेंट, कमांड के नतीजे को protobuf
मैसेज में रैप करके, होस्ट को जवाब देता है.
फ़ायदे
adb
shell
के बजाय VTS शेल ड्राइवर का इस्तेमाल करने के फ़ायदे:
- विश्वसनीयता. डिफ़ॉल्ट सेटिंग पर कमांड लागू करने के लिए, VTS शेल ड्राइवर
nohup
का इस्तेमाल करता है. वीटीएस टेस्ट ज़्यादातर, कम लेवल के एचएएल और कर्नेल टेस्ट होते हैं. इसलिए,nohup
यह पक्का करता है कि शेल कमांड, लागू करने के दौरान हैंग न हों. - परफ़ॉर्मेंस.
adb shell
कमांड कुछ नतीजों को कैश मेमोरी में सेव करता है, जैसे कि डायरेक्ट्री में मौजूद फ़ाइलों की सूची. हालांकि, टेस्ट बाइनरी को चलाने जैसे टास्क करते समय, इसमें कनेक्शन का ओवरहेड होता है. VTS शेल ड्राइवर, जांच के दौरान ऐक्टिव कनेक्शन बनाए रखता है, ताकि यूएसबी कम्यूनिकेशन ही ओवरहेड हो. हमारी जांच में पता चला है कि किसी खाली gtest बाइनरी को 100 कॉल के साथ कमांड चलाने के लिए,adb shell
का इस्तेमाल करने के मुकाबले, VTS शेल ड्राइवर का इस्तेमाल करने पर, कमांड 20 प्रतिशत ज़्यादा तेज़ी से चलता है. असल अंतर ज़्यादा है, क्योंकि VTS शेल कम्यूनिकेशन में ज़्यादा लॉगिंग होती है. - स्टेटस सेव करना. VTS शेल ड्राइवर, हर टर्मिनल के नाम के लिए एक टर्मिनल सेशन बनाए रखता है. टर्मिनल का डिफ़ॉल्ट नाम default होता है. किसी टर्मिनल सेशन में सेट किए गए एनवायरमेंट वैरिएबल, सिर्फ़ उसी सेशन में दिए जाने वाले बाद के निर्देशों के लिए उपलब्ध होते हैं.
- बढ़ाया जा सकता है. VTS फ़्रेमवर्क और डिवाइस ड्राइवर के बीच शेल कमांड कम्यूनिकेशन को प्रोटोबस में लपेटा जाता है, ताकि आने वाले समय में संपीड़न, रिमोटिंग, एन्क्रिप्शन वगैरह की सुविधाएं चालू की जा सकें. परफ़ॉर्मेंस को बेहतर बनाने के लिए, और भी तरीके उपलब्ध हैं. जैसे, जब कम्यूनिकेशन ओवरहेड, नतीजे की स्ट्रिंग को पार्स करने से ज़्यादा हो जाता है, तो डिवाइस-साइड पर नतीजे को पार्स करना.
नुकसान
adb
shell
के बजाय VTS शेल ड्राइवर का इस्तेमाल करने के नुकसानों में ये शामिल हैं:
- अतिरिक्त बाइनरी. जांच पूरी होने के बाद, वीटीएस एजेंट फ़ाइलों को डिवाइस पर पुश किया जाना चाहिए और उन्हें हटा दिया जाना चाहिए.
- इसके लिए, चालू कनेक्शन की ज़रूरत होती है. अगर जांच के दौरान, होस्ट और एजेंट के बीच TCP कनेक्शन टूट जाता है, तो VTS एजेंट को शेल कमांड नहीं भेजा जा सकता. ऐसा, यूएसबी कनेक्शन टूटने, पोर्ट बंद होने, डिवाइस क्रैश होने वगैरह की वजह से हो सकता है.
adb shell
पर अपने-आप स्विच होने के बाद भी, डिसकनेक्ट होने से पहले कमांड का नतीजा और स्थिति पता नहीं चलेगी.
उदाहरण
VTS होस्ट-साइड Python टेस्ट स्क्रिप्ट में शेल कमांड इस्तेमाल करने के उदाहरण:
- 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')