HALテスト用のパラメーター化されたgtest

HALインターフェースの場合、複数の実装が存在する可能性があります。 HAL実装の各インスタンスをテストするための標準的な方法は、値パラメーター化されたgtestを作成することです。

基本的なテストセットアップ

gtestは、基本クラスtesting::TestWithParamを継承する必要があります。このパラメーターのパラメーターは、各インスタンスの名前です。 SetUpメソッドでは、次のコードスニペットに示すように、インスタンス名に基づいてサービスをインスタンス化できます。

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

以下の例に示すように、テスト方法ごとにマクロTEST_Pを使用します。

TEST_P(UsbHidlTest, setCallback) {
...
}

次の例に示すように、マクロINSTANTIATE_TEST_SUITE_Pを使用してスイートをインスタンス化します。

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

議論は次のとおりです。

  1. InstantiationName 。これは、テストに一致するものであれば何でもかまいません。 PerInstanceは一般名です。

  2. テストクラス名。

  3. 組み込みメソッドから取得できるインスタンス名のコレクション。たとえば、 getAllHalInstanceNames

  4. テストメソッド名を出力するメソッド。 PrintInstanceNameToStringは、インスタンス名とテストメソッド名に基づいてテスト名をコンパイルするために使用できる組み込みの名前です。

複数の入力でテストする

gtestは、値パラメーター化されたテストのタプルをサポートします。 HALテストで複数の入力を使用したテスト(たとえば、複数のインターフェイスを使用したテスト)が必要な場合は、テストパラメーターとしてtupleを使用してgtestを記述できます。完全なコードはVtsHalGraphicsMapperV2_1TargetTestにあります。

単一のテストパラメーターを使用するgtestと比較すると、このテストでは、以下の例に示すように、テストパラメーターとしてtupleを使用する必要があります。

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

より複雑なパラメーターが必要な場合は、構造体とカスタムToString関数を使用することをお勧めします。

テストスイートをインスタンス化するために、マクロINSTANTIATE\_TEST\_CASE\_Pも使用されますが、2つの違いがあります。

  • 3番目の引数は、タプルのコレクションです(基本的な場合は文字列のコレクションではありません)。
  • テスト名をコンパイルするメソッドは、 tupleをサポートする必要があります。次の例に示すように、文字列のタプルを処理できる組み込みメソッドPrintInstanceTupleNameToStringを使用できます。
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<>);