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

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

より複雑なパラメータが必要な場合は、構造体とカスタムの GTest 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<>);