0
点赞
收藏
分享

微信扫一扫

阿里云服务器镜像怎么选?操作系统版本选择说明

惠特曼 2023-05-07 阅读 54

目录

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。这里着重理解下不同的类型有相同的接口
实现步骤:

  1. 定义一个fixture模板类,继承自::testing::Test
  2. 关联测试套和要测试的一系列类型
using MyTypes = ::testing::Types<char, int, unsigned int>;
TYPED_TEST_SUITE(FooTest, MyTypes);

注意这里的类型别名是有必要的
3. 使用TYPED_TEST()定义typed test suite

举报

相关推荐

0 条评论