当前位置: 首页 > 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/news/17356.html

相关文章:

  • Spring常用注解总结
  • PAT A1024 Palindromic Number
  • Java对象的创建方式以及对象的引用
  • 【Elsevier】中科院2区TOP, 高被引119篇, 稳定检索22年, 1周可见刊,5月15截稿~
  • Simulink 自动代码生成电机控制:弱磁控制从仿真到硬件开发板验证实验
  • 豪取BAT!超详细暑期实习算法面经(非科班无论文)
  • 如何监控一个程序的运行情况,然后视情况将进程杀死并重启
  • redis使用总结
  • 对传递函数的零极点、频率响应、稳定性的理解
  • Vue3 如何全局使用按钮截流指令
  • 复古决战快速施法穿墙秒怪分析流程及安全防护
  • 网络基础设施 拥塞控制
  • 基于JavaWeb实现的寻码网文章资讯管理系统
  • 动态页面配置
  • 我有一个方法判断你有没有编程天赋
  • ElasticSearch学习随笔之分词算法
  • 第17章 信息系统安全管理
  • IAST工具是如何工作的?主动和被动IAST有什么区别?
  • 信号完整性分析基础知识之传输线和反射(三):仿真和测试反射波形
  • 开放式基金净值估算数据 API 数据接口
  • 编写服务器重启的脚本(rc.local调用版本)
  • 基于GWO灰狼优化算法的城市路径优化问题GWO-TSP(MATLAB程序)
  • 操作系统——线程调度
  • SpringBoot整合Mybatis-Plus、Jwt实现登录token设置
  • Java回收垃圾的基本过程与常用算法
  • 面试总结,4年经验
  • python语法入门到面向过程编程(二)
  • 类与对象之构造函数
  • SPSS如何进行基本统计分析之案例实训?
  • 什么是工业互联网?5G到底能在工业互联网中承担哪些重任呢?