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.详细配置文件如下&#…...
如何快速上手艾尔登法环存档编辑器:新手完整指南
如何快速上手艾尔登法环存档编辑器:新手完整指南 【免费下载链接】ER-Save-Editor Elden Ring Save Editor. Compatible with PC and Playstation saves. 项目地址: https://gitcode.com/GitHub_Trending/er/ER-Save-Editor ER-Save-Editor是一款专为《艾尔登…...
电脑风扇智能控制完全指南:从噪音烦恼到散热优化
电脑风扇智能控制完全指南:从噪音烦恼到散热优化 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/FanC…...
Prometheus动态服务发现实战:从文件到K8S的三种配置方法对比
Prometheus动态服务发现实战:文件、Consul与Kubernetes的深度对比 在云原生监控体系中,服务发现机制如同神经系统般实时感知基础设施变化。当面对混合架构时,如何在文件、Consul和Kubernetes三种主流方案中做出技术选型?本文将带…...
如何快速掌握视频特效:StreamFX面向创作者的完整指南
如何快速掌握视频特效:StreamFX面向创作者的完整指南 【免费下载链接】obs-StreamFX StreamFX is a plugin for OBS Studio which adds many new effects, filters, sources, transitions and encoders! Be it 3D Transform, Blur, complex Masking, or even custom…...
开源固件解锁戴森电池:3步拯救你的“32次红灯“报废吸尘器
开源固件解锁戴森电池:3步拯救你的"32次红灯"报废吸尘器 【免费下载链接】FU-Dyson-BMS (Unofficial) Firmware Upgrade for Dyson V6/V7 Vacuum Battery Management System 项目地址: https://gitcode.com/gh_mirrors/fu/FU-Dyson-BMS 你的戴森吸…...
AlwaysOnTop:重新定义你的数字工作空间
AlwaysOnTop:重新定义你的数字工作空间 【免费下载链接】AlwaysOnTop Make a Windows application always run on top 项目地址: https://gitcode.com/gh_mirrors/al/AlwaysOnTop 想象一下这样的场景:你正在为一个重要的项目编写报告,…...
如何高效管理Magpie窗口缩放插件:从安装到优化的完整指南
如何高效管理Magpie窗口缩放插件:从安装到优化的完整指南 【免费下载链接】Magpie An all-purpose window upscaler for Windows 10/11. 项目地址: https://gitcode.com/gh_mirrors/mag/Magpie Magpie作为一款强大的Windows窗口缩放工具,其插件系…...
BepInEx跨平台部署完全指南:从环境配置到性能优化
BepInEx跨平台部署完全指南:从环境配置到性能优化 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 部署挑战自测表 在开始部署前,请先回答以下问题…...
DeepSeek-OCR-2功能测评:多语言支持、复杂背景识别,实测好用
DeepSeek-OCR-2功能测评:多语言支持、复杂背景识别,实测好用 1. 引言:OCR技术的新标杆 在数字化时代,文字识别技术已经成为连接物理世界与数字世界的重要桥梁。DeepSeek-OCR-2作为最新一代的开源OCR模型,凭借其创新的…...
避坑指南:Dify 1.3.1 Docker-Compose部署时,除了镜像拉取慢,你还会遇到的3个典型错误
Dify 1.3.1 Docker-Compose部署实战:3个隐藏陷阱与深度排错指南 当你决定在生产环境部署Dify 1.3.1时,Docker-Compose看似简单的up -d命令背后可能暗藏玄机。本文将从真实故障场景出发,解剖那些官方文档未曾提及的"暗坑"——它们不…...
