Uji pemetaan

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

Tentang pemetaan pengujian

Pemetaan pengujian adalah pendekatan berbasis Gerrit yang memungkinkan developer membuat pra- dan aturan pengujian pasca-pengiriman secara langsung di hierarki sumber Android dan membiarkan keputusan cabang dan perangkat yang akan diuji untuk infrastruktur pengujian. Definisi pemetaan pengujian adalah file JSON bernama TEST_MAPPING yang dapat Anda di direktori sumber mana pun.

Atest dapat menggunakan file TEST_MAPPING untuk menjalankan pengujian prapengiriman di direktori yang terkait. Dengan pemetaan pengujian, Anda dapat menambahkan set pengujian yang sama ke pemeriksaan pra-pengiriman dengan perubahan minimal di dalam struktur sumber Android.

Lihat contoh berikut:

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

Menentukan grup pengujian

Uji pengujian grup pemetaan dengan grup pengujian. Nama grup pengujian dapat string apa pun. Misalnya, presubmit dapat menjadi nama untuk grup pengujian untuk dijalankan saat memvalidasi perubahan. Dan postsubmit adalah pengujian yang digunakan untuk memvalidasi build setelah perubahan digabungkan.

Aturan skrip build paket

Agar test harness Federasi Perdagangan agar dapat menjalankan modul pengujian untuk build tertentu, modul ini harus memiliki test_suites ditetapkan untuk set Soong atau LOCAL_COMPATIBILITY_SUITE untuk Make pada salah satu dari dua suite ini:

  • general-tests ditujukan untuk pengujian yang tidak bergantung pada pengujian khusus perangkat kemampuan tertentu (seperti perangkat keras khusus vendor yang sebagian besar perangkat tidak ). Sebagian besar pengujian harus berada dalam suite general-tests, 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 harus menjalankan di perangkat.
  • device-tests ditujukan untuk pengujian yang bergantung pada kemampuan khusus perangkat. Biasanya pengujian ini ditemukan di bagian vendor/. Khusus perangkat hanya mengacu pada kemampuan unik untuk sebuah perangkat, sehingga hal ini berlaku ke pengujian JUnit serta pengujian GTest (yang biasanya harus ditandai sebagai general-tests meskipun 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 sementara file yang dibuat selama pengujian.
  • Harus mengubah setelan sistem ke nilai default atau asli.
  • Tidak boleh berasumsi bahwa perangkat dalam status tertentu, misalnya, siap pakai. Sebagian besar pengujian tidak memerlukan hak istimewa root untuk dijalankan. Jika pengujian harus mensyaratkan root, harus menentukan bahwa dengan RootTargetPreparer AndroidTest.xml, 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 menyerupai contoh. Aturan ini memastikan bahwa pengujian berjalan dalam prapengiriman pemeriksaan ketika ada file yang disentuh dalam direktori itu atau salah satu subdirektori.

Ikuti contoh

Berikut contoh file TEST_MAPPING (dalam format JSON, tetapi dengan komentar 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": "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 masing-masing grup pengujian. Lihat Menentukan grup pengujian untuk mengetahui informasi selengkapnya tentang grup pengujian.

Anda dapat menetapkan nama modul pengujian atau pengujian integrasi Trade Federation nama (jalur resource ke file XML pengujian, misalnya, uiautomator/uiautomator-demo) pada nilai atribut name. Perhatikan bahwa kolom name tidak dapat gunakan class name atau metode pengujian name. Untuk mempersempit pengujian yang akan dijalankan, gunakan opsi seperti include-filter. Lihat (Contoh penggunaan include-filter).

Setelan host pengujian menunjukkan apakah pengujian merupakan pengujian tanpa perangkat berjalan di {i>host<i} atau tidak. Nilai defaultnya adalah false, yang berarti pengujian memerlukan sebuah perangkat untuk dapat berjalan. Jenis pengujian yang didukung adalah HostGTest untuk Biner GTest dan HostTest untuk JUnit pengujian.

Atribut file_patterns memungkinkan Anda menetapkan daftar string ekspresi reguler untuk mencocokkan jalur relatif dari setiap file kode sumber (relatif terhadap direktori yang berisi file TEST_MAPPING). Dalam contoh, pengujian CtsWindowManagerDeviceTestCases berjalan di pra-pengiriman hanya ketika file Java dimulai dengan Window atau Activity, yang ada di direktori yang sama dengan TEST_MAPPING atau subdirektorinya apa pun telah 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 kontennya. File TEST_MAPPING di induk direktori jalur yang diimpor juga disertakan. Pemetaan pengujian memungkinkan impor bersarang; ini berarti dua file TEST_MAPPING dapat saling mengimpor, 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 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 pra-pengiriman yang dikonfigurasi di TEST_MAPPING file versi saat ini dan direktori induknya sedang dijalankan. Atest menemukan dan menjalankan dua pengujian untuk pra-pengiriman (A dan B).

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

Menyusun kode sumber

Contoh ini menunjukkan cara mengonfigurasi file TEST_MAPPING 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 pada file TEST_MAPPING di saat ini. Perintah berikut 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 {i>postsubmit <i}yang ditentukan di 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 dikonfigurasikan {i>host<i} yang tidak memerlukan perangkat. Tanpa opsi ini, Atest menjalankan kedua tes, mereka yang membutuhkan perangkat dan {i>theose<i} yang berjalan di {i>host<i} dan tidak membutuhkan perangkat. Tujuan pengujian dijalankan dalam dua rangkaian terpisah:

atest [--test-mapping] --host

Identifikasi grup pengujian

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

Atau, Anda dapat menggunakan :all untuk menjalankan semua pengujian, apa pun grupnya. Hal berikut menjalankan empat tes (A, B, C, X):

atest --test-mapping src/project_1:all

Sertakan subdirektori

Secara default, menjalankan pengujian di TEST_MAPPING dengan Atest hanya menjalankan pra-pengiriman pengujian yang dikonfigurasi dalam file TEST_MAPPING di CWD (atau direktori tertentu) dan direktori induknya. Jika Anda ingin menjalankan pengujian di semua TEST_MAPPING di subdirektori, gunakan opsi --include-subdir untuk memaksa Atest untuk menyertakan pengujian itu 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 menyempurnakan TEST_MAPPING dengan deskripsi setelan sebagai berikut. ATest dan Federasi Perdagangan melakukan prapemrosesan TEST_MAPPING ke format JSON yang valid tanpa komentar. Untuk mempertahankan file JSON bersih, hanya komentar format // level baris didukung.

Contoh:

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