Çoklu cihaz modülleri

Bu belge, çoklu cihaz modüllerinin nasıl oluşturulacağına ilişkin adım adım talimatlar sağlar ve bilindiği takdirde mevcut sınırlamalara değinir.

Örnek

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

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

Örneğe yararlı olduğunu düşündüğümüz kadar yorum ekledik.

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

Çoklu cihaz modülünüz için ait olduğu süit projesinde bir klasör oluşturmanız önerilir. Örneğin: cts/hostsidetests/multidevices/ . Tüm çoklu cihaz modüllerinin en azından ilk başta yan yana kalması ve örneklerin keşfedilmesini kolaylaştırması için bunu öneriyoruz.

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

2. Adım: Testi oluşturun

Burası test mantığınızı uygulayacağınız yerdir. Neyin test edildiğine oldukça 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

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

İkili dosyayla paketlenecek ve ATest tarafından veya Sürekli yürütmede testte bulunup kurulabilecek veri alanıyla test için parçacıkları belirtin.

Mobly Bundled Snippet'ler Android'de external/mobly-bundled-snippets/ adresinde mevcuttur.

İsteğe bağlı: Özel parçacıklar oluşturun

Bazı çoklu cihaz modülleri özel Mobly parçacıkları gerektirebilir. Örnek test, Mobly Snippet Lib ile oluşturulmuş, Android'de şu adreste bulunan package/modules/Wifi/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareSnippet.java adresinde Wi-Fi uyumlu bir snippet içerir: external /mobly-snippet-lib/ .

Snippet, standart enstrümantasyonda olduğu gibi Android.bp'de 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",
    ],
}

Adım 4: Modül yapılandırmasını oluşturun: AndroidTest.xml

package/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 şekilde 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>

Şuna dikkat edin:

  • Bu örnek testin Mobly'ye bağımlılığı vardır. PythonVirtualenvPreparer için herhangi bir bağımlılık belirtilebilir ve pip ile kurulacaktır.
  • MoblyBinaryHostTest için mobly-par-file-name Android.bp'deki gibi modül adıyla eşleşmelidir.
  • Test için bir mobly-test-timeout belirtin. Milisaniye cinsindendir ve python ikili yürütmesinin tamamı için geçerlidir (tüm test senaryoları birlikte). Bazı sorunlar durumunda test senaryolarının sonsuza kadar askıda kalmasını önlemek için bu gereklidir.
  • Her device etiketi, her cihazda farklı bir kurulum içerebilir. Mobly yapılandırması, bunları XML'de belirtilen sırayla alacaktır.

Snippet apk kurulumuyla ilgili:

  • Kapsam ekibiyle yapılan görüşme nedeniyle ilk POC, snippet apk'lerini target_preparer aracılığıyla yüklemek üzere güncellendi: Kapsam ölçümlerinin çok erken silinmemesini sağlamak için, Python ikili dosyalarındaki test kodu yerine Harness tarafından kaldırma, zamanlama açısından daha iyi garantiler sunar.

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

Şu anda çoklu cihaz testleri yalnızca fiziksel cihazlarda çalışmaktadır. Testi çalıştırmadan önce test cihazlarınızın uygun durumda olduğundan emin olun. adb devices komutu, bağlı cihazlarınızın listesini bildirmelidir. Liste test amaçlı olmayan cihazlar içeriyorsa, test için cihazları -s işaretini kullanarak belirtin.

Wi-Fi testleri için, cihazlarda Wi-Fi'nin etkinleştirildiğinden emin olun (fabrika ayarlarına sıfırlandıktan sonra).

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

$ atest CtsWifiAwareTestCases

Test çıktısında özet başlığında kullanılan cihazların sayısını görmelisiniz; Test executed with 2 device(s) gibi bir şey.

Sorun giderme

Aşağıdaki nedenlerden dolayı yerel olarak çalışırken test başarısız olursa:

Virtualenv hatası

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

Lütfen virtualenv PATH'inizde olduğundan emin olun. PATH'e "~/.local/bin" eklenmesi sorunu çözecektir. virtualenv kurulu değilse şu adresi takip edin: https://virtualenv.pypa.io/en/latest/installation.html

En az 2 denetleyici nesnesi alması bekleniyor, 1 tane alındı

Test modülleri çoklu cihaz veya tek cihazdır; karma modül yoktur. Çoklu cihaz modülünü birden fazla cihaz olmadan çalıştırmayı denerseniz şu hatayı görürsünüz:

Expected to get at least 2 controller objects, got 1

Modülün çoklu cihaz modunda çalıştırılması sorunu çözecektir.

CTS için: Tetiklemek için parçalamayı kullanabilir (Örneğin: --shard-count 2) veya run cts-multidevces .