कई डिवाइसों पर टेस्ट करना

वीटीएस, ऐसे टेस्ट के साथ काम करता है जिनके लिए कई Android डिवाइसों के बीच इंटरैक्शन की ज़रूरत होती है.

भवन निर्माण

VTS, TradeFed फ़्रेमवर्क का इस्तेमाल करके, डिवाइस के सीरियल नंबर हासिल करता है और उन्हें टेस्ट मॉड्यूल को पास करता है.

पहली इमेज. VTS, डिवाइस के सीरियल नंबर पास करता है.

डिवाइस से जुड़ी ज़रूरी शर्तें, जैसे कि डिवाइसों की संख्या और डिवाइसों के टाइप, टेस्ट प्लान कॉन्फ़िगरेशन में बताई गई हैं. उदाहरण के लिए, ऐसा टेस्ट प्लान तय किया जा सकता है जिसके लिए, Sailfish बिल्ड टारगेट वाले दो Android डिवाइसों की ज़रूरत हो.

डिवाइसों का बंटवारा

टेस्ट इन्फ़्रास्ट्रक्चर (आम तौर पर, टेस्ट शेड्यूलर) ऐसे डिवाइसों को उपलब्ध कराता है जो टेस्ट प्लान कॉन्फ़िगरेशन में बताई गई ज़रूरी शर्तों को पूरा करते हैं. ये डिवाइस, VTS फ़्रेमवर्क को उपलब्ध कराए जाते हैं. जिन डिवाइसों को टेस्ट प्लान के लिए असाइन किया गया है वे उसी के लिए रिज़र्व रहते हैं. भले ही, टेस्ट मॉड्यूल उनका इस्तेमाल न कर रहा हो. इसके बाद, VTS एजेंट बाइनरी को सभी चुने गए डिवाइसों पर पुश किया जाता है और उन पर चलाया जाता है. हालांकि, ऐसा तब तक किया जाता है, जब तक खास तौर पर उन्हें न चलाने का निर्देश न दिया जाए. इससे यह पक्का होता है कि शेल कमांड और HAL RPC के लिए टीसीपी कनेक्शन, टेस्ट स्क्रिप्ट में मौजूद सभी डिवाइसों के लिए उपलब्ध हैं.

टेस्ट तैयार करने वाले लोग

यह फ़्रेमवर्क, उन सभी डिवाइसों के लिए परीक्षा की तैयारी करने वालों की जांच करता है जिनके लिए इसे सीरियल नंबर मिले हैं. टारगेट करने वाले लोग, एक या एक से ज़्यादा डिवाइसों का इस्तेमाल कर सकते हैं:

  • एक डिवाइस के लिए टारगेट तैयार करने वाले (उदाहरण के लिए, VtsDeviceInfoCollector):
    • इसे सिर्फ़ टेस्ट प्लान कॉन्फ़िगरेशन में तय किया जा सकता है. इसके लिए, डिवाइसों की ज़रूरी सूची भी देनी होगी. आने वाले वर्शन में, इसे मॉड्यूल लेवल पर कॉन्फ़िगर किया जा सकेगा.
    • सिर्फ़ एक डिवाइस का सीरियल नंबर मिलेगा.
    • किसी डिवाइस के लिए, तैयारी और क्लीनअप के टास्क चलाएं.
  • एक से ज़्यादा डिवाइसों को टारगेट करने वाले प्रीपेयरर (उदाहरण के लिए, VtsPythonVirtualenvPreparer):
    • इसे टेस्ट प्लान कॉन्फ़िगरेशन या टेस्ट मॉड्यूल कॉन्फ़िगरेशन में शामिल किया जा सकता है
    • सभी डिवाइसों के सीरियल नंबर पाना
    • हर डिवाइस या सभी डिवाइसों के लिए, तैयारी और क्लीनअप के टास्क चलाएं.

टेस्ट मॉड्यूल

टेस्ट मॉड्यूल को डिवाइसों की सूची तब मिलती है, जब टेस्ट तैयार करने वाले लोग होस्ट/डिवाइसों को सेट अप कर लेते हैं. होस्ट-साइड पर मौजूद एक Python टेस्ट मॉड्यूल, हर मल्टी-डिवाइस टेस्ट मॉड्यूल के लिए चलता है. Android डिवाइसों को Python टेस्ट मॉड्यूल से ऐक्सेस किया जा सकता है. इसके लिए, उन्हें AndroidDevice ऑब्जेक्ट की सूची के तौर पर ऐक्सेस किया जाता है:

devices = self.android_devices
device1 = devices[0]
device1_serial = device1.serial

टेस्ट प्लान में शामिल सभी डिवाइसों को टेस्ट प्लान के लिए रिज़र्व किया जाता है. भले ही, प्लान में शामिल टेस्ट मॉड्यूल सिर्फ़ एक डिवाइस का इस्तेमाल कर रहा हो.

जांच के दौरान डिवाइसों के बीच कम्यूनिकेशन

मल्टी-Android टेस्ट को असरदार बनाने के लिए, असाइन किए गए डिवाइसों के बीच कम्यूनिकेशन होना ज़रूरी है. इस तरह के टेस्ट डेवलप करते समय, आपको यह तय करना होगा कि असाइन किए गए डिवाइसों के बीच कम्यूनिकेशन कैसे किया जाए. यहां तीन उदाहरण दिए गए हैं कि किस तरह से कम्यूनिकेट किया जा सकता है. हालांकि, टेस्ट डेवलपर के पास अन्य मॉडल डिज़ाइन करने का विकल्प भी होता है.

टाइप 1: होस्ट-साइड HAL टेस्ट

होस्ट-साइड एचएएल टेस्ट, वीटीएस एचएएल ड्राइवर का इस्तेमाल कर सकते हैं. इन्हें डिफ़ॉल्ट रूप से डिवाइसों पर पुश किया जाता है:

दूसरी इमेज. होस्ट-साइड एचएएल टेस्ट.

इस उदाहरण में:

  • टेस्ट लॉजिक, होस्ट पर काम करता है.
  • होस्ट-साइड टेस्ट स्क्रिप्ट, हर डिवाइस पर ड्राइवर को आरपीसी कॉल करती है.
  • होस्ट, डिवाइस इंटरैक्शन को कोऑर्डिनेट करता है.

टाइप 2: होस्ट-साइड एजेंट पर आधारित टेस्ट

डिवाइस पर वीटीएस एजेंट का इस्तेमाल करने के बजाय, होस्ट-साइड टेस्ट भी हर डिवाइस पर अपना एजेंट (ऐप्लिकेशन या बाइनरी) पुश कर सकता है:

तीसरी इमेज. होस्ट-साइड पर, एजेंट पर आधारित टेस्ट.

इस उदाहरण में:

  • टेस्ट लॉजिक, होस्ट पर काम करता है.
  • हर डिवाइस पर एजेंट ऐप्लिकेशन (या बाइनरी) इंस्टॉल होता है.
  • होस्ट-साइड टेस्ट स्क्रिप्ट, हर डिवाइस पर मौजूद ऐप्लिकेशन को निर्देश देती है.
  • होस्ट, डिवाइस इंटरैक्शन को कोऑर्डिनेट करता है.

उदाहरण के लिए, मौजूदा वीटीएस रेपो में Next Billion User टेस्ट, होस्ट-साइड, ऐप्लिकेशन पर आधारित, और एक से ज़्यादा डिवाइस पर किए जाने वाले टेस्ट हैं.

टाइप 3: टारगेट-साइड एचआईडीएल टेस्ट

टारगेट-साइड पर, एक से ज़्यादा डिवाइसों पर किए जाने वाले 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 codelab देखें.

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')