Eşleştirmeyi Test Et

Bu, Test Eşlemeye kısa bir giriş ve Android Açık Kaynak Projesi'nde (AOSP) testleri kolayca yapılandırmaya nasıl başlayacağınıza dair bir açıklamadır.

Test Eşlemesi Nedir?

Test Mapping, geliştiricilerin doğrudan Android kaynak ağacında gönderme öncesi ve sonrası test kuralları oluşturmasına ve test edilecek dalların ve cihazların kararlarını test altyapısının kendisine bırakmasına olanak tanıyan Gerrit tabanlı bir yaklaşımdır. Test Mapping tanımları, herhangi bir kaynak dizine yerleştirilebilen TEST_MAPPING adlı JSON dosyalarıdır.

Atest, ilişkili dizinlerde gönderme öncesi testleri çalıştırmak için TEST_MAPPING dosyalarını kullanabilir. Test Eşleme ile, Android kaynak ağacında basit bir değişiklikle önceden gönderilen kontroller için aynı test setini ekleyebilirsiniz.

Şu örneklere bakın:

Services.core için TEST_MAPPING'e ön gönderme testleri ekleyin

İçe aktarmayı kullanan araçlar/dexter için TEST_MAPPING'e ön gönderme testleri ekleyin

Test Eşleme, testlerin yürütülmesi ve sonuçların raporlanması için Ticaret Federasyonu (TF) Test Donanımına güvenir.

Test gruplarını tanımlama

Test Mapping, testleri bir test grubu aracılığıyla gruplar. Bir test grubunun adı herhangi bir dizi olabilir. Örneğin, ön gönderme, değişiklikleri doğrularken çalıştırılacak bir grup test için olabilir. Gönderim sonrası testler, değişiklikler birleştirildikten sonra yapıları doğrulamak için kullanılabilir.

Paket oluşturma komut dosyası kuralları

Ticaret Federasyonu Test Donanımının belirli bir yapı için Test Eşleme test modüllerini çalıştırabilmesi için, bu modüllerin Soong için test_suite veya Make için LOCAL_COMPATIBILITY_SUITE şu iki paketten birine ayarlanmış olması gerekir:

  • genel testler - cihaza özgü işlevselliğe bağlı olmayan testler (çoğu cihazda bulunmayan satıcıya özel donanım gibi). Bir ABI'ye veya bitlik veya HWASan gibi donanım özelliklerine özgü olsalar (her ABI için ayrı bir test_suites hedefi vardır) ve bir cihazda çalıştırılmaları gerekse bile çoğu test genel testler paketinde olmalıdır.
  • cihaz testleri - cihaza özgü işlevselliğe bağlı testler. Tipik olarak bu testler vendor/ altında bulunur. "Cihaza özgü", diğer cihazların sahip olabileceği veya olmayabileceği ABI veya SoC işlevselliğine atıfta bulunmadığından, yalnızca bir cihaza özgü işlevsellik için bu, GTest yerel testleri kadar (genellikle olması gereken) JUnit testleri için de geçerlidir. ABI'ye özgü olsalar bile general-tests olabilir).

Örnekler:

Android.bp: test_suites: ["general-tests"],
Android.mk: LOCAL_COMPATIBILITY_SUITE := general-tests

Bir test paketinde çalıştırmak için testleri yapılandırma

Bir test paketinin içinde çalışacak bir test için test:

  • herhangi bir yapı sağlayıcısı olmamalıdır.
  • tamamlandıktan sonra, örneğin test sırasında oluşturulan geçici dosyaları silerek temizlemelidir.
  • sistem ayarlarını varsayılan veya orijinal değere değiştirin.
  • bir cihazı belirli bir durumda, örneğin kök hazır olarak varsaymamalıdır. Çoğu testin çalıştırılması için kök ayrıcalığı gerekmez. Bir testin kök gerektirmesi gerekiyorsa, aşağıdaki örnekte olduğu gibi AndroidTest.xml dosyasında RootTargetPreparer ile bunu belirtmelidir:
<target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer"/>

Test Eşleme dosyaları oluşturma

Test kapsamı gerektiren dizin için aşağıdaki örneğe benzer bir TEST_MAPPING JSON dosyası eklemeniz yeterlidir. Bu kurallar, söz konusu dizinde veya alt dizinlerinden herhangi birinde herhangi bir dosyaya dokunulduğunda testlerin gönderme öncesi kontrollerde çalışmasını sağlayacaktır.

Bir örneğin ardından

İşte örnek bir TEST_MAPPING dosyası (JSON biçimindedir ancak yorumları desteklenir):

{
  "presubmit": [
    // JUnit test with options and file patterns.
    {
      "name": "CtsWindowManagerDeviceTestCases",
      "options": [
        {
          "include-annotation": "android.platform.test.annotations.RequiresDevice"
        }
      ],
      "file_patterns": ["(/|^)Window[^/]*\\.java", "(/|^)Activity[^/]*\\.java"]
    },
    // Device-side GTest with options.
    {
      "name" : "hello_world_test",
      "options": [
        {
          "native-test-flag": "\"servicename1 servicename2\""
        },
        {
          "native-test-timeout": "6000"
        }
      ]
    }
    // Host-side GTest.
    {
      "name" : "net_test_avrcp",
      "host" : true
    }
  ],
  "postsubmit": [
    {
      "name": "CtsWindowManagerDeviceTestCases"
    }
  ],
  "imports": [
    {
      "path": "frameworks/base/services/core/java/com/android/server/am"
    }
  ]
}

Ayar öznitelikleri

Yukarıdaki örnekte, presubmit ve postsubmit her bir test grubunun adlarıdır. Test grupları hakkında daha fazla bilgi için bkz. Test gruplarını tanımlama .

Test modülünün adı veya Ticaret Federasyonu entegrasyon testi adı (test XML dosyasına giden kaynak yolu, örn. uiautomator/uiautomator-demo ) name niteliğinin değerinde ayarlanabilir. name alanının sınıf name veya test yöntemi name kullanamayacağını unutmayın. Çalıştırılacak testleri daraltmak için burada include-filter gibi seçenekleri kullanabilirsiniz. Bakınız ( include-filtre örnek kullanımı ).

Bir testin ana bilgisayar ayarı, testin ana bilgisayarda çalışan cihazsız bir test olup olmadığını gösterir. Varsayılan değer false şeklindedir, yani testin çalışması için bir cihaz gerekir. Desteklenen test türleri, GTest ikili dosyaları için HostGTest ve JUnit testleri için HostTest'tir .

file_patterns özniteliği, herhangi bir kaynak kod dosyasının (TEST_MAPPING dosyasını içeren dizine göre) göreli yolunu eşleştirmek için normal ifade dizelerinin bir listesini ayarlamanıza olanak tanır. Yukarıdaki örnekte, test CtsWindowManagerDeviceTestCases , yalnızca herhangi bir java dosyası Pencere ile başladığında veya TEST_MAPPING dosyasının veya alt dizinlerinden herhangi birinin aynı dizininde bulunan Activity değiştirildiğinde ön gönderimde çalışacaktır. Ters eğik çizgiler, bir JSON dosyasında oldukları için \ çıkış yapılmalıdır.

imports özelliği, içeriği kopyalamadan testleri diğer TEST_MAPPING dosyalarına dahil etmenize olanak tanır. Alınan yolun ana dizinlerindeki TEST_MAPPING dosyalarının da dahil edileceğini unutmayın. Test Eşleme, iç içe içe aktarmalara izin verir; bu, iki TEST_MAPPING dosyasının birbirini içe aktarabileceği ve Test Eşlemenin dahil edilen testleri uygun şekilde birleştirebileceği anlamına gelir.

options niteliği, ek TradeFed komut satırı seçeneklerini içerir.

Belirli bir test için mevcut seçeneklerin tam listesini almak için şunu çalıştırın:

tradefed.sh run commandAndExit [test_module] --help

Seçeneklerin nasıl çalıştığı hakkında daha fazla ayrıntı için TradeFed Opsiyon İşlemlerine bakın.

Atest ile test çalıştırma

Ön gönderme test kurallarını yerel olarak yürütmek için:

  1. TEST_MAPPING dosyasını içeren dizine gidin.
  2. Komutu çalıştırın:
atest

Geçerli dizinin ve üst dizinlerinin TEST_MAPPING dosyalarında yapılandırılan tüm gönderme öncesi testler çalıştırılır. Atest, ön gönderim için (A ve B) iki testi bulup çalıştıracaktır.

Bu, geçerli çalışma dizini (CWD) ve üst dizinlerdeki TEST_MAPPING dosyalarında ön gönderme testleri çalıştırmanın en basit yoludur. Atest, TEST_MAPPING dosyasını CWD'de ve tüm üst dizinlerinde bulur ve kullanır.

Kaynak kodunu yapılandırma

Aşağıdaki örnek, TEST_MAPPING dosyalarının kaynak ağaçta nasıl yapılandırılabileceğini gösterir.

src
├── project_1
│   └── TEST_MAPPING
├── project_2
│   └── TEST_MAPPING
└── TEST_MAPPING

src/TEST_MAPPING içeriği:

{
  "presubmit": [
    {
      "name": "A"
    }
  ]
}

src/project_1/TEST_MAPPING içeriği:

{
  "presubmit": [
    {
      "name": "B"
    }
  ],
  "postsubmit": [
    {
      "name": "C"
    }
  ],
  "other_group": [
    {
      "name": "X"
    }
  ]}

src/project_2/TEST_MAPPING içeriği:

{
  "presubmit": [
    {
      "name": "D"
    }
  ],
  "import": [
    {
      "path": "src/project_1"
    }
  ]}

Hedef dizinleri belirtme

Testleri o dizindeki TEST_MAPPING dosyalarında çalıştırmak için bir hedef dizin belirleyebilirsiniz. Aşağıdaki komut iki test (A, B) çalıştıracaktır.

atest --test-mapping src/project_1

Gönderme sonrası test kurallarını çalıştırma

Bu komutu, src_path (varsayılanı CWD'dir) ve üst dizinlerinde TEST_MAPPING'de tanımlanan gönderme sonrası test kurallarını çalıştırmak için de kullanabilirsiniz:

atest [--test-mapping] [src_path]:postsubmit

Yalnızca cihaz gerektirmeyen testleri çalıştırma

Atest için --host seçeneğini, yalnızca hiçbir aygıt gerektirmeyen ana bilgisayara karşı yapılandırılmış testleri çalıştırmak için kullanabilirsiniz. Bu seçenek olmadan Atest, cihaz gerektiren testler ve ana bilgisayarda çalışan ve cihaz gerektirmeyen testler olmak üzere her iki testi de çalıştıracaktır. Testler iki ayrı süitte gerçekleştirilecektir.

atest [--test-mapping] --host

Test gruplarını belirleme

Test gruplarını Atest komutunda belirleyebilirsiniz. Aşağıdaki komut, yalnızca bir test (C) içeren src/project_1 dizinindeki dosyalarla ilgili tüm gönderme sonrası testleri çalıştıracaktır.

Veya gruptan bağımsız olarak tüm testleri çalıştırmak için :all kullanabilirsiniz. Aşağıdaki komut dört test çalıştırır (A, B, C, X):

atest --test-mapping src/project_1:all

Alt dizinler dahil

Varsayılan olarak, testleri Atest ile TEST_MAPPING içinde çalıştırmak, yalnızca CWD'deki (veya verilen dizindeki) TEST_MAPPING dosyasında ve üst dizinlerinde yapılandırılan gönderme öncesi testleri çalıştıracaktır. Alt dizinlerdeki tüm TEST_MAPPING dosyalarında testler çalıştırmak istiyorsanız, Atest'i bu testleri de dahil etmeye zorlamak için --include-subdir seçeneğini kullanın.

atest --include-subdir

--include-subdir seçeneği olmadan Atest yalnızca A testini çalıştırır. --include-subdir seçeneğiyle Atest iki test (A, B) çalıştırır.

Satır düzeyinde yorum desteklenir

Aşağıdaki ayarın açıklamasını içeren TEST_MAPPING dosyasını detaylandırmak için satır seviyesinde bir // -format yorumu ekleyebilirsiniz. ATest ve Trade Federation, TEST_MAPPING'i yorumsuz geçerli bir JSON biçimine önceden işleyecek. JSON dosyasını temiz ve okunması kolay tutmak için yalnızca satır düzeyinde // -format yorumu desteklenir.

Örnek:

{
  // For presubmit test group.
  "presubmit": [
    {
      // Run test on module A.
      "name": "A"
    }
  ]
}