Pour une interface HAL, il peut y avoir plusieurs implémentations. Pour tester chaque pour une implémentation HAL, la méthode standard consiste à écrire un GTest paramétré sur la valeur.
Configuration de test de base
Le GTest doit hériter de la classe de base testing::TestWithParam
, dont le paramètre est le nom de chaque instance. Dans la méthode SetUp
, le service peut être instancié en fonction du nom de l'instance, comme indiqué dans l'extrait de code suivant.
// 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);
...
}
Pour chaque méthode de test, utilisez la macro TEST_P
, comme illustré dans l'exemple suivant :
TEST_P(UsbHidlTest, setCallback) {
...
}
Instanciez la suite avec
INSTANTIATE_TEST_SUITE_P
, comme illustré dans l'exemple suivant:
INSTANTIATE_TEST_SUITE_P(
PerInstance, UsbHidlTest,
testing::ValuesIn(android::hardware::getAllHalInstanceNames(IUsb::descriptor)),
android::hardware::PrintInstanceNameToString);
Les arguments sont les suivants :
InstantiationName
, qui peut être n'importe quel élément correspondant à votre test.PerInstance
est un nom commun.Nom de la classe de test.
Une collection de noms d'instances, être récupérées à partir de la méthode intégrée, par exemple
getAllHalInstanceNames
Méthode permettant d'imprimer le nom de la méthode de test.
PrintInstanceNameToString
est un nom intégré que vous pouvez utiliser pour compiler un nom de test basé sur le nom de l'instance et le nom de la méthode de test.
Tester avec plusieurs entrées
GTest est compatible avec les tupels pour les tests paramétrés par valeur. Lorsqu'un
Le test HAL nécessite d'effectuer un test avec plusieurs entrées (par exemple, un test avec
plusieurs interfaces), vous pouvez écrire un test GTest avec tuple
comme
paramètre de test. Le code complet se trouve dans VtsHalGraphicsMapperV2_1TargetTest
.
Contrairement au GTest avec un seul paramètre de test, ce test doit utiliser tuple
comme paramètre de test, comme illustré dans l'exemple suivant :
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())));
…
}
Si vous avez besoin de paramètres plus complexes, nous vous recommandons d'utiliser un
et les fonctions ToString
GTest personnalisées.
Pour instancier la suite de tests, la macro INSTANTIATE\_TEST\_CASE\_P
est également
utilisés, à deux différences près:
- Le troisième argument est une collection de tuples (par rapport à une collection de chaînes (dans le cas de base).
- La méthode de compilation d'un nom de test doit être compatible avec
tuple
. Vous pouvez utiliser la méthode intégréePrintInstanceTupleNameToString
, qui peut gérer des tupels de chaînes, comme illustré dans l'exemple suivant :
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<>);