Pemetaan uji

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

Tentang pemetaan uji

Pemetaan pengujian adalah pendekatan berbasis Gerrit yang memungkinkan pengembang membuat aturan pengujian sebelum dan sesudah pengiriman langsung di pohon sumber Android dan menyerahkan keputusan cabang dan perangkat yang akan diuji ke infrastruktur pengujian itu sendiri. 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 tes pra-pengiriman di direktori terkait. Dengan pemetaan pengujian, Anda dapat menambahkan rangkaian pengujian yang sama untuk mengirimkan cek terlebih dahulu dengan perubahan sederhana di dalam pohon sumber Android.

Lihat contoh berikut:

Tambahkan tes pra-pengiriman ke TEST_MAPPING untuk services.core

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

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

Tentukan kelompok uji

Kelompok pemetaan uji menguji melalui kelompok uji . Nama grup uji dapat berupa string apa saja. Misalnya, prapengiriman dapat dilakukan untuk menjalankan sekelompok pengujian saat memvalidasi perubahan. Dan tes pasca-pengiriman dapat digunakan untuk memvalidasi build setelah perubahan digabungkan.

Aturan skrip pembuatan paket

Agar Trade Federation Test Harness dapat menjalankan modul pengujian pemetaan pengujian untuk build tertentu, modul ini harus memiliki test_suite yang disetel untuk Soong atau LOCAL_COMPATIBILITY_SUITE yang disetel untuk Make ke salah satu dari dua rangkaian berikut:

  • pengujian umum - 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 bitness atau fitur perangkat keras seperti HWASan (ada target test_suites terpisah untuk setiap ABI), dan meskipun pengujian tersebut harus dijalankan di perangkat.
  • pengujian perangkat - pengujian yang bergantung pada fungsionalitas khusus perangkat. Biasanya tes ini akan ditemukan di bawah vendor/ . Karena "khusus perangkat" tidak mengacu pada fungsionalitas ABI atau SoC yang mungkin dimiliki atau tidak dimiliki perangkat lain, namun hanya pada fungsionalitas yang unik untuk suatu perangkat, hal ini berlaku untuk pengujian JUnit sama seperti pengujian asli GTest (yang biasanya seharusnya menjadi general-tests meskipun spesifik untuk ABI).

Contoh:

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

Konfigurasikan pengujian untuk dijalankan di rangkaian pengujian

Agar pengujian dapat dijalankan di dalam rangkaian pengujian, pengujiannya:

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

Buat 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 dijalankan dalam pemeriksaan pra-pengiriman ketika ada file yang disentuh di direktori tersebut atau subdirektorinya.

Ikuti sebuah contoh

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

{
  "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"
    }
  ]
}

Tetapkan atribut

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

Nama modul pengujian atau nama pengujian integrasi Federasi Perdagangan (jalur sumber daya ke file XML pengujian, 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 ( penggunaan contoh filter sertakan ).

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

Atribut file_patterns memungkinkan Anda menyetel daftar string regex untuk mencocokkan jalur relatif file kode sumber apa pun (relatif terhadap direktori yang berisi file TEST_MAPPING). Dalam contoh di atas, pengujian CtsWindowManagerDeviceTestCases akan berjalan dalam prapengiriman hanya ketika file java apa pun dimulai dengan Window atau Activity, yang ada di direktori yang sama dengan file TEST_MAPPING atau sub direktori mana pun, 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 Tes dapat menggabungkan pengujian yang disertakan dengan benar.

Atribut opsi 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 rincian lebih lanjut tentang cara kerja opsi.

Jalankan tes dengan Atest

Untuk menjalankan aturan pengujian prapengiriman 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 dijalankan. Atest akan mencari dan menjalankan dua tes untuk prapengiriman (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.

Kode sumber struktur

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 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"
    }
  ]}

Tentukan direktori target

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

atest --test-mapping src/project_1

Jalankan aturan pengujian pascapengiriman

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

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

Jalankan hanya pengujian yang tidak memerlukan perangkat

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

atest [--test-mapping] --host

Identifikasi kelompok uji

Anda dapat menentukan grup pengujian 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 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 pra-pengiriman 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 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 pengaturan berikut. ATest dan Federasi Dagang akan memproses TEST_MAPPING terlebih dahulu 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"
    }
  ]
}