Pemetaan Uji

Ini adalah pengenalan singkat tentang Pemetaan Uji dan penjelasan tentang cara memulai mengonfigurasi pengujian dengan mudah di Android Open Source Project (AOSP).

Apa itu Pemetaan Uji?

Pemetaan Uji adalah pendekatan berbasis Gerrit yang memungkinkan pengembang membuat aturan pengujian sebelum dan sesudah pengiriman langsung di pohon sumber Android dan membiarkan keputusan cabang dan perangkat diuji ke infrastruktur pengujian itu sendiri. Definisi Pemetaan Uji adalah file JSON bernama TEST_MAPPING yang dapat ditempatkan di direktori sumber mana pun.

Atest dapat menggunakan file TEST_MAPPING untuk menjalankan tes pra-pengiriman di direktori terkait. Dengan Pemetaan Uji, Anda dapat menambahkan rangkaian pengujian yang sama untuk mengirimkan pemeriksaan sebelumnya dengan perubahan sederhana di dalam hierarki sumber Android.

Lihat contoh berikut:

Tambahkan tes pra-kirim ke TEST_MAPPING untuk services.core

Tambahkan tes pra-kirim ke TEST_MAPPING untuk alat/dexter menggunakan impor

Pemetaan Tes bergantung pada Test Harness Federasi Perdagangan (TF) untuk pelaksanaan tes dan pelaporan hasil.

Mendefinisikan kelompok tes

Tes Pemetaan kelompok tes melalui kelompok tes . Nama grup uji dapat berupa string apa pun. Misalnya, pra -pengiriman dapat untuk menjalankan sekelompok pengujian saat memvalidasi perubahan. Dan tes postsubmit dapat digunakan untuk memvalidasi build setelah perubahan digabungkan.

Aturan skrip pembuatan kemasan

Agar Test Harness Trade Federation untuk menjalankan modul uji Test Mapping untuk build tertentu, modul ini harus memiliki set test_suite untuk Soong atau LOCAL_COMPATIBILITY_SUITE yang disetel untuk Make ke salah satu dari dua suite ini:

  • general-tests - pengujian yang tidak bergantung pada fungsionalitas khusus perangkat (seperti perangkat keras khusus vendor yang tidak dimiliki sebagian besar perangkat). Sebagian besar pengujian harus berada dalam rangkaian pengujian umum, meskipun pengujian tersebut khusus untuk satu ABI atau fitur bitness atau perangkat keras seperti HWASan (ada target test_suites terpisah untuk setiap ABI), dan bahkan jika pengujian harus dijalankan pada perangkat.
  • device-tests - tes yang bergantung pada fungsionalitas khusus perangkat. Biasanya tes ini akan ditemukan di bawah vendor/ . Karena "khusus perangkat" tidak merujuk ke fungsi ABI atau SoC yang mungkin atau mungkin tidak dimiliki perangkat lain, tetapi hanya untuk fungsionalitas yang unik untuk perangkat , ini berlaku untuk pengujian JUnit setiap bit seperti pengujian asli GTest (yang biasanya menjadi general-tests bahkan jika itu khusus ABI).

Contoh:

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

Mengonfigurasi pengujian untuk dijalankan dalam rangkaian pengujian

Agar pengujian berjalan di dalam suite pengujian, pengujian:

  • tidak boleh memiliki penyedia build apa pun.
  • harus dibersihkan setelah selesai, misalnya dengan menghapus semua file sementara yang dihasilkan selama pengujian.
  • mengubah pengaturan sistem ke nilai default atau asli.
  • tidak boleh menganggap perangkat dalam keadaan tertentu, misalnya, root siap. Sebagian besar pengujian tidak memerlukan hak akses root untuk dijalankan. Jika pengujian harus memerlukan root, pengujian harus menetapkannya dengan RootTargetPreparer di AndroidTest.xml -nya, seperti dalam contoh berikut:
<target_preparer class="com.android.tradefed.targetprep.RootTargetPreparer"/>

Membuat file Pemetaan Uji

Untuk direktori yang memerlukan cakupan pengujian, cukup tambahkan file JSON TEST_MAPPING seperti contoh di bawah ini. Aturan-aturan ini akan memastikan pengujian berjalan dalam pemeriksaan pra-pengiriman ketika ada file yang disentuh di direktori itu atau subdirektori mana pun.

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

Menyetel atribut

Dalam contoh di atas, presubmit dan postsubmit adalah nama masing-masing grup uji . Lihat Mendefinisikan grup uji untuk informasi lebih lanjut tentang grup uji.

Nama modul uji atau nama uji integrasi Federasi Perdagangan (jalur sumber daya ke file XML uji, misalnya, uiautomator/uiautomator-demo ) dapat diatur dalam nilai atribut name . Perhatikan bahwa bidang nama tidak dapat menggunakan name kelas atau name metode pengujian . Untuk mempersempit pengujian yang akan dijalankan, Anda dapat menggunakan opsi seperti include-filter di sini. Lihat ( termasuk penggunaan sampel filter ).

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

Atribut file_patterns memungkinkan Anda menyetel daftar string regex untuk mencocokkan jalur relatif dari file kode sumber apa pun (relatif terhadap direktori yang berisi file TEST_MAPPING). Dalam contoh di atas, uji CtsWindowManagerDeviceTestCases akan berjalan di pra-pengiriman hanya ketika file java apa pun yang dimulai dengan Window atau Activity, yang ada di direktori yang sama dari file TEST_MAPPING atau subdirektori mana pun, diubah. Garis miring terbalik \ perlu diloloskan karena berada dalam file JSON.

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

Atribut options berisi opsi baris perintah 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 tes dengan Atest

Untuk menjalankan aturan pengujian pra-pengiriman secara lokal:

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

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

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

Penyusunan kode sumber

Contoh berikut menunjukkan bagaimana file TEST_MAPPING dapat dikonfigurasi di seluruh pohon sumber.

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

Isi dari src/TEST_MAPPING :

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

Isi dari src/project_1/TEST_MAPPING :

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

Isi dari src/project_2/TEST_MAPPING :

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

Menentukan direktori target

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

atest --test-mapping src/project_1

Menjalankan aturan pengujian pasca-pengiriman

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

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

Hanya menjalankan tes yang tidak memerlukan perangkat

Anda dapat menggunakan opsi --host untuk Atest untuk hanya menjalankan tes yang dikonfigurasi terhadap host yang tidak memerlukan perangkat. Tanpa opsi ini, Atest akan menjalankan kedua pengujian, yang membutuhkan perangkat dan yang berjalan di host dan tidak memerlukan perangkat. Tes akan dijalankan dalam dua suite terpisah.

atest [--test-mapping] --host

Mengidentifikasi kelompok uji

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

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

atest --test-mapping src/project_1:all

Termasuk subdirektori

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

atest --include-subdir

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

Komentar tingkat baris didukung

Anda dapat menambahkan komentar level-baris // -format untuk menyempurnakan file TEST_MAPPING dengan deskripsi pengaturan berikut. ATest dan Trade Federation akan memproses 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"
    }
  ]
}