Gtest(Google Test)使用

news2024/9/20 0:30:40

下面Gtest是在arm-linux下运行的

https://download.csdn.net/download/qq_31868891/89729426

一、下载编译

1.下载gtest代码

https://github.com/google/googletest

2.配置编译

vscode安装CMake Tools

将上面下载的gtest代码文件夹拖到vscode里,然后选择对应的CMakeLists.txt

如下根据自己需求修改编译的gcc版本

选择好gcc版本点击编译

编译后会在build/lib下生成静态库文件

二、使用

建一个Gtest文件夹

把编译生成的lib文件夹复制Gtest文件夹

把googletest-main./googletest-main/googletest/include/下gtest文件夹复制到Gtest文件夹

把googletest-main./googletest-main/googlemock/include/下gmock文件夹复制到Gtest文件夹

编译时要带 -LGtest/lib -lgtest -lgtest_main -lgmock -lgmock_main

gtest 使用
int Targetfun::printfint(int n)
{
    printf("%d\n", n);
    return n;
}

//成功
TEST_F(UnitTest, printfint1)
{    
    int ret = printfint(1);   
    EXPECT_EQ(ret, 1);
}
//失败
TEST_F(UnitTest, printfint2)
{    
    int ret = printfint(2);   
    EXPECT_EQ(ret, 1);
}

gmock 模拟返回值使用

如下假设printint函数依赖别的硬件无法运行,可以用mock让函数直接返回275,即printffun返回false。mock替换要先把 printfint定义为虚函数

virtual int printfint(int n);

bool Targetfun::printffun(int n)
{
    printf("Target fun\n");
    int a = printfint(n);
    if (a > 256)
    {
        printf("%d>256\n", a);
        return false;
    }
    printf("%d<=256\n", a);
    return true;
}

//测试代码
class UnitTest : public ::testing::Test, public Targetfun
{
public:
    void SetUp();
    void TearDown();

public:
    MOCK_METHOD(int, printfint, (int n));//用于gmock模拟函数
};

//如下通过mock让代码返回275
TEST_F(UnitTest, printffun2)
{
    int n = 2;
    EXPECT_CALL(*this, printfint(n)).WillOnce(::testing::Return(257));
    bool ret = printffun(n);
    EXPECT_EQ(ret, false);
}

gmock 替换虚函数注意

如下因为虚函数被mock替换执行会失败,可以参考printfint4在函数前加类

class UnitTest : public ::testing::Test, public Targetfun
{
public:
    void SetUp();
    void TearDown();

public:
    MOCK_METHOD(int, printfint, (int n));
};

//失败
TEST_F(UnitTest, printfint3)
{
    int ret = printfint(3);
    EXPECT_EQ(ret, 3);
}
//成功
TEST_F(UnitTest, printfint4)
{
    int ret = Targetfun::printfint(4);
    EXPECT_EQ(ret, 4);
}

函数运行条件

如下测试CalcSum函数要提前初始化m_pCalcSum结构体

//如下m_pCalcSum是指针要提前初始化,不能为null
int Targetfun::CalcSum(int a, int b, int *sum)
{
    m_pCalcSum->sum = a + b;
    *sum = m_pCalcSum->sum;
    printf("%d\n", m_pCalcSum->sum);
    return m_pCalcSum->sum;
}

//如下5是放函数里赋值,6是放SetUp里
//可以粗滤认为SetUp与TearDown()是UnitTest类的构造与析构函数
void UnitTest::SetUp()
{
    // 在每个测试案例开始前设置测试环境    
    m_pCalcSum = &m_CalcSum;
}

void UnitTest::TearDown()
{
    // 在每个测试案例结束后清理测试环境
}


TEST_F(UnitTest, printfint5)
{
    int sum;
    S_CalcSum mCalcSum;
    m_pCalcSum = &mCalcSum;
    int ret = Targetfun::CalcSum(4, 5, &sum);
    printf("mCalcSum:%d m_CalcSum:%d\n", mCalcSum.sum,m_CalcSum.sum);
    EXPECT_EQ(ret, 9);
    EXPECT_EQ(sum, 9);
}

TEST_F(UnitTest, printfint6)
{
    int sum;   
    int ret = Targetfun::CalcSum(8, 9, &sum);
    EXPECT_EQ(ret, 17);
    EXPECT_EQ(sum, 17);
}

gmock 模拟函数参数(指针)返回
int Targetfun::CalcSum(int a, int b, int *sum)
{
    m_pCalcSum->sum = a + b;
    *sum = m_pCalcSum->sum;
    printf("%d\n", m_pCalcSum->sum);
    return m_pCalcSum->sum;
}

bool Targetfun::CalcSumfun(int a, int b)
{
    int sum;
    CalcSum(a, b, &sum);
    printf("%d\n", sum);
    if (sum > 10)
    {
        return true;
    }
    return false;
}



//测试  
//参数占位  testing::_  
//<2>设置第2个参数返回值  testing::SetArgPointee<2>(sum)
//<num> num =0,1,2....
TEST_F(UnitTest, printfint7)
{
    int sum=15;   
    EXPECT_CALL(*this, CalcSum(testing::_, testing::_, testing::_)).WillOnce(testing::DoAll(testing::SetArgPointee<2>(sum), 
                                                            testing::Return(sum)));
                                                         
    bool ret = Targetfun::CalcSumfun(5, 15);
    EXPECT_EQ(ret, true);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2118786.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAP 凭证的替代传输GGB1

SAP 凭证的替代传输GGB1 之前没有留意过&#xff0c;前人一直是直接改的&#xff0c;搜索了一下是可以这样弄得 1.一般通过OBBH&#xff0c;配置的凭证替代&#xff0c;产生的请求号&#xff0c;从开发机传输不到生产机。只能通过GGB1来传输。在GGB1里面选择要传输的替代 选中…

BookStack在线文档管理系统本地Docker部署与远程访问详细教程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

LEAN类型系统属性之规范性(Regularity)注解

在 《小结》 中&#xff0c;列出LEAN类型系统所定义的全部规律&#xff0c;下面 关于 LEAN 属性 的一些推论&#xff08;Lemma&#xff09;进行注解。主要是其规范性&#xff08;Regularity&#xff09;&#xff0c;以说明LEAN类型系统是完备构建的&#xff08;well founded&am…

Java+selenium+chrome+linux/windows实现数据获取

背景&#xff1a;在进行业务数据获取或者自动化测试时&#xff0c;通常会使用模拟chrome方式启动页面&#xff0c;然后获取页面的数据。在本地可以使用windows的chromedriver.exe进行打开chrome页面、点击等操作。在linux 下通常使用无界面无弹窗的方式进行操作。接下来是实现方…

【AI绘画】Midjourney之Lighting详解

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AI绘画 | Midjourney 文章目录 &#x1f4af;前言&#x1f4af;为什么要学习光影控制光影控制的作用 &#x1f4af;强化主题hard lighting&#xff08;硬光 &#xff09;soft lighting&#xff08;软光/柔光&#xff09;测试 &…

宠物浮毛怎么办,用专业工具——希喂、小米、美的宠物空气净化器

前段时间被医生科普&#xff0c;原来猫咪的毛发也分好几种的&#xff0c;我不是最后一个知道的吧...事情的起因是这样的&#xff0c;上次我去朋友家和她的猫咪玩&#xff0c;实在太可爱了所以自己也养了一只猫。一人一猫的幸福生活没过多久&#xff0c;我就发现自己的鼻炎好像复…

如何用AI先行者2.0轻松画出美图?我的亲身体验分享给你看!

越来越多的AI绘画工具开始出现在市场上。AI先行者2.0是一款备受关注的AI绘画软件。本文将为大家详细介绍这款软件的功能特点&#xff0c;并分享一些使用心得。 AI先行者2.0拥有强大的图像处理能力。 它支持多种AI模型&#xff0c;包括Midjourney、Niji、DallE3和Stable Diffu…

【C++】——string类的使用

目录 一.为什么学习string类&#xff1f; 1.1 C语言的字符串 二. 标准库中的string类 2.1 string类(了解) 2.2 string类成员函数 ● string类对象的常见构造 ● string类析构函数 ● 赋值重载 2.3 string的迭代器 <1>正向迭代器 Iterator <2> 反向迭代器…

接口测试工具:Postman详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、前言 在前后端分离开发时&#xff0c;后端工作人员完成系统接口开发后&#xff0c;需要与前端人员对接&#xff0c;测试调试接口&#xff0c;验证接口的正确性…

面试笔试 场景题(部分总结)

文章目录 题目--找出一堆随机数中的前 k 大数字PriorityQueue 类PriorityQueue 常用方法 题目--数组中的第 K 个最大元素 题目–找出一堆随机数中的前 k 大数字 找出一堆随机数中的前 k 大数字&#xff0c;找出一堆随机数中的前 k 小数字。都一样 方法&#xff1a;快速排序。…

【springsecurity】使用PasswordEncoder加密用户密码

目录 1. 导入依赖2. 配置 PasswordEncoder3. 使用 PasswordEncoder 加密用户密码4. 使用 PasswordEncoder 验证用户密码 1. 导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifac…

docker部署NginxProxyManager

1.效果展示 有啥用&#xff1f;&#xff0c; 能把域名代理到 117.xx.xx.xx:3000 服务器上 而不用写一堆的location / { proxy… } 2.步骤 2.1往期docker安装 docker和docker-compose安装脚本-CSDN博客 2.2创建目录 mkdir ~/npm #创建一个目录用来安装此服务 cd ~/npm #…

兴业周报|“一套房子不留”的马斯克 在北京买房了?

稀有房源&#xff1a;标的物位于北京五环内&#xff0c;真正的城市别墅。中间建筑三区“全网无二手”&#xff0c;二手房市场无在售房源。 高性价比&#xff1a;标的物市场价2800万&#xff0c;起拍价1124万&#xff0c;四折上拍&#xff0c;四室两厅南北通透&#xff0c;建面…

基于SpringBoot的口腔管理平台

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架 工具&#xff1a;IDEA/Eclipse、Navicat、Maven 系统展示 首页 会员管理 病例就诊…

RuoYi-Vue若依框架-系统监控内定时任务的使用

定时任务 之前定时任务是在后端代码内使用cron表达式对对应的接口方法按照表达式执行&#xff0c;现在可以在框架内自行添加任务&#xff0c;包括自定义任务名&#xff0c;在调用方法内写对应实体类.接口方法名&#xff0c;cron表达式&#xff0c;添加好后即可执行 调用方法…

业余考什么证书比较实用?

在业余时间里&#xff0c;获得一些有用的证书不仅能提升你的专业素养&#xff0c;还能增强你在职场上的竞争力。 特别是职业技能证书和行业认证证书&#xff0c;这两者受到了广大职场人士的高度关注。 一、业余时间考取的实用证书 行业认证证书主要针对特定行业或职业&#…

16 训练自己语言模型

在很多场景下下&#xff0c;可能微调模型并不能带来一个较好的效果。因为特定领域场景下&#xff0c;通用话模型过于通用&#xff0c;出现多而不精。样样通样样松&#xff1b;本章主要介绍如何在特定的数据上对模型进行预训练&#xff1b; 训练自己的语言模型&#xff08;从头开…

AT3340-6T杭州中科微BDS定位授时板卡应用领域

AT3340-6T是一款高性能多系统卫星定位安全授时板卡&#xff0c;具有高灵敏度、高精度、抗干扰、低功耗等优势&#xff0c;可以满足电力授时、通信授时和金融授时等领域的应用。 电文完好性检测与告警 AT3340-6T 板卡支持电力授时标准要求的 UTC 信息异常告警&#xff0c;和卫…

基于Spring Boot的高校选课平台的设计与实现81917

目 录 1 绪论 1.1研究背景与意义 1.2研究内容 1.3论文结构与章节安排 2 高校选课平台系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 高校选课…

【OpenCV-图像梯度】Scharr算子和laplacian算子

1 图像梯度-Sobel算子 import cv2 # 导入 OpenCV 库# 读取灰度图像 img cv2.imread(./img/pie.png, cv2.IMREAD_GRAYSCALE) # 使用 imread 函数读取图像文件&#xff0c;路径为 ./img/pie.png # cv2.IMREAD_GRAYSCALE 表示以灰度模式读取图像# 显示图像 cv2.imshow("im…