Untuk antarmuka HAL, mungkin ada beberapa implementasi. Untuk menguji setiap 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
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.PerInstance
adalah nama umum.Nama class pengujian.
Kumpulan nama instance, yang bisa dapat diambil dari metode bawaan, misalnya,
getAllHalInstanceNames
.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 berparameter 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 perlu
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, disarankan untuk menggunakan
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 bawaanPrintInstanceTupleNameToString
, yang dapat menangani tuple string, seperti yang ditunjukkan pada 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<>);