7

グーグルのテストを使用してパラメータ化されたテストにタイプと文字列の両方を渡す方法はありますか?

私がしたいのは:

template <typename T>
class RawTypesTest : public ::testing::TestWithParam<const char * type> {
protected:
  virtual void SetUp() {
       message = type;
  }
}; 

TEST_P(RawTypesTest, Foo) {
  ASSERT_STREQ(message, type);
  ParamType * data = ..;
  ...
}

前もって感謝します

4

2 に答える 2

12

値のパラメーター化されたテストは、型情報を渡すためには機能しません。これは、型付きまたは型パラメーター化されたテストでのみ実行できます。どちらの場合も、タイプと文字列の情報を特別な構造にパッケージ化する必要があります。タイプパラメータ化されたテストでそれを行う方法は次のとおりです。

template <typename T> class RawTypesTest : public testing::Test {
 public:
  virtual void SetUp() {
    this->message_ = TypeParam::kStringValue;
  }

 protected:
  const char* const message_;
};

TYPED_TEST_CASE_P(RawTypesTest);

TYPED_TEST_P(RawTypesTest, DoesFoo) {
  ASSERT_STREQ(message, TypeParam::kStringValue);
  TypeParam::Type* data = ...;
}

TYPED_TEST_P(RawTypesTest, DoesBar) { ... }

REGISTER_TYPED_TEST_CASE_P(FooTest, DoesFoo, DoesBar);

そして今、あなたはパラメータ構造を定義し、それらのテストをインスタンス化する必要があります:

struct TypeAndString1 {
  typedef Type1 Type;
  static const char* kStringValue = "my string 1";
};
const char* TypeAndString1::kStringValue;

struct TypeAndString2 {
  typedef Type1 Type;
  static const char* kStringValue = "my string 2";
};
const char* TypeAndString2::kStringValue;

typedef testing::Types<TypeAndString1, TypeAndString2> MyTypes;
INSTANTIATE_TYPED_TEST_CASE_P(OneAndTwo, RawTypeTest, MyTypes);

マクロを使用して、パラメータータイプの定義を簡略化できます。

#define MY_PARAM_TYPE(name, type, string) \
  struct name { \
    typedef type Type; \
    static const char kStringValue = string; \
  }; \
  const char* name::kStringValue

次に、パラメータ構造体の定義がはるかに短くなります。

MY_PARAM_TYPE(TypeAndString1, Type1, "my string 1");
MY_PARAM_TYPE(TypeAndString2, Type2, "my string 2");

これは非常に複雑ですが、これを行う簡単な方法はありません。私の最善のアドバイスは、タイプと値の両方の情報を必要としないように、テストをリファクタリングしてみることです。しかし、必要な場合は、ここに方法があります。

于 2010-07-18T18:17:27.150 に答える
0

TYPED_TEST_Pファミリーのマクロが内部で何をするかについては調査しませんでしたが、目的のためにそれらを使用することは非常に複雑であることがわかりました。タイプの一部としてパラメータをエンコードするだけで同じことができます。

#define TSLP(name, value) \
struct Tslp##name \
{ \
   std::string operator()() \
   { \
      return value; \
   } \
}

TSLP(Empty, "");
TSLP(Foo, "foo");
template<class Type, class Param>
class ParamTextFixture : public Type {
    static std::string message() {
        return Param()();
    }
}

次に、クラスをParamTextFixtureに置き換えるためのタイプを指定するだけです。

typedef ::testing::Types<
    ParamTextFixture<MyClass, TslpEmpty>
    , ParamTextFixture<MyClass, TslpFoo> >
...
于 2015-02-11T00:04:56.190 に答える