Uji pemetaan

Ini adalah pengantar singkat tentang pemetaan pengujian dan penjelasan tentang cara mulai mengonfigurasi pengujian di Android Open Source Project (AOSP).

Tentang pemetaan pengujian

Pemetaan pengujian adalah pendekatan berbasis Gerrit yang memungkinkan developer membuat aturan pengujian pra-pengiriman dan pasca-pengiriman langsung di hierarki sumber Android dan menyerahkan keputusan cabang dan perangkat yang akan diuji ke infrastruktur pengujian. Definisi pemetaan pengujian adalah file JSON bernama TEST_MAPPING yang dapat Anda tempatkan di direktori sumber mana pun.

Atest dapat menggunakan file TEST_MAPPING untuk menjalankan pengujian prapengiriman di direktori terkait. Dengan pemetaan pengujian, Anda dapat menambahkan kumpulan pengujian yang sama untuk melakukan pemeriksaan pra-pengiriman dengan perubahan minimal di dalam hierarki sumber Android.

Lihat contoh berikut:

Pemetaan pengujian mengandalkan harness pengujian Trade Federation (TF) untuk eksekusi pengujian dan pelaporan hasil.

Menentukan grup pengujian

Uji pengujian grup pemetaan dengan grup pengujian. Nama grup pengujian dapat berupa string apa pun. Misalnya, prakirim dapat menjadi nama untuk grup pengujian yang akan dijalankan saat memvalidasi perubahan. Selain itu, postsubmit dapat menjadi pengujian yang digunakan untuk memvalidasi build setelah perubahan digabungkan.

Aturan skrip build paket

Agar harness pengujian Trade Federation dapat menjalankan modul pengujian untuk build tertentu, modul ini harus memiliki test_suites yang ditetapkan untuk Soong atau LOCAL_COMPATIBILITY_SUITE yang ditetapkan untuk Make ke salah satu dari dua suite ini:

  • general-tests digunakan untuk pengujian yang tidak bergantung pada kemampuan khusus perangkat (seperti hardware khusus vendor yang tidak dimiliki sebagian besar perangkat). Sebagian besar pengujian harus berada dalam suite general-tests, meskipun khusus untuk satu ABI atau bitness atau fitur hardware seperti HWASan (ada target test_suites terpisah untuk setiap ABI), dan meskipun harus dijalankan di perangkat.
  • device-tests adalah untuk pengujian yang bergantung pada kemampuan khusus perangkat. Biasanya pengujian ini ditemukan di bagian vendor/. Khusus perangkat hanya mengacu pada kemampuan yang unik untuk perangkat a, sehingga ini berlaku untuk pengujian JUnit serta pengujian GTest (yang biasanya harus ditandai sebagai general-tests meskipun khusus ABI).

Contoh:

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

Mengonfigurasi pengujian untuk dijalankan di rangkaian pengujian

Agar pengujian dapat berjalan di dalam rangkaian pengujian, pengujian tersebut harus:

  • Tidak boleh memiliki penyedia build.
  • Harus dibersihkan setelah selesai, misalnya, dengan menghapus file sementara yang dihasilkan selama pengujian.
  • Harus mengubah setelan sistem ke nilai default atau asli.
  • Tidak boleh mengasumsikan perangkat dalam status tertentu, misalnya, siap root. Sebagian besar pengujian tidak memerlukan hak istimewa root untuk dijalankan. Jika pengujian harus memerlukan root, pengujian harus menentukannya dengan RootTargetPreparer di AndroidTest.xml, seperti dalam contoh berikut:

    <target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer"/>
    

Membuat file pemetaan pengujian

Untuk direktori yang memerlukan cakupan pengujian, tambahkan file JSON TEST_MAPPING yang menyerupai contoh. Aturan ini memastikan bahwa pengujian berjalan dalam pemeriksaan pra-pengiriman saat file apa pun disentuh di direktori tersebut atau subdirektorinya.

Ikuti contoh

Berikut adalah contoh file TEST_MAPPING (dalam format JSON, tetapi dengan komentar yang didukung):

{
  "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": "CtsDeqpTestCases",
      "options": [
        {
          // Use regex in include-filter which is supported in AndroidJUnitTest
          "include-filter": "dEQP-EGL.functional.color_clears.*"
        }
      ]
    }
  ],
  "imports": [
    {
      "path": "frameworks/base/services/core/java/com/android/server/am"
    }
  ]
}

Menetapkan atribut

Dalam contoh, presubmit dan postsubmit adalah nama setiap grup pengujian. Lihat Menentukan grup pengujian untuk informasi selengkapnya tentang grup pengujian.

Anda dapat menetapkan nama modul pengujian atau nama pengujian integrasi Trade Federation (jalur resource ke file XML pengujian, misalnya, uiautomator/uiautomator-demo) dalam nilai atribut name. Perhatikan bahwa kolom name tidak dapat menggunakan class name atau metode pengujian name. Untuk mempersempit pengujian yang akan dijalankan, gunakan opsi seperti include-filter. Lihat contoh penggunaan include-filter.

Setelan host pengujian menunjukkan apakah pengujian tersebut adalah pengujian tanpa perangkat yang berjalan di host atau tidak. Nilai defaultnya adalah false, yang berarti pengujian memerlukan perangkat untuk dijalankan. Jenis pengujian yang didukung adalah HostGTest untuk biner GTest dan HostTest untuk pengujian JUnit.

Atribut file_patterns memungkinkan Anda menetapkan daftar string ekspresi reguler untuk mencocokkan jalur relatif file kode sumber apa pun (relatif terhadap direktori yang berisi file TEST_MAPPING). Dalam contoh, pengujian CtsWindowManagerDeviceTestCases berjalan dalam pra-pengiriman hanya jika file Java dimulai dengan Window atau Activity, yang ada di direktori yang sama dengan file TEST_MAPPING atau subdirektorinya. Backslash (\) harus di-escape karena berada dalam file JSON.

Atribut imports memungkinkan Anda menyertakan pengujian dalam file TEST_MAPPING lain tanpa menyalin konten. File TEST_MAPPING di direktori induk jalur yang diimpor juga disertakan. Pemetaan pengujian memungkinkan impor bertingkat; ini berarti dua file TEST_MAPPING dapat saling mengimpor, dan pemetaan pengujian dapat menggabungkan pengujian yang disertakan.

Atribut options berisi opsi command line Tradefed tambahan.

Untuk mendapatkan daftar lengkap opsi yang tersedia untuk pengujian tertentu, jalankan:

tradefed.sh run commandAndExit [test_module] --help

Lihat Penanganan opsi di Tradefed untuk mengetahui detail selengkapnya tentang cara kerja opsi.

Menjalankan pengujian dengan Atest

Untuk menjalankan aturan pengujian pra-pengiriman secara lokal:

  1. Buka direktori yang berisi file TEST_MAPPING.
  2. Jalankan perintah:

    atest
    

Semua pengujian pra-pengiriman yang dikonfigurasi dalam file TEST_MAPPING dari direktori saat ini dan direktori induknya akan dijalankan. Atest menemukan dan menjalankan dua pengujian untuk pra-pengiriman (A dan B).

Ini adalah cara paling mudah untuk menjalankan pengujian prapengiriman dalam file TEST_MAPPING di direktori kerja (CWD) saat ini dan direktori induk. Atest menemukan dan menggunakan file TEST_MAPPING di CWD dan semua direktori induk.

Struktur kode sumber

Contoh ini menunjukkan cara mengonfigurasi file TEST_MAPPING di seluruh hierarki sumber:

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

Konten src/TEST_MAPPING:

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

Konten src/project_1/TEST_MAPPING:

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

Konten src/project_2/TEST_MAPPING:

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

Menentukan direktori target

Anda dapat menentukan direktori target untuk menjalankan pengujian pada file TEST_MAPPING di direktori tersebut. Perintah berikut menjalankan dua pengujian (A, B):

atest --test-mapping src/project_1

Menjalankan aturan pengujian pascapengiriman

Anda juga dapat menggunakan perintah ini untuk menjalankan aturan pengujian pasca-pengiriman yang ditentukan di TEST_MAPPING di src_path (default ke CWD) dan direktori induknya:

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

Hanya jalankan pengujian yang tidak memerlukan perangkat

Anda dapat menggunakan opsi --host untuk Atest agar hanya menjalankan pengujian yang dikonfigurasi terhadap host yang tidak memerlukan perangkat. Tanpa opsi ini, Atest akan menjalankan kedua pengujian, yaitu pengujian yang memerlukan perangkat dan pengujian yang berjalan di host yang tidak memerlukan perangkat. Pengujian dijalankan di dua suite terpisah:

atest [--test-mapping] --host

Mengidentifikasi grup pengujian

Anda dapat menentukan grup pengujian dalam perintah Atest. Perintah berikut menjalankan semua pengujian postsubmit yang terkait dengan file di direktori src/project_1, yang hanya berisi satu pengujian (C).

Atau, Anda dapat menggunakan :all untuk menjalankan semua pengujian, terlepas dari grupnya. Perintah berikut menjalankan empat pengujian (A, B, C, X):

atest --test-mapping src/project_1:all

Menyertakan subdirektori

Secara default, menjalankan pengujian di TEST_MAPPING dengan Atest hanya menjalankan pengujian pra-kirim yang dikonfigurasi dalam file TEST_MAPPING di CWD (atau direktori tertentu) dan direktori induknya. Jika Anda ingin menjalankan pengujian di semua file TEST_MAPPING di subdirektori, gunakan opsi --include-subdir untuk memaksa Atest menyertakan pengujian tersebut juga.

atest --include-subdir

Tanpa opsi --include-subdir, Atest hanya menjalankan pengujian A. Dengan opsi --include-subdir, Atest menjalankan dua pengujian (A, B).

Komentar tingkat baris didukung

Anda dapat menambahkan komentar format // tingkat baris untuk melengkapi file TEST_MAPPING dengan deskripsi setelan yang mengikutinya. ATest dan Trade Federation memproses TEST_MAPPING ke format JSON yang valid tanpa komentar. Agar file JSON tetap rapi, hanya komentar format // tingkat baris yang didukung.

Contoh:

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