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

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

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

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

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

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

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

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

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

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

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

लाभ

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

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

नुकसान

के बजाय वीटीएस खोल ड्राइवर का उपयोग करने का नुकसान 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')