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 menjadigeneral-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
diAndroidTest.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:
- Buka direktori yang berisi file TEST_MAPPING.
- 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"
}
]
}