मल्टी-डिवाइस मॉड्यूल

इस दस्तावेज़ में, एक से ज़्यादा डिवाइसों पर काम करने वाले मॉड्यूल बनाने के बारे में सिलसिलेवार निर्देश दिए गए हैं. साथ ही, इसमें मौजूदा सीमाओं के बारे में भी बताया गया है.

सैंपल

CTS वाई-फ़ाई अवेयर मल्टी-डिवाइस मॉड्यूल उपलब्ध कराया गया है. यह कुकी, वाई-फ़ाई पर एक डिवाइस से मैसेज भेजती है और पुष्टि करती है कि दूसरे डिवाइस को मैसेज मिला है.

मॉड्यूल का सोर्स, packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/ पर है.

हमने उदाहरण में ज़्यादा से ज़्यादा टिप्पणियां जोड़ी हैं, ताकि आपको बेहतर तरीके से समझ आ सके.

पहला चरण: मॉड्यूल फ़ोल्डर बनाना

हमारा सुझाव है कि आप अपने मल्टी-डिवाइस मॉड्यूल के लिए, उस सुइट प्रोजेक्ट में एक फ़ोल्डर बनाएं जिससे वह जुड़ा है. उदाहरण के लिए: cts/hostsidetests/multidevices/. हमारा सुझाव है कि सभी मल्टी-डिवाइस मॉड्यूल को कम से कम पहली बार एक साथ रखा जाए. इससे उदाहरणों को ढूंढना आसान हो जाएगा.

इस मॉड्यूल की सभी फ़ाइलों को, उनके मॉड्यूल फ़ोल्डर में रखा जाना चाहिए. उदाहरण के लिए: wifi_aware.

दूसरा चरण: टेस्ट बनाना

यहां टेस्ट लॉजिक लागू किया जाता है. यह इस बात पर निर्भर करता है कि किस चीज़ की जांच की जा रही है.

Mobly टेस्ट सोर्स बनाएं. जैसे: wifi_aware_test.py.

तीसरा चरण: 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 Bundled Snippets, Android में external/mobly-bundled-snippets/ पर उपलब्ध हैं.

ज़रूरी नहीं: कस्टम स्निपेट बनाएं

कुछ मल्टी-डिवाइस मॉड्यूल के लिए, कस्टम Mobly स्निपेट की ज़रूरत पड़ सकती है. सैंपल टेस्ट में, वाई-फ़ाई अवेयरनेस की सुविधा वाला एक स्निपेट शामिल है. यह स्निपेट यहां मौजूद है: packages/modules/Wifi/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareSnippet.java. इसे Mobly Snippet 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",
    ],
}

चौथा चरण: मॉड्यूल कॉन्फ़िगरेशन बनाना: AndroidTest.xml

AndroidTest.xml फ़ाइल जोड़ें. जैसे, packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/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 के साथ इंस्टॉल किया जाएगा.
  • mobly-par-file-namefor MoblyBinaryHostTest, Android.bp में दिए गए मॉड्यूल के नाम से मेल खाना चाहिए.
  • टेस्ट के लिए mobly-test-timeout तय करें. यह मिलीसेकंड में होता है और यह पूरे Python बाइनरी एक्ज़ीक्यूशन (सभी टेस्ट केस एक साथ) पर लागू होता है. कुछ समस्याओं की वजह से, टेस्ट केस हमेशा के लिए रुक जाते हैं. ऐसा न हो, इसके लिए यह ज़रूरी है.
  • हर device टैग में, हर डिवाइस के लिए अलग-अलग सेटअप हो सकता है. Mobly कॉन्फ़िगरेशन को ये टैग उसी क्रम में मिलेंगे जिस क्रम में इन्हें एक्सएमएल में तय किया गया है.

स्निपेट ऐप्लिकेशन को इंस्टॉल करने से जुड़ी समस्या:

  • कवरेज टीम के साथ बातचीत के बाद, शुरुआती पीओसी को अपडेट कर दिया गया है. अब target_preparer के ज़रिए स्निपेट APK इंस्टॉल किए जा सकते हैं: कवरेज मेज़रमेंट को बहुत जल्दी न मिटाया जाए, इसके लिए Harness के ज़रिए अनइंस्टॉल करने का विकल्प चुना गया है. Python बाइनरी में टेस्ट कोड के ज़रिए अनइंस्टॉल करने के विकल्प की तुलना में, Harness के ज़रिए अनइंस्टॉल करने के विकल्प में समय के हिसाब से बेहतर गारंटी मिलती है.

पांचवां चरण: लोकल लेवल पर जांच करना: atest

फ़िलहाल, एक से ज़्यादा डिवाइसों पर टेस्ट करने की सुविधा सिर्फ़ फ़िज़िकल डिवाइसों पर काम करती है. जांच शुरू करने से पहले, पुष्टि करें कि आपके टेस्ट डिवाइस सही स्थिति में हैं. adb devices कमांड से, कनेक्ट किए गए डिवाइसों की सूची दिखनी चाहिए. अगर सूची में ऐसे डिवाइस शामिल हैं जिनका इस्तेमाल टेस्टिंग के लिए नहीं किया जाना है, तो -s फ़्लैग का इस्तेमाल करके, टेस्ट के लिए डिवाइसों के बारे में बताएं.

वाई-फ़ाई की जांच के लिए, पक्का करें कि डिवाइसों पर वाई-फ़ाई चालू हो (फ़ैक्ट्री रीसेट के बाद).

atest की मदद से, टेस्ट को स्थानीय तौर पर चलाया जा सकता है:

$ atest CtsWifiAwareTestCases

आपको atest output में, खास जानकारी वाले हेडिंग में इस्तेमाल किए गए डिवाइसों की संख्या दिखेगी. यह 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.