Çok cihazlı modüller

Bu belgede, çok cihazlı modüller oluşturmayla ilgili adım adım talimatlar verilmekte ve bilinen mevcut sınırlamalar belirtilmektedir.

Örnek

CTS wifi-aware çoklu cihaz modülü sağlanır. Bir cihazdan kablosuz ağ üzerinden mesaj gönderir ve diğer cihazın mesajı aldığını doğrular.

Modülün kaynağı packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/ konumundadır.

Örneğe, faydalı olacağını düşündüğümüz kadar çok yorum ekledik.

1. adım: Modül klasörünü oluşturun

Paketteki çok cihazlı modülünüz için ait olduğu proje içinde bir klasör oluşturmanız önerilir. Örneğin: cts/hostsidetests/multidevices/. Örnekleri bulmayı kolaylaştırmak için tüm çok cihazlı modüllerin en azından başlangıçta aynı yerde kalmasını öneririz.

Bu modüle ait tüm dosyalar kendi modül klasörüne yerleştirilmelidir. Örneğin: wifi_aware.

2. adım: Testi oluşturun

Test mantığınızı burada uygularsınız. Bu, büyük ölçüde test edilen şeye bağlıdır.

Aşağıdaki gibi Mobly test kaynağını oluşturun: wifi_aware_test.py.

3. adım: Derleme dosyasını oluşturun: Android.bp

Aşağıdaki gibi bir Android.bp dosyası ekleyin: packages/modules/Wifi/tests/hostsidetests/multidevices/test/Android.bp. Aşağıdakine benzer bir python_test_host modülü tanımlayın:

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",
    ],
}

Veri alanı ile test için snippet'leri belirtin. Bu alan, ikili dosya ile paketlenir ve ATest veya sürekli yürütme ile testte bulunup yüklenebilir.

Mobly Bundled Snippets, Android'de external/mobly-bundled-snippets/ adresinde kullanılabilir.

İsteğe bağlı: Özel snippet'ler oluşturma

Bazı çok cihazlı modüller için özel Mobly snippet'leri gerekebilir. Örnek test, packages/modules/Wifi/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareSnippet.java konumunda Wi-Fi'ye duyarlı bir snippet içerir. Bu snippet, Android'de external/mobly-snippet-lib/ konumunda bulunan Mobly Snippet Lib ile oluşturulmuştur.

Snippet, Android.bp'de android_test kuralıyla tanımlanmalıdır. Örneğin: standart enstrümantasyon:

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. adım: Modül yapılandırmasını oluşturun: AndroidTest.xml

packages/modules/Wifi/tests/hostsidetests/multidevices/test/aware/AndroidTest.xml gibi bir AndroidTest.xml dosyası ekleyin. Bu test yapılandırmasında, test için iki cihaz belirtmeniz gerekir. Örneğin:

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

Unutmayın:

  • Bu örnek test, Mobly'ye bağımlıdır. PythonVirtualenvPreparer için herhangi bir bağımlılık belirtilebilir ve pip ile yüklenir.
  • MoblyBinaryHostTest için mobly-par-file-name, Android.bp'deki modül adıyla eşleşmelidir.
  • Test için bir mobly-test-timeout belirtin. Bu değer milisaniye cinsindendir ve Python ikili programının tüm yürütülmesine (tüm test senaryoları birlikte) uygulanır. Bu, bazı sorunlar olması durumunda test durumlarının sonsuza kadar takılı kalmasını önlemek için gereklidir.
  • Her device etiketi, her cihazda farklı bir kurulum içerebilir. Mobly yapılandırması, bunları XML'de belirtilen sırayla alır.

Snippet APK'sının yüklenmesiyle ilgili:

  • Kapsam ekibiyle yapılan görüşme nedeniyle ilk İOOY, hedef hazırlayıcı aracılığıyla snippet APK'larının yükleneceği şekilde güncellendi: Kapsam ölçümlerinin çok erken silinmemesini sağlamak için Python ikililerindeki test kodu yerine Harness tarafından yapılan kaldırma işlemi, zamanlama açısından daha iyi garantiler sunar.

5. adım: Testi yerel olarak çalıştırın: atest

Çok cihazlı testler şu anda yalnızca fiziksel cihazlarda çalıştırılmaktadır. Testi çalıştırmadan önce test cihazlarınızın uygun durumda olduğunu doğrulayın. adb devices komutu, bağlı cihazlarınızın listesini bildirmelidir. Liste, test için tasarlanmamış cihazlar içeriyorsa -s işaretini kullanarak test edilecek cihazları belirtin.

Kablosuz bağlantı testleri için cihazlarda (fabrika ayarlarına sıfırlamadan sonra) kablosuz bağlantının etkinleştirildiğinden emin olun.

Testi atest ile yerel olarak çalıştırabilirsiniz:

$ atest CtsWifiAwareTestCases

En son çıktıda özet başlığında kullanılan cihazların sayısını (ör. Test executed with 2 device(s)) görmeniz gerekir.

Sorun giderme

Test yerel olarak çalıştırılırken şu nedenlerle başarısız olursa:

Virtualenv hatası

java.io.IOException: Cannot run program
"virtualenv": error=2, No such file or directory

Lütfen virtualenv öğesinin PATH'inizde olduğundan emin olun. PATH'e"~/.local/bin" eklemek bu sorunu çözmelidir. virtualenv yüklü değilse şu adımları uygulayın: https://virtualenv.pypa.io/en/latest/installation.html

En az 2 denetleyici nesnesi alınması beklenirken 1 nesne alındı

Test modülleri çok cihazlı veya tek cihazlıdır, karma modül yoktur. Birden fazla cihaz olmadan çok cihazlı bir modülü çalıştırmaya çalışırsanız şu hatayı görürsünüz:

Expected to get at least 2 controller objects, got 1

Modülü çoklu cihaz modunda çalıştırmak sorunu çözecektir.

CTS için: Parçalama kullanarak (örneğin: --shard-count 2) veya run cts-multidevces ile tetikleyebilirsiniz.