哪个软件可以看街道实景/seo搜索优化技术
一、简介
1. 引言
在开发过程中,如何保证代码的质量以及程序的正确性成为了我们亟需解决的问题,其中测试用例成为了不必可少的一部分。测试用例不仅可以帮助我们验证代码的正确性,还能帮助我们捕获潜在的错误,提高代码的可靠性和可维护性。然而手动编写和执行测试用例可能会非常繁琐和耗时,因此我们引入了 Google Test 框架。
2. Google Test 框架
Google Test (gtest) 是一个由 Google 开发的流行的 C++ 单元测试框架。它为开发者提供了一套强大的工具和功能,用于编写、组织和运行测试用例。gtest 框架支持测试驱动开发(Test-Driven Development,TDD)和行为驱动开发(Behavior-Driven Development,BDD)方法。
具有以下主要功能和特点:
简单易用
gtest 框架提供了简洁而直观的语法和 API,使得编写测试用例变得简单易懂。通过使用宏和断言,开发者可以轻松地定义测试用例和验证预期结果;
丰富的断言
gtest 框架提供了一组丰富的断言宏,用于验证测试结果。这些断言宏包括比较值、检查条件、抛出异常等功能,可以满足各种测试需求;
灵活的测试组织
gtest 框架允许开发者将测试用例组织成测试套件(Test Suite),并可以嵌套多个测试套件。这样可以更好地组织和管理测试用例,提高测试代码的可读性和可维护性;
测试夹具支持
gtest 框架提供了测试夹具(Test Fixture 的概念,允许开发者在多个测试用例之间共享资源或设置环境。通过派生测试夹具类并重写 SetUp() 和 TearDown() 方法,开发者可以方便地进行资源的初始化和清理操作;
完善的编译及平台支持
gtest 框架支持 C++11 及以上的 C++ 标准,支持 Linux、MacOS、Windows 等众多平台,支持 gcc5.0+、clang5.0+、MSVC2015+ 编译器,支持 Bazel 以及 cmake 构建工具;
丰富的测试报告
gtest 框架生成详细的测试报告,显示每个测试用例的运行结果,包括通过的用例和失败的用例。如果断言失败,报告会提供失败的原因和位置,方便开发者快速定位问题。
二、Google Test 框架集成
1. 系统安装 gtest 测试框架
Ubuntu:
sudo apt install libgtest-dev
Centos:
https://pkgs.org/search/?q=gtest # 下载gtest-devel.rpm
rpm -ivh gtest-devel.rpm # 安装rpm包
2. CMake 项目集成
Cmakelists.txt 文件中添加以下代码:
enable_testing() # 开启测试,否则无法执行make test
add_executable(add_test_exe add_test.cpp) # 添加可执行程序
target_link_libraries(add_test_exe PRIVATE gtest pthread) # 链接gtest库
add_test(add_test_exe ${CMAKE_BINARY_DIR}/add_test_exe) # 添加测试,保证make test可以执行该测试用例
3. 简单 Demo
add_test.cpp:
#include <gtest/gtest.h>int add(int a, int b) {return a + b;
}TEST(TEST_ADD, UNSIGNED_INT_VALUE) { int result = add(100, 200); EXPECT_EQ(result, 300); result = add(200, 300); EXPECT_NE(result, 400);
}int main() {testing::InitGoogleTest();return RUN_ALLTESTS();
}
4. 编译运行
~/Projects/Test master +625 !5592 ?1 ) mkdir build && cd build && cmake .. && make -j4
-- The C compiler identification is GNU 9.4.0
-- The CXX compiler identification is GNU 9.4.0
-- Check for working C compiler:/usr/bin/cc
-- Check for working CXX compiler:/usr/bin/c++
-- Configuring done
-- Generating done
-- Build files have been written to:/home/limstor/Projects/Test/build
Scanning dependencies of target add_test_exe
[50%] Building CXX object CMakeFiles/add_test_exe.dir/aadd_test.cpp.o
[100%] Linking CXX executable add_test_exe
[100%] Built target add_test_exe
~/Projects/Test/build master +625 !5592 ?2)/add_test_exe
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from TEST_ADD
[ RUN ]TEST_ADD.UNSIGNED_INT_VALUE
[ OK ]TEST_ADD.UNSIGNED_INT_VALUE (O ms)
[----------] 1 test from TEST_ADD (0 ms total)[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0ms total)
[ PASSED ] 1 test.
三、Google Test - 测试宏
1. TEST 宏
说明:该宏定义用来测试其内部代码,其内部断言决定最终的测试结果。
使用方式:
TEST(TestSuiteName, TestName) {... statements ...
}
用途:针对多个用例之间不需要进行数据共用的测试场景。
示例:
int add(int a, int b) {return a + b;
}TEST(TEST_ADD, UNSIGNED_INT_VALUE) {int result = add(100, 200);EXPECT_EQ(result, 300);result = add(200, 300);EXPECT_NE(result, 400);
}TEST(TEST_ADD, NEGATIVE_INT_VALUE) {int result = add(-100, -200);EXPECT_EQ(result, -300);result = add(-200, -300);EXPECT_NE(result, -400);
}
2. TEST_F 宏
说明:该宏定义用来对 TestFixtureName 类进行多样测试。
使用方法:
TEST_F(TestFixtureName, TestName) {... statements ...
}
用途:针对多个用例之间需要进行数据共用的测试场景,用于多样测试,也有助于简化测试代码。
使用示例:
class Student {
public:Student(int id, std::string name): id_(id), name_(name) {};~Student() = default;void SetAge(int age) { age_ = age; }int GetAge() const { return this->age_; }void SetScore(int score) { score_ = score; }int GetScore() const { return this->score_; }
private:int id_;std::string name_;int age_;int score_;
};
class StudentTest : public testing::Test {
protected:void SetUp() override {student = new Student(1234, "Tom");}void TearDown() override {delete student;}Student* student;
};
TEST_F(StudentTest, SET_AGE_TEST) {student->SetAge(16);int age = student->GetAge();EXPECT_EQ(age, 16);
}
TEST_F(StudentTest, SET_SCORE_TEST) {student->SetScore(99);int score = student->GetScore();ASSERT_EQ(score, 99);
}
int main() {testing::InitGoogleTest();return RUN_ALL_TESTS();
}
3. TEST_P 宏
说明:该宏定义用来参数化测试。
使用方式:
TEST_P(TestFixtureName, TestName) {... statements ...
}
用途:当待测试方法的行为取决于传入的参数时,而且这些参数的不同组合有多种, 而你又不想为此写多个类似的 test case 时,可以用参数化测试。
示例:
struct TestData {int a;int b;int result;char type;
};
class CalculateTest : public ::testing::TestWithParam<TestData> {
protected:void checkData() {int a = GetParam().a;int b = GetParam().b;int result = GetParam().result;switch (GetParam().type) {case '+':EXPECT_EQ(a + b, result);break;case '-':EXPECT_EQ(a - b, result);break;case '*':EXPECT_EQ(a * b, result);break;case '/':EXPECT_EQ(a / b, result);break;default:break;}}
};
TEST_P(CalculateTest, Test) {checkData();
}
INSTANTIATE_TEST_SUITE_P(TestMyClassParams,CalculateTest,::testing::Values(TestData{100, 200, 300, '+'},TestData{20, 5, 15, '-'},TestData{5, 6, 30, '*'},TestData{8, 2, 3, '/'}));
int main() {testing::InitGoogleTest();return RUN_ALL_TESTS();
}
四、Google Test - 断言
断言:对测试代码中的检查点进行检查。分为以下两种断言类型:
- ASSERT_*断言:当检查点失败时,退出当前函数;
- EXPECT_*断言:当检查点失败时,继续往下执行。
-
布尔值检查
-
字符串类型检查
-
数值类型检查
-
返回成功或失败
-
返回成功或失败
-
谓词断言
-
浮点数检查
-
Windows 平台的 HRESULT 检查
-
类型检查
testing::StaticAssertTypeEq(); 类似模板中的编译检查
除以上 9 种断言使用方法外,还可以在断言后增加自定义信息输出
EXPECT_EQ(a, b) << "Vectors x and y differ at index ";
五、Google Test - 事件机制
gtest 提供了多种事件机制:
- 全局事件:所有用例执行前后;
- TestSuite 级别:同一 TestSuite 的第一个用例前,最后一个用例执行后;
- TestCase 级别:每个测试用例前后。
1. 全局事件
要实现全局事件,必须写一个类,继承 testing::Environment 类,实现里面的 SetUp 和 TearDown 方法:
SetUp() 方法在所有用例执行前执行;
TearDown() 方法在所有用例执行后执行。
示例:
class FooEnvironment : public testing::Environment {
public:virtual void SetUp() { std::cout << "Foo FooEnvironment SetUP" << std::endl; } virtual void TearDown() { std::cout << "Foo FooEnvironment TearDown" << std::endl; }
};
注意:在执行用例之前,需要在 main 函数中通过 testing::AddGlobalTestEnvironment 方法将事件挂载进来。
示例:
int main() { testing::AddGlobalTestEnvironment(new FooEnvironment); testing::InitGoogleTest(); return RUN_ALL_TESTS();}
2. TestSuite 事件
要实现 TestSuite 事件,必须写一个类,继承 testing::Test 类,实现 SetUpTestCase 和 TearDownTestCase 方法:
SetUpTestCase() 方法在 TestSuite 里的第一个 TestCase 之前执行;
TearDownTestCase() 方法在 TestSuite 里的最后一个 TestCase 之后执行。
示例:
class FooTest : public testing::Test {protected: static void SetUpTestCase() {shared_resource_ = new int(1234); } static void TearDownTestCase() { delete shared_resource_; shared_resource_ = NULL; } int* shared_resource_;
};
3. TestCase 事件
实现方法和 TestSuite 事件几乎一样,只不过它是实现的 SetUp 和 TearDown 方法:
(1) SetUp() 方法在每一个 TestCase 之前执行;
(2) TearDown() 方法每一个 TestCase 之后执行。
示例:
class FooCalcTest:public testing::Test {
protected:virtual void SetUp() {m_foo.Init(); } virtual void TearDown() { m_foo.Finalize(); } FooCalc m_foo;
};
六、Google Test - 命令行参数
在测试用例二进制文件后执行以下参数:
1. --gtest_list_tests
使用这个参数时,将不会执行里面的测试用例,而是输出测试用例的列表。
2. --gtest_filter
对执行的测试用例进行过滤,支持通配符。
? 单个字符
* 任意字符
- 排除,如,-a 表示除了 a
: 取或,如,a:b 表示 a 或 b
比如下面的例子:
./foo_test 没有指定过滤条件,运行所有用例
./foo_test --gtest_filter=* 使用通配符*,表示运行所有用例
./foo_test --gtest_filter=FooTest.* 运行所有 TestSuiteName 为 FooTest 的用例
./foo_test --gtest_filter=*Null*:*Constructor* 运行所有TestSuiteName或 TestName 包含 Null 或 Constructor 的用例。
./foo_test --gtest_filter=FooTest.*-FooTest.Bar 运行所有 TestSuiteName 为 FooTest 的用例,但是除了 FooTest.Bar 这个用例。
3. --gtest_also_run_disabled_tests
执行用例时,同时也执行被置为无效的测试用例(TestSuiteName 或 TestName 以 DISABLED 为前缀)。
4. --gtest_repeat=[COUNT]
设置用例重复运行次数,例如:
–gtest_repeat=1000 重复执行1000次,即使中途出现错误。
–gtest_repeat=-1 无限次数执行
–gtest_repeat=1000 --gtest_break_on_failure 重复执行1000次,并且在第一个错误发生时立即停止。这个功能对调试非常有用。
–gtest_repeat=1000 --gtest_filter=FooBar 重复执行1000次测试用例名称为FooBar的用例。
5. --gtest_color=(yes|no|auto)
输出命令行时是否使用一些五颜六色的颜色。默认是 auto。
6. --gtest_print_time
输出命令行时是否打印每个测试用例的执行时间。默认是不打印。
7. --gtest_output=xml[:DIRECTORY_PATH|:FILE_PATH]
将测试结果输出到一个 xml 中:
–gtest_output=xml: 不指定输出路径时,默认为用例当前路径;
–gtest_output=xml:~/dir 指定输出到某个目录;
–gtest_output=xml:~/dir/foo.xml 指定输出到~/dir/foo.xml。
如果不是指定了特定的文件路径,gtest 每次输出的报告不会覆盖,而会以数字后缀的方式创建。
8. --gtest_break_on_failure
调试模式下,当案例失败时停止,方便调试。
9. --gtest_throw_on_failure
当用例失败时以 C++ 异常的方式抛出。
10. --gtest_catch_exceptions
是否捕捉异常。gtest 默认是不捕捉异常的,因此假如你的测试用例抛了一个异常,很可能会弹出一个对话框,这非常的不友好,同时也阻碍了测试用例的运行。如果想不弹框,可以通过设置这个参数来实现。如将 --gtest_catch_exceptions 设置为一个非零的数。
注意:这个参数只在 Windows 平台下有效。
相关文章:

技术贴 | 一文掌握 Google Test 框架
一、简介 1. 引言 在开发过程中,如何保证代码的质量以及程序的正确性成为了我们亟需解决的问题,其中测试用例成为了不必可少的一部分。测试用例不仅可以帮助我们验证代码的正确性,还能帮助我们捕获潜在的错误,提高代码的可靠性和…...

基于深度学习的中文情感分类 - 卷积神经网络 情感分类 情感分析 情感识别 评论情感分类 计算机竞赛
文章目录 1 前言2 情感文本分类2.1 参考论文2.2 输入层2.3 第一层卷积层:2.4 池化层:2.5 全连接softmax层:2.6 训练方案 3 实现3.1 sentence部分3.2 filters部分3.3 featuremaps部分3.4 1max部分3.5 concat1max部分3.6 关键代码 4 实现效果4.…...

非线性时滞系统的无模型预测控制
摘 要 非线性时滞系统的预测控制应用广泛,比如电子设备、石油化工、造纸等行业,都会运用到非线性时滞系统的预测控制系统或工具。更高效率和更高精度的非线性时滞系统的预测控制一直是研究的热点。在我们日常生活中,非线性时滞系统的预测控制…...

局域网内两台电脑共享文件夹(通过网线直连共享数据)
文章目录 2.设置共享文件夹3.访问共享文件夹 1.将两台电脑置于同一局域网下 用网线将两台电脑连接关闭两台电脑防火墙将两台电脑IP地址设置在同一局域网下 测试是否在同一局域网下,使用ping命令 ping 192.168.0.122.设置共享文件夹 选择想要共享的文件夹ÿ…...

什么是 CNN? 卷积神经网络? 怎么用 CNN 进行分类?(3)
参考视频:https://www.youtube.com/watch?vE5Z7FQp7AQQ&listPLuhqtP7jdD8CD6rOWy20INGM44kULvrHu 视频7:CNN 的全局架构 卷积层除了做卷积操作外,还要加上 bias ,再经过非线性的函数,这么做的原因是 “scaled p…...

一致性hash负载均衡
Hash算法的问题 今天看下一致性hash,常见的负载均衡可能使用过hash,比如nginx中,如果使用session最简单就是通过hash,比如根据用户的请求ip进行hash,让不同用户的请求打到同一台服务器,这样状态处理起来最…...

MAC下安装Python
MAC基本信息: 执行命令: brew install cmake protobuf rust python3.10 git wget 遇到以下问题: > Downloading https://mirrors.aliyun.com/homebrew/homebrew-bottles/rust-1.59.0 Already downloaded: /Users/xxxx/Library/Caches/Ho…...

Android NDK开发详解之JNI中的库文件
Android NDK开发详解之JNI中的库文件 简介工作原理流程原生 activity 和应用 简介 本部分简要介绍了 NDK 的工作原理。Android NDK 是一组使您能将 C 或 C(“原生代码”)嵌入到 Android 应用中的工具。能够在 Android 应用中使用原生代码对于想执行以下…...

KNN模型
使用K-Nearest Neighbors (KNN)算法进行分类。首先加载一个数据集,然后进行预处理,选择最佳的K值,并训练一个KNN模型。 # encodingutf-8 import numpy as np datas np.loadtxt(datingTestSet2.txt) # 加载数据集,返回一个numpy数…...

Python 学习1 基础
文章目录 基础字符串字面量常用的值类型注释变量print语句数据类型数据类型转换标识符运算符 字符串拓展小结 2023.10.28 周六 最近打算学一下Python,毕竟确实简单方便,而且那个编程语言排名还是在第一。不过不打算靠它吃饭,深不深入暂且不说…...

网络协议--TCP的超时与重传
21.1 引言 TCP提供可靠的运输层。它使用的方法之一就是确认从另一端收到的数据。但数据和确认都有可能会丢失。TCP通过在发送时设置一个定时器来解决这种问题。如果当定时器溢出时还没有收到确认,它就重传该数据。对任何实现而言,关键之处就在于超时和重…...

Thread
Thread 线程启动线程第一种创建线程线程的第二种创建方式使用匿名内部类完成线程的两种创建 Thread API线程的优先级线程提供的静态方法守护线程用户线程和守护线程的区别体现在进程结束时 多线并发安全问题同步块 线程 启动线程 启动线程:调用线程的start方法,而不是直接调用…...

FOC系列(二)----继续学习DRV8301芯片
一、 程序框图 跟随上篇博客咱们继续往下看,下面是芯片内部的程序框图: 1.1 BUCK电路 1.2 内部各电源 1.3 SPI通信、栅极驱动器和时序控制器 1.4 MOSFET驱动电路 1.5 电流采样放大电路 数据手册只是给出了这一部分框图,但是没有更加详细的介…...

A. Directional Increase -前缀和与差分理解 + 思维
题面 分析 观察指针移动的性质,可以发现每一段都是从起点走到终点,在原路返回,这样每一段也就表示,在起点处加一,在终点处减一,形成了很明显的差分结构,思考能否构造出a数组的关键就是他的前缀…...

openpnp - java调试环境 - 最好只保留一套jdk环境
文章目录 openpnp - java调试环境 - 最好只保留一套jdk环境概述END openpnp - java调试环境 - 最好只保留一套jdk环境 概述 没注意做了啥操作, 前天好好的, 昨天下午开始, 编译好的openpnp程序就无法正常打开了. 故障表现: 程序运行后, 最多只能看到欢迎对话框(显示版本和发…...

AI技术的钓鱼邮件有多强
如今,人工智能技术的迅猛发展给各个领域都带来了前所未有的变革和进步。2023年上半年ChatGPT的火爆出圈,让人们看到了AI惊艳表现的光彩一面,但同时黑暗的一面也正在暗自发力,野蛮生长。 AI技术不仅可用于维护网络安全,…...

vue/react项目刷新页面出现404报错的原因及解决办法
Vue项目打包部署到线上后,刷新页面会提示404,下面这篇文章主要给大家介绍了关于vue/react项目刷新页面出现404报错的原因及解决办法,文中将解决的办法介绍的很详细,需要的朋友可以参考下 背景解决办法 法1:将vue/react路由模式由history路由改为has…...

黑客技术(网络安全)——如何高效学习
前言 前几天发布了一篇 网络安全(黑客)自学 没想到收到了许多人的私信想要学习网安黑客技术!却不知道从哪里开始学起!怎么学 今天给大家分享一下,很多人上来就说想学习黑客,但是连方向都没搞清楚就开始学习…...

53.MongoDB分片集群高级集群架构详解
MongoDB分片集群架构详解 为什么要使用分片 分片(shard)是指在将数据进行水平切分之后,将其存储到多个不同的服务器节点上的一种扩展方式。 一个复制集能承载的容量和负载是有限的,遇到以下场景就需要考虑使用分片 存储容量需…...

Servlet 上下文参数
7)Servlet上下文对象:ServletContext生活中的例子:张三和李四在不远处窃窃私语,并且频繁的对着你坏笑。你肯定会跑过去问:你们俩在聊什么?注意:此处的聊什么,其实就是你在咨询他们聊天的上下文&…...

ChatGPT正在测试原生文件分析功能,DALL·E 3能P图啦!
10月29日,有部分用户在社交平台上分享,ChatGPT Plus正在测试原生文件上传、分析功能,可以通过文本问答的方式,对上传的PDF等数据文件进行提问、搜索。 例如,上传一份50页的员工手册PDF文件,然后向ChatGPT提…...

三相马达的电机故障维护
目录 电机故障维护编辑 更换电机操作 三相电路 热继电器 今天继续小编的工作经验的分享,今天就说说遇到的问题吧,今天组立熔接机出现故障,后面部分出现了“咕噜噜”的杂声,走到后面一听是电机发出的声音。没有办法了就开始拆…...

【易售小程序项目】后端部署、Uniapp项目Web部署
文章目录 Uniapp项目Web打包部署为什么不部署小程序Web打包前对项目进行调整网站、小程序切换增加constant.js来控制常量将js绑定到main.js的全局变量中 WebSocket差异监听键盘呼出导航条打包部署 后端项目打包部署打包前准备打包部署 Uniapp项目Web打包部署 为什么不部署小程…...

prometheus监控kafka
一、前言 关于对kafka的监控,要求高的话可以使用kafka-exorter和jmx-exporter一起收集监控数据,要求不高的情况下可以使用kafka-exporter收集监控数据即可 二、部署 kafka-exporter 部署kafka-exporter,我是在k8s集群中部署的 编辑yaml文件…...

【STL】:list用法详解
朋友们、伙计们,我们又见面了,本期来给大家解读一下有关list的使用,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数据结构…...

SQL Wildcards 通配符
SQL Wildcards 通配符 通配符用于替换字符串中的任何其他字符。 通配符与 SQL LIKE 运算符一起使用。在 WHERE 子句中使用LIKE运算符来搜索列中的指定模式。 有两个通配符与 LIKE 运算符一起使用: % - 百分号表示零个,一个或多个字符_ - 下…...

入门必学 | R语言for循环的常规应用
文章目录 何为判断语句在for循环中添加判断语句嵌套循环 在上一节中,我们介绍了迭代与for循环,并对for循环的结构与原理进行了深入的介绍。在这一节中,我们将分享for循环的常规应用,包括在其中加入判断语句与嵌套循环。 何为判断语…...

metaRTC集成flutter ui demo编译指南
概要 Flutter是由Google开发的开源UI工具包,用于构建跨平台应用程序,支持linux/windows/mac/android/ios等操作系统。 metaRTC新增flutter demo,支持linux/windows/mac/android/ios操作系统,此demo在ubuntu桌面环境下测试成功。…...

int怎么转成QString?
2023年10月31日,周二晚上 要将 int 类型转换为 QString,可以使用 QString::number() 方法。 下面是一个示例代码: int number 123; QString str QString::number(number);还可以在转换时指定进制,比如将整数转换为十六进制的字…...

JavaScript进阶(二十九): 走近 es6 之 new.target
文章目录 一、前言二、new.target 重写三、拓展阅读 一、前言 源码阅读过程中,发现以下语句 new.target.prototype鉴于该语法为es6所有,项目在编译过程中,控制台报Unexpected token: punc(.)错误。按照常规处理,应用babel-loade…...