Gtest berparameter untuk pengujian HAL

Untuk antarmuka HAL, mungkin ada beberapa implementasi. Untuk menguji setiap instance untuk implementasi HAL, cara standarnya adalah dengan menulis gtest dengan parameter nilai .

Pengaturan tes dasar

gtest harus mewarisi kelas dasar testing::TestWithParam , yang parameternya adalah nama setiap instance. Dalam metode SetUp , layanan dapat dibuat berdasarkan nama instans, seperti yang ditunjukkan dalam cuplikan kode berikut.

// The main test class for the USB hidl HAL
class UsbHidlTest : public testing::TestWithParam<std::string> {

 virtual void SetUp() override {
   usb = IUsb::getService(GetParam());
   ASSERT_NE(usb, nullptr);
...
 }

Untuk setiap metode pengujian, gunakan makro TEST_P seperti yang ditunjukkan pada contoh di bawah.

TEST_P(UsbHidlTest, setCallback) {
...
}

Buat instance suite dengan makro INSTANTIATE_TEST_SUITE_P , seperti yang ditunjukkan pada contoh di bawah.

INSTANTIATE_TEST_SUITE_P(
       PerInstance, UsbHidlTest,
       testing::ValuesIn(android::hardware::getAllHalInstanceNames(IUsb::descriptor)),
       android::hardware::PrintInstanceNameToString);

Argumennya adalah:

  1. InstantiationName , yang bisa berupa apa saja yang cocok dengan pengujian Anda. PerInstance adalah nama umum.

  2. Nama kelas tes.

  3. Kumpulan nama instance, yang dapat diambil dari metode bawaan, misalnya getAllHalInstanceNames .

  4. Metode untuk mencetak nama metode pengujian. PrintInstanceNameToString adalah nama bawaan yang dapat Anda gunakan untuk mengkompilasi nama pengujian berdasarkan nama instans dan nama metode pengujian.

Uji dengan banyak masukan

gtest mendukung tupel untuk pengujian dengan parameter nilai. Ketika pengujian HAL memerlukan pengujian dengan banyak input (misalnya, pengujian dengan banyak antarmuka), Anda dapat menulis gtest dengan tuple sebagai parameter pengujian. Kode lengkapnya dapat ditemukan di VtsHalGraphicsMapperV2_1TargetTest .

Dibandingkan dengan gtest dengan parameter pengujian tunggal, pengujian ini perlu menggunakan tuple sebagai parameter pengujian seperti yang ditunjukkan pada contoh di bawah ini.

class GraphicsMapperHidlTest
   : public ::testing::TestWithParam<std::tuple<std::string, std::string>> {
 protected:
   void SetUp() override {
       ASSERT_NO_FATAL_FAILURE(mGralloc = std::make_unique<Gralloc>(std::get<0>(GetParam()),
                                                                    std::get<1>(GetParam())));
…
}

Jika diperlukan parameter yang lebih rumit, disarankan untuk menggunakan struktur dan fungsi ToString gtest khusus.

Untuk membuat contoh rangkaian pengujian, makro INSTANTIATE\_TEST\_CASE\_P juga digunakan, dengan dua perbedaan:

  • Argumen ketiga adalah kumpulan tupel (versus kumpulan string dalam kasus dasar).
  • Metode untuk mengkompilasi nama pengujian harus mendukung tuple . Anda dapat menggunakan metode bawaan PrintInstanceTupleNameToString , yang dapat menangani tupel string, seperti yang ditunjukkan pada contoh di bawah.
INSTANTIATE_TEST_CASE_P(
       PerInstance, GraphicsMapperHidlTest,
       testing::Combine(
               testing::ValuesIn(
                       android::hardware::getAllHalInstanceNames(IAllocator::descriptor)),
           testing::ValuesIn(android::hardware::getAllHalInstanceNames(IMapper::descriptor))),
       android::hardware::PrintInstanceTupleNameToString<>);