Untuk antarmuka HAL, mungkin ada beberapa implementasi. Untuk menguji setiap instance untuk implementasi HAL, cara standarnya adalah dengan menulis gtest dengan parameter nilai .
Pengaturan tes dasar
gtest harus mewarisi kelas dasar testing::TestWithParam
, yang parameternya adalah nama setiap instance. Dalam metode SetUp
, layanan dapat dibuat berdasarkan nama instans, 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 pada contoh di bawah.
TEST_P(UsbHidlTest, setCallback) {
...
}
Buat instance suite dengan makro INSTANTIATE_TEST_SUITE_P
, seperti yang ditunjukkan pada contoh di bawah.
INSTANTIATE_TEST_SUITE_P(
PerInstance, UsbHidlTest,
testing::ValuesIn(android::hardware::getAllHalInstanceNames(IUsb::descriptor)),
android::hardware::PrintInstanceNameToString);
Argumennya adalah:
InstantiationName
, yang bisa berupa apa saja yang cocok dengan pengujian Anda.PerInstance
adalah nama umum.Nama kelas tes.
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 mengkompilasi nama pengujian berdasarkan nama instans dan nama metode pengujian.
Uji dengan banyak masukan
gtest mendukung tupel untuk pengujian dengan parameter nilai. Ketika pengujian HAL memerlukan pengujian dengan banyak input (misalnya, pengujian dengan banyak antarmuka), Anda dapat menulis gtest dengan tuple
sebagai parameter pengujian. Kode lengkapnya dapat ditemukan di VtsHalGraphicsMapperV2_1TargetTest
.
Dibandingkan dengan gtest dengan parameter pengujian tunggal, pengujian ini perlu menggunakan tuple
sebagai parameter pengujian seperti yang ditunjukkan pada contoh di bawah ini.
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 khusus.
Untuk membuat contoh rangkaian pengujian, makro INSTANTIATE\_TEST\_CASE\_P
juga digunakan, dengan dua perbedaan:
- Argumen ketiga adalah kumpulan tupel (versus kumpulan string dalam kasus dasar).
- Metode untuk mengkompilasi nama pengujian harus mendukung
tuple
. Anda dapat menggunakan metode bawaanPrintInstanceTupleNameToString
, yang dapat menangani tupel string, seperti yang ditunjukkan pada contoh di bawah.
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<>);