HAL testi için parametre haline getirilmiş GTest

HAL arayüzü için birden fazla uygulama olabilir. HAL uygulamasının her örneğini test etmek için standart yöntem, değer parametreli bir GTest yazmaktır.

Temel test kurulumu

GTest, her bir örneğin adını parametre olarak içeren testing::TestWithParam temel sınıfını devralmalıdır. SetUp yönteminde hizmet, aşağıdaki kod snippet'inde gösterildiği gibi örnek adına göre örneklenebilir.

// 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);
...
 }

Her test yöntemi için aşağıdaki örnekte gösterildiği gibi TEST_P makrosunu kullanın:

TEST_P(UsbHidlTest, setCallback) {
...
}

Paketi aşağıdaki örnekte gösterildiği gibi INSTANTIATE_TEST_SUITE_P makrosuyla örneklendirin:

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

Bağımsız değişkenler şunlardır:

  1. InstantiationName, testinizle eşleşen herhangi bir şey olabilir. PerInstance yaygın bir addır.

  2. Test sınıfının adı.

  3. Yerleşik yöntemden alınabilen örnek adları koleksiyonu (ör. getAllHalInstanceNames).

  4. Test yöntemi adını yazdırma yöntemi. PrintInstanceNameToString, örnek adına ve test yöntemi adına göre bir test adı derlemek için kullanabileceğiniz yerleşik bir addır.

Birden fazla girişle test etme

GTest, değer parametreli testler için tuple'leri destekler. Bir HAL testinin birden fazla girişle test edilmesi gerektiğinde (ör. birden fazla arayüz içeren bir test), test parametresi olarak tuple içeren bir GTest yazabilirsiniz. Kodun tamamını VtsHalGraphicsMapperV2_1TargetTest adresinde bulabilirsiniz.

Tek bir test parametresi içeren GTest'e kıyasla bu testin, aşağıdaki örnekte gösterildiği gibi test parametresi olarak tuple kullanması gerekir:

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())));

}

Daha karmaşık parametrelere ihtiyaç duyuluyorsa yapı ve özel GTest ToString işlevleri kullanılması önerilir.

Test paketini örneklendirmek için INSTANTIATE\_TEST\_CASE\_P makrosu da iki farklılık olmakla birlikte kullanılır:

  • Üçüncü bağımsız değişken, temel durumdaki dize koleksiyonunun aksine bir tuple koleksiyonudur.
  • Test adı derleme yönteminin tuple öğesini desteklemesi gerekir. Aşağıdaki örnekte gösterildiği gibi dize gruplarını işleyebilen yerleşik PrintInstanceTupleNameToString yöntemini kullanabilirsiniz:
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<>);