इस दस्तावेज़ में, मल्टी-डिवाइस मॉड्यूल बनाने के बारे में सिलसिलेवार निर्देश दिए गए हैं. साथ ही, इसमें मौजूदा सीमाओं के बारे में भी बताया गया है.
नमूना
सीटीएस वाई-फ़ाई अवेयर मल्टी-डिवाइस मॉड्यूल उपलब्ध कराया गया है. यह कुकी, वाई-फ़ाई पर एक डिवाइस से मैसेज भेजती है और पुष्टि करती है कि दूसरे डिवाइस को मैसेज मिला है.
मॉड्यूल का सोर्स, packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/ पर मौजूद है.
हमने उदाहरण में ज़्यादा से ज़्यादा टिप्पणियां जोड़ी हैं, ताकि यह आपके लिए काम का साबित हो.
चरण 1: मॉड्यूल फ़ोल्डर बनाना
हमारा सुझाव है कि एक से ज़्यादा डिवाइसों पर काम करने वाले मॉड्यूल के लिए, उस सुइट प्रोजेक्ट में एक फ़ोल्डर बनाएं जिससे वह जुड़ा है. उदाहरण के लिए: cts/hostsidetests/multidevices/. हमारा सुझाव है कि एक से ज़्यादा डिवाइसों पर काम करने वाले सभी मॉड्यूल को कम से कम शुरुआत में एक ही जगह पर रखा जाए. इससे उदाहरणों को ढूंढना आसान हो जाएगा.
इस मॉड्यूल की सभी फ़ाइलें, उसके मॉड्यूल फ़ोल्डर में होनी चाहिए. उदाहरण के लिए: wifi_aware.
चरण 2: टेस्ट बनाना
यहां आपको टेस्ट लॉजिक लागू करना होगा. यह इस पर निर्भर करता है कि किस चीज़ की जांच की जा रही है.
Mobly टेस्ट सोर्स बनाएं. जैसे: wifi_aware_test.py.
चरण 3: Android.bp नाम की बिल्ड फ़ाइल बनाना
packages/modules/Wifi/tests/hostsidetests/multidevices/test/Android.bp जैसी Android.bp फ़ाइल जोड़ें. python_test_host मॉड्यूल तय करें. यह इस तरह का होना चाहिए:
python_test_host {
name: "CtsWifiAwareTestCases",
main: "wifi_aware_test.py",
srcs: ["wifi_aware_test.py"],
test_suites: [
"cts",
"general-tests",
],
test_options: {
unit_test: false,
},
data: [
// Package the snippet with the mobly test
":wifi_aware_snippet",
],
}
डेटा फ़ील्ड की मदद से, टेस्ट के लिए स्निपेट तय करें. इन्हें बाइनरी के साथ पैक किया जाएगा. साथ ही, इन्हें ATest या लगातार एक्ज़ीक्यूशन की मदद से, टेस्ट में ढूंढकर इंस्टॉल किया जा सकता है.
Mobly बंडल किए गए स्निपेट, Android में external/mobly-bundled-snippets/ पर उपलब्ध हैं.
ज़रूरी नहीं: कस्टम स्निपेट बनाना
कुछ मल्टी-डिवाइस मॉड्यूल के लिए, Mobly के कस्टम स्निपेट की ज़रूरत पड़ सकती है. सैंपल टेस्ट में, वाई-फ़ाई अवेयर स्निपेट शामिल है. यहpackages/modules/Wifi/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareSnippet.javaपर मौजूद है. इसे Mobly स्निपेट Lib की मदद से बनाया गया है. यह Android में यहां उपलब्ध है: external/mobly-snippet-lib/.
स्निपेट को Android.bp में android_test नियम के साथ तय किया जाना चाहिए. यह स्टैंडर्ड इंस्ट्रूमेंटेशन की तरह होना चाहिए:
android_test {
name: "wifi_aware_snippet",
sdk_version: "current",
srcs: [
"CallbackUtils.java",
"WifiAwareSnippet.java",
],
manifest: "AndroidManifest.xml",
static_libs: [
"androidx.test.runner",
"guava",
"mobly-snippet-lib",
],
}
चरण 4: मॉड्यूल कॉन्फ़िगरेशन बनाना: AndroidTest.xml
packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/AndroidTest.xml जैसी AndroidTest.xml फ़ाइल जोड़ें. इस टेस्ट कॉन्फ़िगरेशन में, आपको टेस्ट के लिए दो डिवाइस तय करने होंगे. यह इस तरह का होना चाहिए:
<configuration description="Config for CTS Wifi Aware test cases">
<option name="test-suite-tag" value="cts" />
<option name="config-descriptor:metadata" key="component" value="wifi" />
<option name="config-descriptor:metadata" key="parameter" value="not_instant_app" />
<option name="config-descriptor:metadata" key="parameter" value="not_multi_abi" />
<option name="config-descriptor:metadata" key="parameter" value="not_secondary_user" />
<device name="device1">
<!-- For coverage to work, the APK should not be uninstalled until after coverage is pulled.
So it's a lot easier to install APKs outside the python code.
-->
<target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
<option name="test-file-name" value="wifi_aware_snippet.apk" />
</target_preparer>
<target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
<option name="run-command" value="input keyevent KEYCODE_WAKEUP" />
<option name="run-command" value="wm dismiss-keyguard" />
</target_preparer>
<target_preparer class="com.android.tradefed.targetprep.PythonVirtualenvPreparer">
<!-- Any python dependencies can be specified and will be installed with pip -->
<option name="dep-module" value="mobly" />
</target_preparer>
</device>
<device name="device2">
<target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
<option name="test-file-name" value="wifi_aware_snippet.apk" />
</target_preparer>
<target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
<option name="run-command" value="input keyevent KEYCODE_WAKEUP" />
<option name="run-command" value="wm dismiss-keyguard" />
</target_preparer>
</device>
<test class="com.android.tradefed.testtype.mobly.MoblyBinaryHostTest">
<!-- The mobly-par-file-name should match the module name -->
<option name="mobly-par-file-name" value="CtsWifiAwareTestCases" />
<!-- Timeout limit in milliseconds for all test cases of the python binary -->
<option name="mobly-test-timeout" value="60000" />
</test>
</configuration>
ध्यान दें:
- इस सैंपल टेस्ट के लिए, Mobly पर डिपेंडेंसी है.
PythonVirtualenvPreparerके लिए कोई भी डिपेंडेंसी तय की जा सकती है. इसे pip की मदद से इंस्टॉल किया जाएगा. MoblyBinaryHostTestके लिए,mobly-par-file-name, Android.bp में मौजूद मॉड्यूल के नाम से मेल खाना चाहिए.- टेस्ट के लिए,
mobly-test-timeoutतय करें. यह मिलीसेकंड में होता है और यह पूरे Python बाइनरी एक्ज़ीक्यूशन (सभी टेस्ट केस एक साथ) पर लागू होता है. ऐसा इसलिए ज़रूरी है, ताकि कुछ समस्याओं की वजह से टेस्ट केस हमेशा के लिए न अटक जाएं. - हर
deviceटैग में, हर डिवाइस के लिए अलग-अलग सेटअप हो सकता है. Mobly कॉन्फ़िगरेशन को ये सेटअप, एक्सएमएल में तय किए गए क्रम में मिलेंगे.
स्निपेट APK को इंस्टॉल करने से जुड़ी समस्या:
- कवरेज टीम से बातचीत के बाद, शुरुआती पीओसी को अपडेट कर दिया गया है. अब target_preparer की मदद से, स्निपेट APK इंस्टॉल किए जा सकते हैं. ऐसा इसलिए किया गया है, ताकि कवरेज मेज़रमेंट को बहुत जल्द न मिटाया जाए. Python बाइनरी में टेस्ट कोड के बजाय, Harness की मदद से अनइंस्टॉल करने पर, टाइमिंग के मामले में बेहतर गारंटी मिलती है.
चरण 5: लोकल लेवल पर जांच करना: atest
फ़िलहाल, मल्टी-डिवाइस टेस्ट सिर्फ़ फ़िज़िकल डिवाइसों पर काम करते हैं. टेस्ट चलाने से पहले, पुष्टि करें कि आपके टेस्ट डिवाइस सही स्थिति में हैं. adb
devices कमांड से, कनेक्ट किए गए डिवाइसों की सूची दिखनी चाहिए. अगर सूची में ऐसे डिवाइस शामिल हैं जिनका इस्तेमाल टेस्ट के लिए नहीं किया जाना है, तो -s फ़्लैग का इस्तेमाल करके, टेस्ट के लिए डिवाइस तय करें.
वाई-फ़ाई टेस्ट के लिए, पक्का करें कि डिवाइसों के लिए वाई-फ़ाई चालू हो (फ़ैक्ट्री रीसेट के बाद).
atest की मदद से, टेस्ट को लोकल लेवल पर चलाया जा सकता है:
$ atest CtsWifiAwareTestCases
आपको atest के आउटपुट में, डिवाइसों की संख्या दिखनी चाहिए. यह संख्या, खास जानकारी के हेडिंग में दिखती है. जैसे, Test executed with 2 device(s).
समस्या का हल
अगर लोकल लेवल पर टेस्ट चलाने पर, इन वजहों से टेस्ट फ़ेल हो जाता है:
Virtualenv से जुड़ी गड़बड़ी
java.io.IOException: Cannot run program
"virtualenv": error=2, No such file or directory
कृपया पक्का करें कि virtualenv आपके PATH में हो. PATH में "~/.local/bin" जोड़ने से यह समस्या ठीक हो जाएगी. अगर virtualenv इंस्टॉल नहीं है, तो यह तरीका अपनाएं: https://virtualenv.pypa.io/en/latest/installation.html
कम से कम दो कंट्रोलर ऑब्जेक्ट मिलने चाहिए थे, लेकिन एक मिला
टेस्ट मॉड्यूल, एक से ज़्यादा डिवाइसों या एक डिवाइस वाले होते हैं. इनमें मिक्स्ड-मॉड्यूल नहीं होते. अगर एक से ज़्यादा डिवाइसों पर काम करने वाले मॉड्यूल को एक से ज़्यादा डिवाइसों के बिना चलाने की कोशिश की जाती है, तो आपको यह गड़बड़ी दिखेगी:
Expected to get at least 2 controller objects, got 1
एक से ज़्यादा डिवाइसों के मोड में मॉड्यूल को चलाने से, यह समस्या ठीक हो जाएगी.
सीटीएस के लिए: इसे ट्रिगर करने के लिए, शार्डिंग का इस्तेमाल किया जा सकता है. उदाहरण के लिए: --shard-count 2 या run cts-multidevces.