GTest berparameter untuk pengujian HAL

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

Penyiapan pengujian dasar

GTest harus mewarisi class dasar testing::TestWithParam, yang parameternya adalah nama setiap instance. Dalam metode SetUp, layanan dapat dibuat instance-nya 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 suite dengan INSTANTIATE_TEST_SUITE_P makro, 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 sesuai 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 nilai. 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 parameter pengujian tunggal, pengujian ini harus 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 parameter yang lebih rumit diperlukan, sebaiknya gunakan struktur dan fungsi ToString GTest kustom.

Untuk membuat instance rangkaian 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 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<>);