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

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

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

एडीबी शेल का उपयोग करना

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

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

VTS शेल ड्राइवर का उपयोग करना

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

चित्रा 1. वीटीएस खोल चालक।

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

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

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

लाभ

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

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

नुकसान

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

  • अतिरिक्त बायनेरिज़ । वीटीएस एजेंट फाइलों को डिवाइस पर पुश किया जाना चाहिए और परीक्षण निष्पादन के बाद साफ किया जाना चाहिए।
  • सक्रिय कनेक्शन की आवश्यकता है । यदि परीक्षण के दौरान होस्ट और एजेंट के बीच टीसीपी कनेक्शन खो जाता है (USB डिस्कनेक्शन, पोर्ट शटडाउन, डिवाइस क्रैश, आदि के कारण) या तो जानबूझकर या अनजाने में, एक शेल कमांड VTS एजेंट को प्रेषित नहीं किया जा सकता है। यहां तक ​​​​कि स्वचालित रूप से 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')