gtest之高级主题
目录
- Value-Parameterized测试
- 示例
- Value-Parameterized实现
- 类型测试
Value-Parameterized测试
示例
先看测试代码,需要验证以下三个函数的返回值和1,2,3做对比
int test_p_func1() {
return 1;
}
int test_p_func2() {
return 2;
}
int test_p_func3() {
return 3;
}
用 TEST
这样写
TEST(TestPFuncSuite, TestPFunc1) {
EXPECT_EQ(test_p_func1(), 1);
EXPECT_EQ(test_p_func1(), 2);
EXPECT_EQ(test_p_func1(), 3);
EXPECT_EQ(test_p_func2(), 1);
EXPECT_EQ(test_p_func2(), 2);
EXPECT_EQ(test_p_func2(), 3);
EXPECT_EQ(test_p_func3(), 1);
EXPECT_EQ(test_p_func3(), 2);
EXPECT_EQ(test_p_func3(), 3);
}
这里因为不同的输入(要测试的接口)分别写了EXPECT_EQ,造成代码冗余,为避免这种情况,可以使用Value-parameterized tests。Value-parameterized tests可以通过不同的参数测试功能,避免因为不同的参数而要拷贝多个test body。用Value-parameterized tests可以按如下实现
class TableTestSample1 : public ::testing::TestWithParam<std::function<int()>>
{
public:
void SetUp() override {
std::function<int()> f = GetParam();
val_ = f();
}
protected:
int val_;
};
TEST_P(TableTestSample1, aaa) {
EXPECT_EQ(1, val_);
EXPECT_EQ(2, val_);
EXPECT_EQ(3, val_);
}
INSTANTIATE_TEST_SUITE_P(MyTestPCase1, TableTestSample1, ::testing::Values(&test_p_func1, &test_p_func2, &test_p_func3));
Value-Parameterized实现
分三步
- 实现一个fixture类,这个类必须要继承自testing::Test 和 testing::WithParamInterface,为简便起见,可以直接派生自testing::TestWithParam(testing::TestWithParam派生自testing::Test 和 testing::WithParamInterface)。注意:
- T可以是任意可以拷贝的类型;
- 如果T是一个裸指针类型,需要对其生命周期管理。
- 使用TEST_P宏定义
- 使用INSTANTIATE_TEST_SUITE_P 宏通过你指定的一系列参数实例化这个test suite
类型测试
假设相同的接口,有不同的实现,想要确保他们满足相同的要求;或者定义了不同的类型,但是它们有着相同的概念(啥意思?)要想验证,这两种情况下对不同的类型有着相同的测试逻辑,如果使用TEST 或者 TEST_F会显得相当冗长,此时可以使用typed tests。这里着重理解下不同的类型有相同的接口
实现步骤:
- 定义一个fixture模板类,继承自::testing::Test
- 关联测试套和要测试的一系列类型
using MyTypes = ::testing::Types<char, int, unsigned int>;
TYPED_TEST_SUITE(FooTest, MyTypes);
注意这里的类型别名是有必要的
3. 使用TYPED_TEST()定义typed test suite