c++ - 使用谷歌测试将类型名和字符串传递给参数化测试

标签 c++ googletest

有没有一种方法可以使用 google 的测试将类型和字符串都传递给参数化测试。

我想做的事:

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 = ..;
  ...
}

提前致谢

最佳答案

值参数化测试不适用于传递类型信息;您只能使用类型化或类型参数化测试来做到这一点。在这两种情况下,您都必须将类型和字符串信息打包到特殊结构中。这是如何使用 type-parameterized tests 完成的:

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");

这很复杂,但没有简单的方法可以做到这一点。我最好的建议是尝试重构您的测试以避免同时需要类型和值信息。但如果你必须这样做,这里就是方法。

关于c++ - 使用谷歌测试将类型名和字符串传递给参数化测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3258230/

相关文章:

C++在头文件中定义类,并在源文件中实现其成员

c++ - 检查 GTest 中 EXPECT_* 宏的结果或在 ASSERT_* 失败时运行代码

c++ - 如何检查 Google Test 是否在我的代码中运行

c++ - Google Mock 单元测试静态方法 c++

C++ 获取目录前缀

c++ - 侵入式或非侵入式

cmake - 将 google-test 添加到 CMake 项目中的子文件夹

c++ - 使用 GMOCK 在 C++ 中模拟新运算符

java - 是否有任何技术原因导致 Java 应用程序和 C++ 应用程序之间的吞吐量存在显着差异?

c++ - 使用模板函数继承类