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-submit
dan pasca-submit 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 pra-pengiriman di direktori terkait. Dengan pemetaan pengujian, Anda dapat menambahkan set pengujian yang sama ke pemeriksaan sebelum pengiriman dengan perubahan minimal di dalam hierarki sumber Android.
Lihat contoh berikut:
Menambahkan pengujian pra-kirim ke
TEST_MAPPING
untukservices.core
Menambahkan pengujian prakirim ke
TEST_MAPPING
untuktools/dexter
menggunakan impor
Pemetaan pengujian mengandalkan Trade Federation (TF) test harness untuk eksekusi pengujian dan pelaporan hasil.
Menentukan grup pengujian
Uji pemetaan grup pengujian dengan grup pengujian. Nama grup pengujian dapat berupa string apa pun. Misalnya, presubmit dapat menjadi nama untuk sekelompok pengujian yang akan dijalankan saat memvalidasi perubahan. Selain itu, postsubmit dapat berupa pengujian yang digunakan untuk memvalidasi build setelah perubahan digabungkan.
Aturan skrip build paket
Agar Trade Federation test harness 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 rangkaian pengujian berikut:
general-tests
adalah untuk pengujian yang tidak bergantung pada kemampuan khusus perangkat (seperti hardware khusus vendor yang tidak dimiliki sebagian besar perangkat). Sebagian besar pengujian harus berada di rangkaiangeneral-tests
, meskipun pengujian tersebut khusus untuk satu ABI atau bitness atau fitur hardware seperti HWASan (ada targettest_suites
terpisah untuk setiap ABI), dan meskipun pengujian tersebut harus dijalankan di perangkat.device-tests
adalah untuk pengujian yang bergantung pada kemampuan khusus perangkat. Biasanya, pengujian ini dapat ditemukan di bagianvendor/
. Khusus perangkat hanya mengacu pada kemampuan yang unik untuk satu perangkat, sehingga berlaku untuk pengujian JUnit serta pengujian GTest (yang biasanya harus ditandai sebagaigeneral-tests
meskipun khusus ABI).
Contoh:
Android.bp: test_suites: ["general-tests"],
Android.mk: LOCAL_COMPATIBILITY_SUITE := general-tests
Mengonfigurasi pengujian untuk dijalankan dalam paket pengujian
Agar pengujian dapat berjalan di dalam paket pengujian, pengujian:
- 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.
Jangan menganggap perangkat berada dalam status tertentu, misalnya, siap di-root. Sebagian besar pengujian tidak memerlukan hak istimewa root untuk dijalankan. Jika pengujian harus memerlukan akses root, pengujian tersebut harus menentukannya dengan
RootTargetPreparer
diAndroidTest.xml
-nya, 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 ada file yang diubah di direktori tersebut atau subdirektorinya.
Ikuti contoh
Berikut adalah contoh file TEST_MAPPING
(dalam format JSON, tetapi dengan dukungan 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": "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 mengetahui 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
include-filter
contoh penggunaan.
Setelan host
pengujian menunjukkan apakah pengujian 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 (relatif terhadap
direktori yang berisi file TEST_MAPPING
). Dalam example,
pengujian CtsWindowManagerDeviceTestCases
berjalan dalam pra-commit hanya jika file Java
dimulai dengan Window
atau Activity
, yang ada di direktori yang sama dengan file
TEST_MAPPING
atau subdirektorinya. Garis miring terbalik (\) harus
dilepaskan 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; artinya, dua file TEST_MAPPING
dapat mengimpor satu sama lain, 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-commit secara lokal:
- Buka direktori yang berisi file
TEST_MAPPING
. Jalankan perintah:
atest
Semua pengujian pra-kirim yang dikonfigurasi dalam file TEST_MAPPING
di 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 pra-kirim dalam file TEST_MAPPING
di direktori kerja saat ini (CWD) dan direktori induk. Atest
menemukan dan menggunakan file TEST_MAPPING
di CWD dan semua direktori
induknya.
Struktur kode sumber
Contoh ini menunjukkan cara mengonfigurasi file TEST_MAPPING
di seluruh
struktur 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 dalam file TEST_MAPPING
di direktori tersebut. Perintah berikut menjalankan dua pengujian (A, B):
atest --test-mapping src/project_1
Menjalankan aturan pengujian postsubmit
Anda juga dapat menggunakan perintah ini untuk menjalankan aturan pengujian postsubmit yang ditentukan di
TEST_MAPPING
di src_path
(default ke CWD) dan direktori induknya:
atest [--test-mapping] [src_path]:postsubmit
Menjalankan hanya pengujian yang tidak memerlukan perangkat
Anda dapat menggunakan opsi --host
untuk Atest guna menjalankan hanya pengujian yang dikonfigurasi terhadap host yang tidak memerlukan perangkat. Tanpa opsi ini, Atest menjalankan kedua
pengujian, pengujian yang memerlukan perangkat dan pengujian yang berjalan di host yang tidak memerlukan
perangkat. Pengujian dijalankan dalam dua rangkaian 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
Sertakan 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 mengikuti.
ATest dan Trade Federation
memproses TEST_MAPPING
ke format JSON yang valid tanpa komentar. Agar file JSON tetap bersih, hanya komentar format //
tingkat baris yang didukung.
Contoh:
{
// For presubmit test group.
"presubmit": [
{
// Run test on module A.
"name": "A"
}
]
}