gtest parameter untuk Pengujian HAL

Untuk antarmuka HAL, mungkin ada beberapa implementasi. Untuk menguji setiap instance untuk implementasi HAL, cara standarnya adalah dengan menulis gtest berparameter 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 instance, 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 ini.

TEST_P(UsbHidlTest, setCallback) {
...
}

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

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

Argumentasinya 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 instance dan nama metode pengujian.

Uji dengan banyak input

gtest mendukung tupel untuk pengujian dengan parameter nilai. Saat pengujian HAL memerlukan pengujian dengan banyak input (misalnya, pengujian dengan beberapa 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 kustom.

Untuk membuat instance suite 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 PrintInstanceTupleNameToString , yang dapat menangani tupel string, seperti yang ditunjukkan pada contoh di bawah ini.
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<>);