VTS उन टेस्ट के साथ काम करता है जिनमें एक से ज़्यादा Android डिवाइसों के बीच इंटरैक्शन की ज़रूरत होती है.
भवन निर्माण
VTS, TradeFed फ़्रेमवर्क का इस्तेमाल करके, डिवाइस के सीरियल नंबर को टेस्ट मॉड्यूल को पास करता है.
डिवाइस की ज़रूरी शर्तें, जैसे कि डिवाइसों की संख्या और डिवाइस के टाइप, जांच के प्लान के कॉन्फ़िगरेशन में बताई गई होती हैं. उदाहरण के लिए, ऐसा टेस्ट प्लान तय किया जा सकता है जिसमें Sailfish के लिए बने टारगेट वाले दो Android डिवाइसों की ज़रूरत हो.
डिवाइस का बंटवारा
टेस्ट इन्फ़्रास्ट्रक्चर (आम तौर पर टेस्ट शेड्यूलर), VTS फ़्रेमवर्क के लिए, टेस्ट प्लान कॉन्फ़िगरेशन में बताई गई ज़रूरी शर्तों को पूरा करने वाले डिवाइसों को ऐलोकेट करता है. डिवाइसों को टेस्ट प्लान के लिए रिज़र्व किया जाता है. भले ही, टेस्ट मॉड्यूल उनका इस्तेमाल न कर रहा हो. इसके बाद, VTS एजेंट बाइनरी को उन सभी डिवाइसों पर पुश किया जाता है और चलाया जाता है जिन्हें इसके लिए चुना गया है. हालांकि, ऐसा तब तक नहीं किया जाता, जब तक खास तौर पर इसे चलाने का निर्देश न दिया गया हो. इससे यह पक्का होता है कि टेस्ट स्क्रिप्ट में मौजूद सभी डिवाइसों के लिए, शेल कमांड और HAL आरपीसी के टीसीपी कनेक्शन उपलब्ध हों.
टेस्ट तैयार करने वाले
फ़्रेमवर्क उन सभी डिवाइसों के लिए टेस्ट तैयार करने वाले टूल चलाता है जिनके लिए उसे सीरियल नंबर मिले हैं. टारगेट तैयार करने वाले एक या एक से ज़्यादा डिवाइसों का इस्तेमाल कर सकते हैं:
- एक डिवाइस के लिए टारगेट तैयार करने वाले टूल (उदाहरण के लिए, VtsDeviceInfoCollector):
- इसे सिर्फ़ टेस्ट प्लान कॉन्फ़िगरेशन में, ज़रूरी डिवाइस सूची के साथ बताया जा सकता है. आने वाले वर्शन में, मॉड्यूल लेवल पर कॉन्फ़िगरेशन की अनुमति होगी.
- आपको सिर्फ़ एक डिवाइस का सीरियल नंबर मिलेगा.
- किसी डिवाइस के लिए, तैयारी और क्लीनअप टास्क चलाएं.
- एक से ज़्यादा डिवाइसों के लिए टारगेट तैयार करने वाले टूल (उदाहरण के लिए,
VtsPythonVirtualenvPreparer):
- टेस्ट प्लान कॉन्फ़िगरेशन या टेस्ट मॉड्यूल कॉन्फ़िगरेशन में बताया जा सकता है
- सभी डिवाइसों के सीरियल नंबर पाना
- हर डिवाइस या सभी डिवाइसों के लिए, तैयारी और क्लीनअप करने वाले टास्क चलाएं.
टेस्ट मॉड्यूल
टेस्ट तैयार करने वाले लोग, होस्ट/डिवाइसों का सेट अप पूरा करने के बाद, टेस्ट मॉड्यूल को डिवाइसों की सूची देते हैं. हर मल्टी-डिवाइस टेस्ट मॉड्यूल के लिए, होस्ट-साइड का एक Python टेस्ट मॉड्यूल चलता है. डिवाइसों को Python टेस्ट मॉड्यूल से ऐक्सेस किया जा सकता है. ये डिवाइस, AndroidDevice ऑब्जेक्ट की सूची के तौर पर दिखते हैं:
devices = self.android_devices device1 = devices[0] device1_serial = device1.serial
टेस्ट प्लान के लिए, सभी डिवाइसों को रिज़र्व कर दिया जाता है. भले ही, प्लान में मौजूद टेस्ट मॉड्यूल सिर्फ़ एक डिवाइस का इस्तेमाल कर रहा हो.
जांच के दौरान डिवाइस के साथ कम्यूनिकेशन
एक से ज़्यादा Android डिवाइसों पर असरदार तरीके से टेस्ट करने के लिए, डिवाइसों के बीच कम्यूनिकेशन की ज़रूरत होती है. इस तरह के टेस्ट बनाते समय, आपको यह तय करना होगा कि डिवाइसों के बीच कम्यूनिकेशन कैसे शुरू किया जाए. नीचे दिए गए सेक्शन में, कम्यूनिकेशन के तीन उदाहरण दिए गए हैं. हालांकि, टेस्ट डेवलपर चाहें, तो दूसरे मॉडल भी डिज़ाइन कर सकते हैं.
टाइप 1: होस्ट-साइड HAL टेस्ट
होस्ट-साइड एचएएल टेस्ट, डिफ़ॉल्ट रूप से डिवाइसों पर पुश किए गए, VTS एचएएल ड्राइवर का इस्तेमाल कर सकते हैं:
इस स्थिति में:
- टेस्ट लॉजिक, होस्ट पर लागू होता है.
- होस्ट-साइड टेस्ट स्क्रिप्ट, हर डिवाइस पर ड्राइवर को आरपीसी कॉल भेजती है.
- होस्ट साइड, डिवाइस इंटरैक्शन को कोऑर्डिनेट करता है.
दूसरा टाइप: होस्ट-साइड एजेंट-आधारित टेस्ट
डिवाइस पर VTS एजेंट का इस्तेमाल करने के बजाय, होस्ट-साइड टेस्ट हर डिवाइस पर अपना एजेंट (ऐप्लिकेशन या बाइनरी) भी पुश कर सकता है:
इस स्थिति में:
- टेस्ट लॉजिक, होस्ट पर लागू होता है.
- एजेंट ऐप्लिकेशन (या बाइनरी) हर डिवाइस पर इंस्टॉल होता है.
- होस्ट-साइड टेस्ट स्क्रिप्ट, हर डिवाइस पर ऐप्लिकेशन को निर्देश देती है.
- होस्ट साइड, डिवाइस इंटरैक्शन को कोऑर्डिनेट करता है.
उदाहरण के लिए, मौजूदा VTS repo में Next Billion User tests, होस्ट-साइड, ऐप्लिकेशन-आधारित, और कई डिवाइसों पर किए जाने वाले टेस्ट हैं.
तीसरा टाइप: टारगेट-साइड HIDL टेस्ट
टारगेट-साइड, मल्टी-डिवाइस HIDL टेस्ट, डिवाइस-साइड टेस्ट बाइनरी पर सभी टेस्ट लॉजिक डालते हैं. इसके लिए, टेस्ट के दौरान डिवाइसों को सिंक करना ज़रूरी होता है:
इस स्थिति में:
- टेस्ट लॉजिक, डिवाइसों पर लागू होता है.
- होस्ट-साइड फ़्रेमवर्क, डिवाइस की शुरुआती पहचान करता है.
- टारगेट-साइड टेस्ट बाइनरी को सिंक करने की ज़रूरत है:
- सभी डिवाइसों के लिए एक ही टेस्ट बाइनरी.
- हर भूमिका के लिए अलग-अलग टेस्ट बाइनरी.
उदाहरण: कई डिवाइसों के लिए टेस्ट प्लान
इस उदाहरण में, दो डिवाइसों के लिए कॉन्फ़िगरेशन बताया गया है:
- डिवाइस 1 में, बिल्ड उपलब्ध कराने वाली कंपनी और
VtsDeviceInfoCollector
टारगेट तैयार करने वाला टूल शामिल है. - डिवाइस 2 में एक अतिरिक्त
FilePusher
प्रिपरर शामिल होता है, जो होस्ट से जुड़ी फ़ाइलों के ग्रुप को डिवाइस पर पुश करता है.
<configuration description="VTS Codelab Plan"> ... <device name="device1"> <build_provider class="com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider" /> <target_preparer class="com.android.tradefed.targetprep.VtsDeviceInfoCollector" /> </device> <device name="device2" > <build_provider class="com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider" /> <target_preparer class="com.android.tradefed.targetprep.VtsDeviceInfoCollector" /> <target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsFilePusher"> <option name="push-group" value="HostDrivenTest.push" /> </target_preparer> </device> <option name="compatibility:include-filter" value="VtsCodelabHelloWorldMultiDeviceTest" /> </configuration>
उदाहरण: होस्ट-साइड Python टेस्ट स्क्रिप्ट
टेस्ट तैयार करने वाले टूल के बारे में ज़्यादा जानकारी और उदाहरणों के लिए, टेस्ट तैयार करने वाले टूल देखें. होस्ट-साइड पर, एक से ज़्यादा डिवाइसों के लिए पूरी जानकारी वाला उदाहरण देखने के लिए, hello_world_multi कोडलैब देखें.
def setUpClass(self): logging.info('number of device: %s', self.android_devices) asserts.assertEqual(len(self.android_devices), 2, 'number of device is wrong.') self.dut1 = self.android_devices[0] self.dut2 = self.android_devices[1] self.shell1 = self.dut1.shell self.shell2 = self.dut2.shell def testSerialNotEqual(self): '''Checks serial number from two device not being equal.''' command = 'getprop | grep ro.serial' res1 = self.shell1.Execute(command) res2 = self.shell2.Execute(command) def getSerialFromShellOutput(output): '''Get serial from getprop query''' return output[const.STDOUT][0].strip().split(' ')[-1][1:-1] serial1 = getSerialFromShellOutput(res1) serial2 = getSerialFromShellOutput(res2) logging.info('Serial number of device 1 shell output: %s', serial1) logging.info('Serial number of device 2 shell output: %s', serial2) asserts.assertNotEqual(serial1, serial2, 'serials from two devices should not be the same') asserts.assertEqual(serial1, self.dut1.serial, 'serial got from device system property is different from allocated serial') asserts.assertEqual(serial2, self.dut2.serial, 'serial got from device system property is different from allocated serial')