Test gtest paramétré pour les tests HAL

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, de dont le paramètre correspond au nom de chaque instance. Dans SetUp, le service peut être instancié en fonction de 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 indiqué dans l'exemple ci-dessous.

TEST_P(UsbHidlTest, setCallback) {
...
}

Instanciez la suite avec INSTANTIATE_TEST_SUITE_P, comme illustré dans l'exemple ci-dessous.

INSTANTIATE_TEST_SUITE_P(
       PerInstance, UsbHidlTest,
       testing::ValuesIn(android::hardware::getAllHalInstanceNames(IUsb::descriptor)),
       android::hardware::PrintInstanceNameToString);

Les arguments sont les suivants :

  1. InstantiationName, qui peut correspondre à n'importe quel élément correspond à votre test. PerInstance est un nom courant.

  2. Nom de la classe de test.

  3. Une collection de noms d'instances, être récupérées à partir de la méthode intégrée, par exemple getAllHalInstanceNames.

  4. Méthode permettant d'afficher 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 prend en charge les tuples pour les tests paramétrés sur la 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 gtest en utilisant tuple comme paramètre de test. L'intégralité se trouve dans VtsHalGraphicsMapperV2_1TargetTest.

Par rapport au test gtest qui n'inclut qu'un seul paramètre de test, ce test doit utiliser tuple comme paramètre de test, comme illustré dans l'exemple ci-dessous.

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 de structure 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 permettant de compiler un nom de test doit être compatible avec tuple. Vous pouvez utiliser la méthode intégrée PrintInstanceTupleNameToString, qui peut gérer les tuples de chaînes, comme illustré dans l'exemple ci-dessous.
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<>);