डिवाइस शेल कमांड

वीटीएस परीक्षण के दौरान, शेल कमांड का उपयोग लक्ष्य-पक्ष परीक्षण बाइनरी को निष्पादित करने, गुण, पर्यावरण चर और सिस्टम जानकारी प्राप्त करने/सेट करने और एंड्रॉइड फ्रेमवर्क को शुरू/बंद करने के लिए किया जाता है। आप adb shell शेल कमांड या डिवाइस पर चल रहे वीटीएस शेल ड्राइवर (अनुशंसित) का उपयोग करके वीटीएस डिवाइस शेल कमांड निष्पादित कर सकते हैं।

ADB शेल का उपयोग करें

जिन परीक्षणों में परीक्षण के दौरान यूएसबी पोर्ट को बंद करने या डिवाइस को रीबूट करने की आवश्यकता होती है, उन्हें एडीबी शेल का उपयोग करना चाहिए क्योंकि वीटीएस शेल ड्राइवर लगातार यूएसबी कनेक्शन के बिना अनुपलब्ध है। आप Python परीक्षण स्क्रिप्ट में AndroidDevice ऑब्जेक्ट से ADB शेल को इनवॉक कर सकते हैं। उदाहरण:

  • एक Android डिवाइस ऑब्जेक्ट प्राप्त करें:
    self.device = self.android_devices[0]
    
  • एकल शेल कमांड जारी करें:
    result = self.device.adb.shell(‘ls')
    

वीटीएस शेल ड्राइवर का प्रयोग करें

वीटीएस शेल ड्राइवर एक एजेंट बाइनरी है जो डिवाइस पर चलता है और शेल कमांड निष्पादित करता है। डिफ़ॉल्ट रूप से, यदि ड्राइवर डिवाइस पर चल रहा है तो वीटीएस शेल ड्राइवर का उपयोग करता है क्योंकि इस विधि में adb shell कमांड का उपयोग करने की तुलना में कम विलंबता होती है।

चित्र 1. वीटीएस शेल ड्राइवर।

वीटीएस फ्रेमवर्क मल्टी-डिवाइस परीक्षण का समर्थन करता है जहां प्रत्येक एंड्रॉइड डिवाइस को बेस रनर में एंड्रॉइडडिवाइस ऑब्जेक्ट के रूप में दर्शाया जाता है। डिफ़ॉल्ट रूप से, वीटीएस फ्रेमवर्क प्रत्येक एंड्रॉइड डिवाइस पर वीटीएस एजेंट और वीटीएस शेल ड्राइवर बायनेरिज़ को धकेलता है और उन डिवाइसों पर वीटीएस एजेंटों के लिए टीसीपी कनेक्शन स्थापित करता है।

शेल कमांड निष्पादित करने के लिए, होस्ट-साइड पायथन स्क्रिप्ट AndroidDevice ऑब्जेक्ट के अंदर ShellMirror ऑब्जेक्ट पर एक फ़ंक्शन कॉल करती है। शेलमिरर ऑब्जेक्ट शेल कमांड टेक्स्ट को एक प्रोटोबफ संदेश में पैक करता है और इसे एंड्रॉइड डिवाइस पर वीटीएस एजेंट को (टीसीपी चैनल के माध्यम से) भेजता है। डिवाइस पर चलने वाला एजेंट यूनिक्स सॉकेट के माध्यम से शेल कमांड को वीटीएस शेल ड्राइवर को अग्रेषित करता है।

जब वीटीएस शेल ड्राइवर को शेल कमांड प्राप्त होता है, तो यह हैंग होने से रोकने के लिए डिवाइस शेल पर nohup के माध्यम से कमांड निष्पादित करता है। फिर स्टडआउट, stderr और रिटर्न कोड को nohup से पुनर्प्राप्त किया जाता है और VTS एजेंट को वापस भेज दिया जाता है। अंत में, एजेंट कमांड परिणाम को protobuf संदेश में लपेटकर होस्ट को उत्तर देता है।

लाभ

adb shell के बजाय वीटीएस शेल ड्राइवर का उपयोग करने के फायदों में शामिल हैं:

  • विश्वसनीयता. VTS शेल ड्राइवर डिफ़ॉल्ट सेटिंग पर कमांड निष्पादित करने के लिए nohup का उपयोग करता है। चूंकि वीटीएस परीक्षण ज्यादातर निचले स्तर के एचएएल और कर्नेल परीक्षण होते हैं, nohup सुनिश्चित करता है कि शेल कमांड निष्पादन के दौरान लटके नहीं।
  • प्रदर्शन । जबकि adb shell कमांड कुछ परिणामों को कैश करता है (जैसे निर्देशिका में फ़ाइलों को सूचीबद्ध करना) परीक्षण बाइनरी निष्पादित करने जैसे कार्यों को निष्पादित करते समय इसमें एक कनेक्शन ओवरहेड होता है। वीटीएस शेल ड्राइवर पूरे परीक्षण के दौरान एक सक्रिय कनेक्शन बनाए रखता है इसलिए एकमात्र ओवरहेड यूएसबी संचार है। हमारे परीक्षण में, एक खाली gtest बाइनरी पर 100 कॉल के साथ एक कमांड निष्पादित करने के लिए वीटीएस शेल ड्राइवर का उपयोग करना adb shell उपयोग करने की तुलना में लगभग 20 प्रतिशत तेज है; वास्तविक अंतर बड़ा है क्योंकि वीटीएस शेल संचार में व्यापक लॉगिंग है।
  • राज्यपालन । वीटीएस शेल ड्राइवर प्रत्येक टर्मिनल नाम के लिए एक टर्मिनल सत्र बनाए रखता है (डिफ़ॉल्ट टर्मिनल नाम डिफ़ॉल्ट है)। एक टर्मिनल सत्र में सेट किए गए पर्यावरण चर केवल उसी सत्र में बाद के कमांड के लिए उपलब्ध होते हैं।
  • विस्तार योग्य । भविष्य में संभावित संपीड़न, रिमोटिंग, एन्क्रिप्शन आदि को सक्षम करने के लिए वीटीएस फ्रेमवर्क और डिवाइस ड्राइवर के बीच शेल कमांड संचार को प्रोटोबफ़ में लपेटा गया है। प्रदर्शन में सुधार के लिए अन्य संभावनाएं भी उपलब्ध हैं, जिसमें डिवाइस-साइड परिणाम पार्सिंग भी शामिल है, जब संचार ओवरहेड परिणाम स्ट्रिंग पार्सिंग से बड़ा हो जाता है।

नुकसान

adb shell के बजाय वीटीएस शेल ड्राइवर का उपयोग करने के नुकसान में शामिल हैं:

  • अतिरिक्त बायनेरिज़ . वीटीएस एजेंट फ़ाइलों को डिवाइस पर धकेला जाना चाहिए और परीक्षण निष्पादन के बाद साफ़ किया जाना चाहिए।
  • सक्रिय कनेक्शन की आवश्यकता है . यदि परीक्षण के दौरान होस्ट और एजेंट के बीच टीसीपी कनेक्शन खो जाता है (यूएसबी डिस्कनेक्शन, पोर्ट शटडाउन, डिवाइस क्रैश आदि के कारण) जानबूझकर या अनजाने में, शेल कमांड वीटीएस एजेंट को प्रेषित नहीं किया जा सकता है। adb shell पर स्वचालित स्विचिंग के साथ भी, डिस्कनेक्शन से पहले कमांड का परिणाम और स्थिति अज्ञात होगी।

उदाहरण

वीटीएस होस्ट-साइड पायथन परीक्षण स्क्रिप्ट में शेल कमांड का उपयोग करने के उदाहरण:

  • एक 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')