Uji pemetaan

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

Tentang pemetaan pengujian

Pemetaan pengujian adalah pendekatan berbasis Gerrit yang memungkinkan developer membuat aturan pengujian pra-dan pasca-pengiriman langsung di hierarki sumber Android dan membiarkan keputusan cabang dan perangkat diuji sendiri ke infrastruktur pengujian. Definisi pemetaan pengujian adalah file JSON bernama TEST_MAPPING yang dapat ditempatkan 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 sederhana di dalam hierarki sumber Android.

Lihat contoh berikut:

Menambahkan pengujian pra-pengiriman ke TEST_MAPPING untuk services.core

Menambahkan pengujian prapengiriman ke TEST_MAPPING untuk alat/dexter menggunakan impor

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

Menentukan grup pengujian

Uji pengujian grup pemetaan melalui grup pengujian. Nama grup pengujian dapat berupa string apa pun. Misalnya, presubmit dapat ditujukan untuk grup pengujian yang akan dijalankan saat memvalidasi perubahan. Selain itu, pengujian postsubmit dapat digunakan untuk memvalidasi build setelah perubahan digabungkan.

Aturan skrip build paket

Agar Trade Federation Test Harness dapat menjalankan modul pengujian pemetaan 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 berikut:

  • general-test - pengujian yang tidak bergantung pada fungsi khusus perangkat (seperti hardware khusus vendor yang tidak dimiliki sebagian besar perangkat). Sebagian besar pengujian harus dilakukan dalam suite pengujian umum, meskipun hanya untuk satu ABI atau bitness atau fitur hardware seperti HWASan (ada target test_suite terpisah untuk setiap ABI), dan meskipun harus berjalan di perangkat.
  • device-tests - pengujian yang bergantung pada fungsi khusus perangkat. Biasanya pengujian ini dapat ditemukan di bagian vendor/. Karena "khusus perangkat" tidak merujuk pada fungsi ABI atau SoC yang mungkin dimiliki atau tidak dimiliki perangkat lain, tetapi hanya untuk fungsi yang unik bagi perangkat sebuah, hal ini berlaku untuk pengujian JUnit setiap bitnya, sama seperti pengujian native GTest (yang biasanya harus general-tests meskipun jika pengujian itu 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 dijalankan di dalam rangkaian pengujian, pengujian:

  • tidak boleh memiliki penyedia build.
  • harus dibersihkan setelah selesai, misalnya, dengan menghapus file sementara yang dihasilkan selama pengujian.
  • mengubah pengaturan sistem ke nilai {i>default<i} atau nilai asli.
  • seharusnya tidak mengasumsikan perangkat dalam keadaan tertentu, misalnya, siap {i>root<i}. Sebagian besar pengujian tidak memerlukan hak istimewa root agar dapat berjalan. Jika pengujian harus memerlukan root, pengujian harus menentukannya dengan RootTargetPreparer dalam AndroidTest.xml-nya, seperti dalam contoh berikut:
<target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer"/>

Membuat file pemetaan pengujian

Untuk direktori yang memerlukan cakupan pengujian, cukup tambahkan file JSON TEST_MAPPING yang mirip dengan contoh di bawah. Aturan ini akan memastikan pengujian berjalan dalam pemeriksaan pra-pengiriman jika ada file yang disentuh di direktori tersebut atau subdirektorinya.

Ikuti contoh

Berikut 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": "CtsWindowManagerDeviceTestCases"
    }
  ],
  "imports": [
    {
      "path": "frameworks/base/services/core/java/com/android/server/am"
    }
  ]
}

Menetapkan atribut

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

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

Setelan host pengujian menunjukkan apakah pengujian merupakan pengujian tanpa perangkat yang berjalan pada host atau tidak. Nilai defaultnya adalah false, yang berarti pengujian memerlukan perangkat untuk berjalan. 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 cocok dengan jalur relatif file kode sumber apa pun (sesuai dengan direktori yang berisi file TEST_MAPPING). Dalam contoh di atas, pengujian CtsWindowManagerDeviceTestCases akan berjalan dalam pra-pengiriman hanya jika file java apa pun yang dimulai dengan Window atau Activity, yang ada di direktori yang sama dengan file TEST_MAPPING atau subdirektorinya, diubah. Garis miring terbalik \ harus di-escape karena berada dalam file JSON.

Atribut imports memungkinkan Anda menyertakan pengujian dalam file TEST_MAPPING lainnya tanpa menyalin konten. Perhatikan bahwa file TEST_MAPPING di direktori induk dari jalur yang diimpor juga akan disertakan. Pemetaan pengujian memungkinkan impor bertingkat; ini berarti dua file TEST_MAPPING dapat saling mengimpor, dan Pemetaan pengujian dapat menggabungkan pengujian yang disertakan dengan benar.

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 TradeFed untuk detail selengkapnya tentang cara kerja opsi.

Menjalankan pengujian dengan Atest

Untuk menjalankan aturan pengujian prapengiriman secara lokal:

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

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

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

Menyusun kode sumber

Contoh berikut menunjukkan cara file TEST_MAPPING dapat dikonfigurasi 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 di file TEST_MAPPING di direktori tersebut. Perintah berikut akan 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 pascapengiriman yang ditentukan dalam TEST_MAPPING di src_path (default ke CWD) dan direktori induknya:

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

Hanya menjalankan pengujian yang tidak memerlukan perangkat

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

atest [--test-mapping] --host

Identifikasi grup pengujian

Anda dapat menentukan grup pengujian dalam perintah Atest. Perintah berikut akan 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, apa pun grupnya. Perintah berikut menjalankan empat pengujian (A, B, C, X):

atest --test-mapping src/project_1:all

Sertakan subdirektori

Secara default, menjalankan pengujian di TEST_MAPPING dengan Atest hanya akan menjalankan pengujian prapengiriman 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 agar menyertakan pengujian tersebut juga.

atest --include-subdir

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

Komentar tingkat baris didukung

Anda dapat menambahkan komentar format // tingkat baris untuk menyempurnakan file TEST_MAPPING dengan deskripsi setelan yang mengikutinya. ATest dan Federasi Perdagangan akan memproses terlebih dahulu TEST_MAPPING ke format JSON yang valid tanpa komentar. Untuk menjaga file JSON tetap bersih dan mudah dibaca, hanya komentar format // tingkat baris yang didukung.

Contoh:

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