HAL testi için parametreli GTest

Bir HAL arayüzü için birden fazla uygulama olabilir. Bir 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, parametrenin her örneğin adı olduğu 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 başlatın:

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

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

  1. InstantiationName, bu değer testinizle eşleşen herhangi bir şey olabilir. PerInstance yaygın bir ad.

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

  3. Yerleşik yöntemden alınabilen örnek adları koleksiyonu (örneğin, getAllHalInstanceNames).

  4. Test yöntemi adını yazdırma yöntemi. PrintInstanceNameToString, örnek adı ve test yöntemi adına göre 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 demetleri destekler. Bir HAL testi birden fazla girişle test edilmesini gerektirdiğinde (örneğin, birden fazla arayüz içeren bir test), test parametresi olarak tuple ile bir GTest yazabilirsiniz. Kodun tamamını VtsHalGraphicsMapperV2_1TargetTest adresinde bulabilirsiniz.

Tek bir test parametresi içeren 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 parametreler gerekiyorsa bir yapı ve özel GTest ToString işlevlerinin kullanılması önerilir.

Test paketini oluşturmak için INSTANTIATE\_TEST\_CASE\_P makrosu da kullanılır. Bu makro, iki farklılık içerir:

  • Üçüncü bağımsız değişken, temel durumda olduğu gibi bir dize koleksiyonu değil, bir demet koleksiyonudur.
  • Test adı derleme yöntemi tuple karakterini desteklemelidir. Aşağıdaki örnekte gösterildiği gibi, yerleşik yöntemi PrintInstanceTupleNameToString kullanarak dizelerden oluşan demetleri işleyebilirsiniz:
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<>);