当前位置: 首页 > article >正文

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

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

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


http://www.kler.cn/a/17356.html

相关文章:

  • 智能电视/盒子的应用管理——通过ADB工具优化体验
  • [Docker#8] 容器配置 | Mysql | Redis | C++ | 资源控制 | 命令对比
  • 实验一:自建Docker注册中心
  • STM32 GPIO 配置
  • 单元测试、集成测试、系统测试有什么区别
  • 【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-最大的数
  • Spring常用注解总结
  • PAT A1024 Palindromic Number
  • Java对象的创建方式以及对象的引用
  • 【Elsevier】中科院2区TOP, 高被引119篇, 稳定检索22年, 1周可见刊,5月15截稿~
  • Simulink 自动代码生成电机控制:弱磁控制从仿真到硬件开发板验证实验
  • 豪取BAT!超详细暑期实习算法面经(非科班无论文)
  • 如何监控一个程序的运行情况,然后视情况将进程杀死并重启
  • redis使用总结
  • 对传递函数的零极点、频率响应、稳定性的理解
  • Vue3 如何全局使用按钮截流指令
  • 复古决战快速施法穿墙秒怪分析流程及安全防护
  • 网络基础设施 拥塞控制
  • 基于JavaWeb实现的寻码网文章资讯管理系统
  • 动态页面配置
  • 我有一个方法判断你有没有编程天赋
  • ElasticSearch学习随笔之分词算法
  • 第17章 信息系统安全管理
  • IAST工具是如何工作的?主动和被动IAST有什么区别?
  • 信号完整性分析基础知识之传输线和反射(三):仿真和测试反射波形
  • 开放式基金净值估算数据 API 数据接口