Interfejs HAL może mieć wiele implementacji. Aby przetestować każdą instancję implementacji HAL, standardowym sposobem jest napisanie testu GTest z parametrami wartości.
Podstawowa konfiguracja testu
Test GTest musi dziedziczyć klasę bazową testing::TestWithParam
, której parametrem jest nazwa każdej instancji. W metodzie SetUp
usługę można utworzyć na podstawie nazwy instancji, jak pokazano w tym fragmencie kodu.
// 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);
...
}
W przypadku każdej metody testowania użyj makra TEST_P
, jak pokazano w tym przykładzie:
TEST_P(UsbHidlTest, setCallback) {
...
}
Utwórz instancję pakietu za pomocą makra INSTANTIATE_TEST_SUITE_P
, jak pokazano w tym przykładzie:
INSTANTIATE_TEST_SUITE_P(
PerInstance, UsbHidlTest,
testing::ValuesIn(android::hardware::getAllHalInstanceNames(IUsb::descriptor)),
android::hardware::PrintInstanceNameToString);
Argumenty to:
InstantiationName
, czyli dowolny element pasujący do testu.PerInstance
to popularna nazwa.Nazwa klasy testu.
Kolekcja nazw instancji, które można pobrać za pomocą wbudowanej metody, np.
getAllHalInstanceNames
.Metoda drukowania nazwy metody testu.
PrintInstanceNameToString
to wbudowana nazwa, której możesz użyć do utworzenia nazwy testu na podstawie nazwy instancji i nazwy metody testu.
Testowanie z użyciem wielu danych wejściowych
GTest obsługuje krotki w przypadku testów z parametrami wartości. Jeśli test HAL wymaga testowania z użyciem wielu danych wejściowych (np. test z wieloma interfejsami), możesz napisać test GTest z parametrem testu tuple
. Pełny kod znajdziesz w VtsHalGraphicsMapperV2_1TargetTest
.
W porównaniu z GTestem z 1 parametrem testu ten test musi używać parametru testu tuple
, jak pokazano w przykładzie poniżej:
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())));
…
}
Jeśli potrzebujesz bardziej skomplikowanych parametrów, zalecamy użycie struktury i niestandardowych funkcji GTest ToString
.
Do utworzenia instancji pakietu testów używa się też makra INSTANTIATE\_TEST\_CASE\_P
, ale z 2 różnicami:
- Trzeci argument to kolekcja krotek (w przeciwieństwie do kolekcji ciągów znaków w przypadku podstawowym).
- Metoda kompilacji nazwy testu musi obsługiwać
tuple
. Możesz użyć wbudowanej metodyPrintInstanceTupleNameToString
, która obsługuje krotki ciągów znaków, jak pokazano w tym przykładzie:
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<>);