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:
InstantiationName
, yang dapat berupa apa pun yang sesuai dengan pengujian Anda.PerInstance
adalah nama umum.Nama class pengujian.
Kumpulan nama instance, yang 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 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 bawaanPrintInstanceTupleNameToString
, 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<>);