GoogleTest 单元测试
假设我们有两个函数 complexFunction 和 helperFunction,其中 complexFunction 调用了 helperFunction。我们将编写测试 complexFunction 的单元测试,并在调用 helperFunction 的地方打桩。
// 复杂函数示例
int helperFunction(int x) {return x * 2;
}// 调用了 helperFunction 的复杂函数
int complexFunction(int a, int b) {if (a > 0) {for (int i = 0; i < a; ++i) {if (i % 2 == 0) {b += helperFunction(i);}}} else {b = -1;}return b;
}
现在,我们将编写一个单元测试来测试 complexFunction 并在调用 helperFunction 的地方打桩。
#include <gtest/gtest.h>
#include <gmock/gmock.h>// 导入要测试的函数
#include "complex_function.h" // 假设你的函数保存在 complex_function.h 文件中// 引入命名空间
using ::testing::Return;// 模拟 helperFunction 函数
class MockHelperFunction {
public:MOCK_METHOD(int, helperFunction, (int), (const));
};// 单元测试套件
class ComplexFunctionTest : public ::testing::Test {
protected:// 在每个测试用例运行之前调用void SetUp() override {// 可以在这里进行初始化操作}// 在每个测试用例运行之后调用void TearDown() override {// 可以在这里进行资源释放等操作}// 模拟的 helperFunctionMockHelperFunction mock_helper;
};// 测试用例:测试 complexFunction 函数
TEST_F(ComplexFunctionTest, TestComplexFunction) {// 准备测试数据int a = 3, b = 2;// 设置预期调用EXPECT_CALL(mock_helper, helperFunction(::testing::_)).Times(3).WillRepeatedly(Return(4)); // 模拟 helperFunction 返回值// 调用 complexFunction 函数int result = complexFunction(a, b);// 验证结果EXPECT_EQ(result, 14);
}// 运行所有测试
int main(int argc, char **argv) {// 初始化 Google 测试::testing::InitGoogleTest(&argc, argv);// 运行所有测试用例return RUN_ALL_TESTS();
}
// 函数的测试
#include <gtest/gtest.h>
#include <array>#include "geoalg.h"TEST(Vector2DTest, Subtract)
{const std::array<double, 2> v0 = {3.0, 4.0};const std::array<double, 2> v1 = {1.0, 2.0};std::array<double, 2> result = v0 - v1;std::array<double, 2> expected = {2.0, 2.0};EXPECT_EQ(result, expected);
}TEST(Vector2DTest, Add)
{const std::array<double, 2> v0 = {3.0, 4.0};const std::array<double, 2> v1 = {1.0, 2.0};std::array<double, 2> result = v0 + v1;std::array<double, 2> expected = {4.0, 6.0};EXPECT_EQ(result, expected);
}TEST(Vector2DTest, MultiplyByScalar)
{const std::array<double, 2> v = {3.0, 4.0};double a = 2.0;std::array<double, 2> result = a * v;std::array<double, 2> expected = {6.0, 8.0};EXPECT_EQ(result, expected);
}TEST(Vector2DTest, DivideByScalar)
{const std::array<double, 2> v = {6.0, 8.0};double a = 2.0;std::array<double, 2> result = v / a;std::array<double, 2> expected = {3.0, 4.0};EXPECT_EQ(result, expected);//double b = 0.0;//std::array<double, 2> u = {6.0, 8.0};//ASSERT_THROW({u / b;}, std::runtime_error);//ASSERT_THROW({u /= b;}, std::runtime_error);}TEST(Vector2DTest, CrossProduct)
{const std::array<double, 2> v0 = {3.0, 4.0};const std::array<double, 2> v1 = {1.0, 2.0};double result = cross(v0, v1);EXPECT_EQ(result, 2.0);
}TEST(Vector2DTest, DotProduct)
{const std::array<double, 2> v0 = {3.0, 4.0};const std::array<double, 2> v1 = {1.0, 2.0};double result = dot(v0, v1);EXPECT_EQ(result, 11.0);
}TEST(Vector2DTest, SquaredLength)
{std::array<double, 2> v = {3.0, 4.0};double result = squared_length(v);EXPECT_EQ(result, 25.0);
}TEST(Vector2DTest, Length)
{const std::array<double, 2> v = {3.0, 4.0};double result = length(v);EXPECT_DOUBLE_EQ(result, 5.0);
}TEST(Vector3DTest, CrossProduct)
{const std::array<double, 3> v0 = {1.0, 2.0, 3.0};const std::array<double, 3> v1 = {4.0, 5.0, 6.0};std::array<double, 3> result = cross(v0, v1);std::array<double, 3> expected = {-3.0, 6.0, -3.0};EXPECT_EQ(result, expected);}TEST(Vector3DTest, DotProduct)
{const std::array<double, 3> v0 = {1.0, 2.0, 3.0};const std::array<double, 3> v1 = {4.0, 5.0, 6.0};double result = dot(v0, v1);double expected = 32.0;EXPECT_EQ(result, expected);
}TEST(Vector3DTest, SquaredLength) {const std::array<double, 3> v = {3.0, 4.0, 12.0};double result = squared_length(v);double expected = 169.0;EXPECT_EQ(result, expected);
}TEST(Vector3DTest, Length)
{const std::array<double, 3> v = {3.0, 4.0, 12.0};double result = length(v);double expected = 13.0;EXPECT_EQ(result, expected);
}TEST(VectorBarycenter, Barycenter)
{const std::array<double, 3> p0 = {1.0, 2.0, 3.0};const std::array<double, 3> p1 = {4.0, 5.0, 6.0};const std::array<double, 3> p2 = {7.0, 8.0, 9.0};const std::array<double, 3> p3 = {10.0, 11.0, 12.0};std::array<double, 3> result = barycenter(p0, p1);std::array<double, 3> expected = {2.5, 3.5, 4.5};EXPECT_EQ(result, expected);result = barycenter(p0, p1, p2);expected = {4.0, 5.0, 6.0};EXPECT_EQ(result, expected);result = barycenter(p0, p1, p2, p3);expected = {6.5, 7.75, 9.0};EXPECT_EQ(result, expected);
}add_executable(test_geoalg test_geoalg.cpp)
target_link_libraries(test_geoalg GTest::gtest_main${CSCEC_LIBRARIES}
)class TetMeshTest : public ::testing::Test{protected:void SetUp(){ mesh.from_one_tetrahedron();auto data = mesh.data();std::cout << mesh << std::endl;}public:TetMesh mesh;}; // end of classTEST_F(TetMeshTest, NumberOfEntities){EXPECT_EQ(mesh.number_of_nodes(),4);EXPECT_EQ(mesh.number_of_cells(),1);}相关文章:
GoogleTest 单元测试
假设我们有两个函数 complexFunction 和 helperFunction,其中 complexFunction 调用了 helperFunction。我们将编写测试 complexFunction 的单元测试,并在调用 helperFunction 的地方打桩。 // 复杂函数示例 int helperFunction(int x) {return x * 2; …...
Mac利用brew安装mysql并设置初始密码
前言 之前一直是在windows上开发后段程序,所以只在windows上装mysql。(我记得linux只需要适应yum之类的命令即可) 另外, linux的移步 linux安装mysql (详细步骤,初次初始化,sql小例子,可视化操作客户端推荐) 好家伙,我佛了,写完当天网上发…...
R语言入门笔记2.2
ifelse语句 结构:ifelse(条件,表达式1,表达式2) #满足条件,则进入表达式1,否则为表达式2 例1: > a1 > ifelse(a<0,"a小于0",ifelse(a0,0,"a大于0")) [1] "a大于0"a1 - 这行代码给变量a…...
一般系统的请求认证授权思路【gateway网关+jwt+redis+请求头httpheader】
gateway:网关,我们都知道网关的作用就是对系统的所有请求,网关都会进行拦截,然后做一些操作(例如:设置每个请求的请求头httpHeader,身份认证等等)此时一般会使用到网关过滤器&#x…...
c# 正则表达式 帮助类
public class RegexHelper { /// <summary> /// 验证输入字符串是否与模式字符串匹配,匹配返回true /// </summary> /// <param name"input">输入字符串</param> /// <param nam…...
告别mPDF迎来TCPDF和中文打印遇到的问题
mPDF是一个用PHP编写的开源PDF生成库。它最初由Claus Holler创建,于2004年发布。原来用开源软件打印中文没有问题,最近发现新的软件包中mPDF被TCPDF代替了,当然如果只用西文的PDF是没有发现问题,但要打印中文就有点抓瞎了如图1&am…...
mysql 多数据源
依赖 <dependencies><!--mysql连接--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!--多数据源--><dependency><g…...
uniapp 使用renderjs引入echarts
效果图: 1.1renderjs引入echarts 组件zmui-echarts.vue: <template><view class"zmui-echarts" :prop"option" :change:prop"echarts.delay"></view> </template><script>export defaul…...
hr最讨厌这6种应届生简历❌
用求职方法,让你变成offer收割机,是我的责任❗ 简历写得好,面试少不了。最近很多应届生找龙猫帮看简历,我发现很多应届生是真不会写简历啊。 有的简历排版花里胡哨,有的自我评价千篇一律,有的实习经历太过…...
【Linux笔记】文件系统与软硬链接
一、文件系统概述 1.1、先来聊一聊“磁盘” 在讲解文件系统之前,我觉得有必要先聊一下“磁盘”,因为我觉得如果弄懂了磁盘的存储原理,大家可能更容易理解文件系统是怎么管理数据的,并且理解计算机是怎么将磁盘抽象到文件系统的。…...
vue3(笔记)
组合式Api setup-----相当于beforeCreate, create生命周期 reactive–定义状态 对象形式 响应式原理 toRefs— Pinia (只有state、getters和actions) 更加简洁的语法,完美支持Vue3的Composition api 和 对TypesCcript的完美支持...
Java面向对象 this
this 在Java中,this 是一个特殊的引用变量,它引用了当前对象实例。当在类的非静态方法或构造方法中使用时,this 关键字指代当前的对象实例。它经常用于区分对象的成员变量和局部变量,或者调用其他重载的方法。 以下是一些使用 t…...
阿里云游戏服务器租用价格表,2024最新报价
阿里云游戏服务器租用价格表:4核16G服务器26元1个月、146元半年,游戏专业服务器8核32G配置90元一个月、271元3个月,阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价: 阿里云游戏服务器租用价格表 阿…...
2-1 动手学深度学习v2-Softmax回归-笔记
回归 VS 分类 回归估计一个连续值分类预测一个离散类别 从回归到多类分类 回归 单连续数值输出输出的区间:自然区间 R \mathbb{R} R损失:跟真实值的区别 分类 通常多个输出(这个输出的个数是等于类别的个数)输出的第 i i i…...
laravel distinct查询问题,laravel子查询写法
直接调用后,count查询会和实际查询的数据对不上,count还是查询全部数据,而实际的列表是去重的。 给distinct加上参数,比如去重的值的id,就加id。 另一种写法是使用group by id 子查询。 sql语句: selec…...
AI助力农作物自动采摘,基于DETR(DEtection TRansformer)开发构建作物生产场景下番茄采摘检测计数分析系统
去年十一那会无意间刷到一个视频展示的就是德国机械收割机非常高效自动化地24小时不间断地在超广阔的土地上采摘各种作物,专家设计出来了很多用于采摘不同农作物的大型机械,看着非常震撼,但是我们国内农业的发展还是相对比较滞后的࿰…...
C语言——字符串大小写互换
前言: 在C语言中,大小写字母相互转换是一个常见的操作。本文将详细介绍C语言中实现大小写字母相互转换的各种方法,并附上代码示例。 目录 一、使用tolower()和toupper()函数 二、使用位操作 三、使用字符串操作函数 一、使用tolower()和t…...
macOS的设置与常用软件(含IntelliJ IDEA 2023.3.2 Ultimate安装,SIP的关闭与开启)
目录 1 系统设置1.1 触控板1.2 键盘 2 软件篇2.1 [科学上网](https://justmysocks5.net/members/)2.1 [安装Chrome浏览器](https://www.google.cn/chrome/index.html)2.2 [安装utools](https://www.u.tools)2.3 [安装搜狗输入法](https://shurufa.sogou.com/)2.4 [安装snipaste…...
http伪造本地用户字段系列总结
本篇记录了http伪造本地用户的多条字段,便于快速解决题目 用法举例: 直接把伪造本地用户的多个字段复制到请求头中,光速解决部分字段被过滤的问题。 Client-IP: 127.0.0.1 Forwarded-For-Ip: 127.0.0.1 Forwarded-For: 127.0.0.1 Forwarded…...
Hadoop-IDEA开发平台搭建
1.安装下载Hadoop文件 1)hadoop-3.3.5 将下载的文件保存到英文路径下,名称一定要短。否则容易出问题; 2)解压下载下来的文件,配置环境变量 3)我的电脑-属性-高级设置-环境变量 4.详细配置文件如下&#…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
