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:
InstantiationName, yang dapat berupa apa pun yang cocok dengan pengujian Anda.PerInstanceadalah nama umum.Nama class pengujian.
Kumpulan nama instance, yang dapat diambil dari metode bawaan, misalnya,
getAllHalInstanceNames.Metode untuk mencetak nama metode pengujian.
PrintInstanceNameToStringadalah 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 bawaanPrintInstanceTupleNameToString, 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<>);