GTest berparameter untuk pengujian HAL

Untuk antarmuka HAL, mungkin ada beberapa implementasi. Untuk menguji setiap instance implementasi HAL, cara standar adalah dengan menulis GTest yang diparameterkan nilainya.

Penyiapan pengujian dasar

GTest harus mewarisi class dasar testing::TestWithParam, yang parameternya adalah nama setiap instance. Dalam metode SetUp, layanan dapat di-instantiate 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 dalam contoh berikut:

TEST_P(UsbHidlTest, setCallback) {
...
}

Buat instance rangkaian pengujian dengan makro INSTANTIATE_TEST_SUITE_P, seperti yang ditunjukkan dalam contoh berikut:

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

Argumennya adalah:

  1. InstantiationName, yang dapat berupa apa pun yang cocok dengan pengujian Anda. PerInstance adalah nama umum.

  2. Nama class pengujian.

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

Menguji dengan beberapa input

GTest mendukung tuple untuk pengujian yang diparameterisasi nilainya. Jika pengujian HAL memerlukan pengujian dengan beberapa input (misalnya, pengujian dengan beberapa antarmuka), Anda dapat menulis GTest dengan tuple sebagai parameter pengujian. Kode lengkap dapat ditemukan di VtsHalGraphicsMapperV2_1TargetTest.

Dibandingkan dengan GTest dengan satu parameter pengujian, pengujian ini perlu menggunakan tuple sebagai parameter pengujian seperti yang ditunjukkan dalam contoh berikut:

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, sebaiknya gunakan struktur dan fungsi GTest ToString kustom.

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

  • Argumen ketiga adalah kumpulan tuple (bukan kumpulan string dalam kasus dasar).
  • Metode untuk mengompilasi nama pengujian harus mendukung tuple. Anda dapat menggunakan metode bawaan PrintInstanceTupleNameToString, yang dapat menangani tuple string, seperti yang ditunjukkan dalam contoh berikut:
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<>);