有没有办法使用谷歌的测试将类型和字符串传递给参数化测试。
我想这样做:
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 = ..;
...
}
提前致谢
答案 0 :(得分:9)
值参数化测试不适用于传递类型信息;你只能用类型化或类型参数化测试来做到这一点。在这两种情况下,您都必须将类型和字符串信息打包到特殊结构中。以下是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");
这很复杂,但没有简单的方法可以做到这一点。我最好的建议是尝试重新测试您的测试,以避免需要类型和值信息。但如果你必须,这就是方法。
答案 1 :(得分: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> >
...