HAL testi için parametreli gtest

Bir HAL arayüzü için birden fazla uygulama olabilir. Her örneği bir HAL uygulaması için test etmenin standart yolu, değer parametreli bir gtest yazmaktır.

Temel test kurulumu

gtest, parametresi her örneğin adı olan testing::TestWithParam temel sınıfını miras almalıdır. SetUp yönteminde hizmet, aşağıdaki kod parçacığında gösterildiği gibi örnek adına göre başlatılabilir.

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

Aşağıdaki örnekte gösterildiği gibi paketi INSTANTIATE_TEST_SUITE_P makrosu ile oluşturun.

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

Argümanlar şunlardır:

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

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

  3. Yerleşik yöntemden alınabilen örnek adlarından oluşan bir koleksiyon; örneğin getAllHalInstanceNames .

  4. Test yöntemi adını yazdırma yöntemi. PrintInstanceNameToString örnek adı 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 edin

gtest, değer parametreli testler için tanımlama gruplarını destekler. Bir HAL testi birden fazla girişle test yapılmasını gerektirdiğinde (örneğin, birden fazla arayüze sahip bir test), test parametresi olarak tuple ile bir gtest yazabilirsiniz. Kodun tamamı VtsHalGraphicsMapperV2_1TargetTest bulunabilir.

Tek test parametreli gtest ile karşılaştırıldığında, 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ç duyulursa bir yapı ve özel gtest ToString işlevlerinin kullanılması önerilir.

Test paketini başlatmak için INSTANTIATE\_TEST\_CASE\_P makrosu da iki farkla kullanılır:

  • Üçüncü argüman bir tuple koleksiyonudur (temel durumda bir dizi koleksiyonuna karşılık).
  • Test adını derleme yönteminin tuple desteklemesi gerekir. Aşağıdaki örnekte gösterildiği gibi dize dizilerini işleyebilen PrintInstanceTupleNameToString yerleşik 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<>);