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.详细配置文件如下&#…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...