Farklı cihazlara yönelik modüller

Bu belgede, birden çok cihaza yönelik modüllerin nasıl oluşturulacağıyla ilgili adım adım talimatlar yer almaktadır. Ayrıca, biliniyorsa mevcut sınırlamalar da bildirilmektedir.

Örnek

CTS kablosuz bağlantıya duyarlı çoklu cihaz modülü sağlanır. Bir cihazdan kablosuz ağ üzerinden mesaj gönderir ve diğer cihazın bu mesajı aldığını doğrular.

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

Örneği, yararlı olduğunu düşündüğümüz kadar yorumla notlandırdık.

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

Ait olduğu paket projesinde çok cihazlı modülünüz için bir klasör oluşturmanız önerilir. Örneğin: cts/hostsidetests/multidevices/. Bu, tüm çok cihazlı modüllerin en azından ilk başta birlikte yerleştirilmeye devam etmesi için önerilir. Bu, örneklerin bulunmasını kolaylaştırır.

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

2. adım: Testi oluşturun

Test mantığınızı burada uygularsınız. Büyük ölçüde test edilen noktalara bağlıdır.

Mobly test kaynağını oluşturun. Örneğin: wifi_aware_test.py.

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

packages/modules/Wifi/tests/hostsidetests/multidevices/test/Android.bp gibi bir Android.bp dosyası ekleyin. 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ıyla test için snippet'leri belirtin. Bu snippet'ler ikili kodla paketlenir ve ATest tarafından testte bulunup yüklenebilir veya sürekli yürütme sırasında bulunup yüklenebilir.

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

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

Birden çok cihaza yönelik bazı modüller özel Mobly snippet'leri gerektirebilir. Örnek test, packages/modules/Wifi/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareSnippet.java adresinde bulunan kablosuz bağlantıya duyarlı bir snippet içerir. Bu snippet, Android'de external/mobly-snippet-lib/ adresinde bulunan Mobly Snippet Lib ile oluşturulmuştur.

Kod snippet'i, Android.bp'de standart enstrümantasyon gibi android_test kuralıyla tanımlanmalıdır:

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 aşağıdakine benzer iki cihaz belirtmeniz gerekir:

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

Not:

  • Bu örnek testte Mobly bağımlılığı vardır. PythonVirtualenvPreparer için herhangi bir bağımlılık belirtilebilir ve pip ile yüklenir.
  • MoblyBinaryHostTest için mobly-par-file-name değeri, Android.bp'deki modül adıyla eşleşmelidir.
  • Test için bir mobly-test-timeout belirtin. Milisaniye cinsindendir ve python ikili program yürütmesinin tamamı için geçerlidir (tüm test durumları birlikte). Bu, bazı sorunlar yaşanması halinde test durumlarının sonsuza kadar askıya alınmasını önlemek için gereklidir.
  • Her device etiketi her cihazda farklı bir kurulum içerebilir. Mobly yapılandırması, bunları XML'de belirtildiği sırayla alır.

Snippet apk'sinin yüklenmesiyle ilgili:

  • İlk POC, kapsam ekibiyle yapılan görüşmeden sonra snippet APK'larını target_preparer aracılığıyla yükleyecek şekilde güncellendi: Kapsam ölçümlerinin çok erken silinmediğinden emin olmak için Python ikili dosyalarındaki test kodu yerine Harness ile 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ışır. Testi çalıştırmadan önce test cihazlarınızın doğru durumda olduğundan emin olun. adb devices komutu, bağlı cihazlarınızın listesini bildirmelidir. Listede test için tasarlanmamış cihazlar varsa -s işaretçisini kullanarak test için cihazları belirtin.

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

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

$ atest CtsWifiAwareTestCases

Test çıktısında özet başlığında kullanılan cihaz sayısını (Test executed with 2 device(s) gibi) görürsünüz.

Sorun giderme

Test, yerel olarak çalıştırıldığında aşağıdaki nedenlerle başarısız olursa:

Virtualenv hatası

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

Lütfen PATH'inizde virtualenv dosyasının bulunduğundan emin olun. PATH'e"~/.local/bin" eklendiğinde bu sorun düzelir. virtualenv yüklü değilse https://virtualenv.pypa.io/en/latest/installation.html adresini ziyaret edin.

En az 2 denetleyici nesnesi alınması bekleniyor ancak 1 tane alındı

Test modülleri çok cihazlı veya tek cihazlıdır. Karışık modüller yoktur. Birden fazla cihaz olmadan birden çok cihaz modülünü çalıştırmaya çalışırsanız şu hatayı alı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: Tetiklemek için parçalamayı kullanabilirsiniz (Örneğin: --shard-count 2) veya run cts-multidevces.