c->c++(四):gtest

        本文主要探讨gtest相关内容。

gtest安装

wget -O gtest.zip https://github.com/google/googletest/archive/refs/heads/main.zipunzip gtest.zipcd googletest-mainmkdir bulid && cd  buildcmake .. && make && make install

gtest API

        TEST/TEST_F

TEST(test_case_name,test_name)
宏创建测试
TEST_F(test_case_name,test_name)
不同TestCase用同一测试数据(test_name不同)
test_case_name测试用例名,通常为测试函数名或测试类名
test_name测试名

        断言宏

ASSERT_*:检测失败退出,EXPECT_*:检测失败继续执行
ASSERT_TRUE(arg),期待结果是true
ASSERT_FALSE(arg),期待结果是false
ASSERT_EQ(arg1,arg2),比较是否==
ASSERT_NE(arg1,arg2),比较是否!=
ASSERT_LT(arg1,arg2),比较是否<
ASSERT_GT(arg1,arg2),比较是否>
ASSERT_LE(arg1,arg2),比较是否<=
ASSERT_GE(arg1,arg2),比较是否>=
ASSERT_STREQ(s1,s2),比较C字符串相等
ASSERT_STRNE(s1,s2),比较C字符串不相等
ASSERT_STRCASEEQ(s1,s2)比较C字符串相等(忽略大小写)
ASSERT_STRCASENE(s1,s2)比较C字符串不相等(忽略大小写)

        事件机制

TestSuite事件(局部事件) 
写类继承testing::Test,实现静态方法SetUpTestCase(在第一个TestCase前执行),TearDownTestCase(在最后一个TestCase前执行)
TestCase事件(个体事件)
每个案例前后执行,需实现SetUp(单个TestCase之前执行)和TearDown方法(单个TestCase之后执行)
全局事件 
写类继承testing::Environment类,需实现SetUp(TestCase之前执行)和TearDown方法(TestCase之后执行),定义全局环境对象添加到全局环境测试中

        程序退出/崩溃

ASSERT_DEATH(func,des)
程序退出0(程序正常)则补满足结果打印错误描述信息
ASSERT_EXIT(func,return_func,desc)
测函数、退出码/退出信号、错误信息regex,待测函数退出值错误码/错误信号不同退出打印错误描述信息

demo1:

        断言

目录:

run.sh

cmake .make ./pro

clean.sh

rm -rf CMakeFiles  CTestTestfile.cmake Makefile CMakeCache.txt cmake_install.cmake pro

clean_src.sh

rm -rf *.cc *.c *.h *.hpp *.cpp 

CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 2.20)                            #最低版本要求PROJECT(GooleTest)                                              #设置工程名SET(CMAKE_CXX_COMPILER "g++-11")                                #设置g++编译器ENABLE_TESTING()                                                #开启测试ADD_EXECUTABLE(pro Assert.cpp AssertUnitTest.cpp)               #生成可执行文件TARGET_LINK_LIBRARIES(pro gtest_main gtest)                     #添加链接文件add_test(test tset)                                             #添加测试(测试名,测试命令)

Assert.hpp

#ifndef __ASSERT_HPP__
#define __ASSERT_HPP__int AddNum(const int a,const int b);int ReduceNum(const int a,const int b);int MulNum(const int a,const int b);int DivNum(const int a,const int b);#endif  //__ASSERT_HPP__

Assert.cpp

#include <iostream>
#include "Assert.hpp"int AddNum(const int a,const int b)
{return (a + b);
}int ReduceNum(const int a,const int b)
{return abs(a - b);
}int MulNum(const int a,const int b)
{return (a * b);
}int DivNum(const int a,const int b)
{return (a / b);
}

AssertUnitTest.cpp

#include <iostream>#include "gtest/gtest.h"
#include "Assert.hpp"using namespace std;namespace 
{TEST(AssertTest,MathTest){ASSERT_TRUE(AddNum(1, 1));ASSERT_FALSE(ReduceNum(1, 1));ASSERT_EQ(1,MulNum(1,1));ASSERT_NE(2,MulNum(1,1));ASSERT_LT(1,AddNum(1,1));ASSERT_GT(3,AddNum(1,1));ASSERT_LE(1,AddNum(1,1));ASSERT_GE(2,AddNum(1,1));ASSERT_STREQ("hello","hello");ASSERT_STRNE("hello","word");ASSERT_STRCASEEQ("hellO","Hello");ASSERT_STRCASENE("hello","word");}}       // namespace

结果示例:

demo2:

        事件

run.sh

cmake .make ./pro

clean.sh

rm -rf CMakeFiles  CTestTestfile.cmake Makefile CMakeCache.txt cmake_install.cmake pro

clean_src.sh

rm -rf *.cc *.c *.h *.hpp *.cpp

CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 2.20)                            #最低版本要求PROJECT(GooleTest)                                              #设置工程名SET(CMAKE_CXX_COMPILER "g++-11")                                #设置g++编译器ADD_EXECUTABLE(pro Event.cpp)                                   #生成可执行文件TARGET_LINK_LIBRARIES(pro pthread gtest)                        #添加链接文件

Event.cpp

#include <iostream>#include "gtest/gtest.h"using namespace std;
using namespace testing;class Ev1:public Environment
{public:void SetUp(){cout << "global event1 start" << endl;}void TearDown(){cout << "global event1 end" << endl;}
};class Ev2:public Environment
{public:void SetUp(){cout << "global event2 start" << endl;}void TearDown(){cout << "global event2 end" << endl;}
};class Ev3:public Test
{protected:static void SetUpTestSuite(){cout << "local event3 start" << endl;}static void TearDownTestSuite(){cout << "loacal event3 end" << endl;}
};class Ev4:public Test
{protected:static void SetUpTestSuite(){cout << "local event4 start" << endl;}static void TearDownTestSuite(){cout << "loacal event4 end" << endl;}
};class Ev5:public Test
{protected:virtual void SetUp(){cout << "individual event5 start" << endl;}virtual void TearDown(){cout << "individual event5 end" << endl;}
};class Ev6:public Test
{protected:virtual void SetUp(){cout << "individual event6 start" << endl;}virtual void TearDown(){cout << "individual event6 end" << endl;}
};TEST_F(Ev3,EnvT0)
{ASSERT_EQ(1,1);
}TEST_F(Ev3,EnvT1)
{ASSERT_EQ(1,1);
}TEST_F(Ev4,EnvT0)
{ASSERT_EQ(1,1);
}TEST_F(Ev4,EnvT1)
{ASSERT_EQ(1,1);
}TEST_F(Ev5,EnvT0)
{ASSERT_EQ(1,1);
}TEST_F(Ev5,EnvT1)
{ASSERT_EQ(1,1);
}TEST_F(Ev6,EnvT0)
{ASSERT_EQ(1,1);
}TEST_F(Ev6,EnvT1)
{ASSERT_EQ(1,1);
}int main()
{AddGlobalTestEnvironment(new Ev1());AddGlobalTestEnvironment(new Ev2());InitGoogleTest();return RUN_ALL_TESTS();
}

结果示例:

demo3:

        程序退出/崩溃

目录:

run.sh

cmake .make ./pro

clean.sh

rm -rf CMakeFiles  CTestTestfile.cmake Makefile CMakeCache.txt cmake_install.cmake pro

clean_src.sh

rm -rf *.cc *.c *.h *.hpp *.cpp 

CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 2.20)                            #最低版本要求PROJECT(GooleTest)                                              #设置工程名SET(CMAKE_CXX_COMPILER "g++-11")                                #设置g++编译器ADD_EXECUTABLE(pro Exit.cpp)                                    #生成可执行文件TARGET_LINK_LIBRARIES(pro pthread gtest)                        #添加链接文件

Exit.cpp

#include <iostream>
#include <unistd.h>
#include "gtest/gtest.h"using namespace std;
using namespace testing;void DeathTest1()
{cerr << "DeathTest1 ,exit(1)" << endl;exit(1);
}void DeathTest2()
{cerr << "DeathTest2 ,exit(0)" << endl;exit(0);
}void ExitTest1()
{cerr << "ExitTest1 ,exit(1)" << endl;exit(1);
}void ExitTest2()
{cerr << "ExitTest2 ,exit(0)" << endl;exit(0);
}TEST(ExitTest,ExitT)
{ASSERT_EXIT(ExitTest1(),ExitedWithCode(1),".*");ASSERT_EXIT(ExitTest2(),ExitedWithCode(0),".*");
}TEST(DeathTest,DeathT)
{ASSERT_DEATH(DeathTest1(),".*");//ASSERT_DEATH(DeathTest2(),".*");
}int main()
{InitGoogleTest();return RUN_ALL_TESTS();
}

结果示例:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis02——缓存(缓存更新策略、缓存穿透、缓存雪崩、缓存击穿、缓存工具封装)

目录 缓存概念 添加Redis缓存 业务场景 缓存作用模型 java代码 缓存更新策略 主动更新的三种策略 主动更新——Cache Aside Pattern 实际应用 缓存穿透 概念 解决方法 实际应用 缓存雪崩 概念 解决方法 缓存击穿 互斥锁 介绍 实际应用 逻辑过期 介绍 实际…

基于Yolov8面部七种表情检测与识别C++模型部署

表情识别 七种表情识别是一个多学科交叉的研究领域&#xff0c;它结合了心理学、认知科学、计算机视觉和机器学习等学科的知识和技术。 基本概念 表情的定义&#xff1a;表情是人们在情绪体验时面部肌肉活动的结果&#xff0c;是人类情感交流的基本方式之一。基本表情理论&a…

使用Step Functions运行AWS Backup时必备的权限要点

引言 在尝试从Step Functions执行AWS Backup的按需备份时&#xff0c;我在权限方面遇到了一些困难。为了备忘&#xff0c;我将这些经验写成这篇文章。 概述 从Step Functions执行AWS Backup时&#xff0c;需要分配以下权限&#xff1a; AWS Backup相关权限 执行备份的权限…

Java: 线程安全问题的解决方案(synchronized)

发生原因 要想解决线程安全问题,那么我们首先得知道线程安全问题为什么会发生. 发生原因: 线程在操作系统中是"随机调度,抢占式执行的"[根本原因].多个线程,同时修改同一个变量修改操作不是"原子"的内存可见性问题指令重排序 解决方案 原因1和2,我们很…

04:【stm32】LED编程和按键控制

LED编程和按键控制 1、LED编程1.1、点亮一课LED灯 2、按键控制2.1、通过一个按钮控制LED灯的亮灭 1、LED编程 1.1、点亮一课LED灯 首先&#xff0c;我们想象一下&#xff0c;让LED灯点亮&#xff0c;引脚应该是输出模式&#xff0c;那么应该是通用模式&#xff0c;还是复用模式…

打靶记录7——Hacker_Kid-v1.0.1

靶机下载地址 https://download.vulnhub.com/hackerkid/Hacker_Kid-v1.0.1.ova难度 OSCP 风格的中级难度靶机&#xff08;只需要获取root权限即可&#xff0c;CTF 风格的靶机就还需要获取flag&#xff09; 涉及的攻击方法&#xff1a; 主机发现端口扫描Web信息收集DNS区域传…

Redis2-Redis常见命令

目录 Redis数据结构介绍 Redis通用命令 KEYS DEL EXISTS EXPIRE String类型 Key的层级格式 Hash类型 List类型 Set类型 SortedSet类型 Redis数据结构介绍 Redis是一个key-value的数据库&#xff0c;key一般是String数据库&#xff0c;value的类型多种多样 可以通过…

《Unity3D网络游戏实战》学习与实践--制作一款大乱斗游戏

角色类 基类Base Human是基础的角色类&#xff0c;它处理“操控角色”和“同步角色”的一些共有功能&#xff1b;CtrlHuman类代表“操控角色”​&#xff0c;它在BaseHuman类的基础上处理鼠标操控功能&#xff1b;SyncHuman类是“同步角色”类&#xff0c;它也继承自BaseHuman&…

解决电脑缺少.NET组件?手把手教你轻松解决

在日常使用电脑的过程中&#xff0c;很多用户可能会遇到“电脑缺少.NET组件”的提示&#xff0c;这可能导致某些应用程序无法正常运行或安装。那么&#xff0c;.NET组件到底是什么&#xff1f;为何它如此重要&#xff1f;本文将为您详细解答这些问题&#xff0c;并提供有效的解…

[ACM MM 2024] Wave-Mamba:超高清暗光图像增强的小波状态空间模型

Wave-Mamba: Wavelet State Space Model for Ultra-High-Definition Low-Light Image Enhancement (arxiv.org) Wave-Mamba是一种用于增强超高清低光照图像的新模型&#xff0c;它引入了低频状态空间块和高频增强块&#xff0c;并取得了领先水平的性能。该模型即将开源&#x…

用Python插入表格到PowerPoint演示文稿

有效的信息传达是演示文稿中的重点&#xff0c;而PowerPoint演示文稿作为最广泛使用的演示工具之一&#xff0c;提供了丰富的功能来帮助演讲者实现这一目标。其中&#xff0c;在演示文稿中插入表格可以帮助观众更直观地理解数据和比较信息。通过使用Python这样的强大编程语言&a…

【STL】 vector的底层实现

1.vector的模拟代码完整实现&#xff08;后面会拆分开一个一个细讲&#xff09; #pragma once #include<assert.h>// 抓重点namespace bit {/*template<class T>class vector{public:typedef T* iterator;private:T* _a;size_t _size;size_t _capacity;};*/templa…

Python(模块)

模块编写完成就可以被其他模块进行调用并使用被调用模块的功能。 import导入方式的语法结构&#xff1a; import模块名称【as别名】 from……import导入方式的语法结构&#xff1a; from模块名称&#xff0c;import变量/函数/类/*&#xff08;*是通配符&#xff09; impor…

Milvus 向量数据库进阶系列丨构建 RAG 多租户/多用户系统 (上)

本系列文章介绍 在和社区小伙伴们交流的过程中&#xff0c;我们发现大家最关心的问题从来不是某个具体的功能如何使用&#xff0c;而是面对一个具体的实战场景时&#xff0c;如何选择合适的向量数据库解决方案或最优的功能组合。在 “Milvus 向量数据库进阶” 这个系列文章中&…

【生成式AI-二-强大的AI下我们可以做什么】

强大的AI下我们可以做什么 人工智能的厉害之处我们可以作什么评估模型好坏的难度prompt engineering微调fine tune 人工智能的厉害之处 人工智能并不是忽然就爆火的&#xff0c;事实上&#xff0c;很久以前就已经有深度学习、机器学习这些概念了&#xff0c;那现在的人工智能和…

Java之类和对象

目录 static关键字 1修饰属性 2修饰方法 final 构造方法 基本语法 this关键字 代码块 定义 普通代码块 构造代码块 静态代码块 匿名对象 toString 总结 static关键字 1修饰属性 Java的静态属性和类相关, 和具体的实例无关. 换句话说, 同一个类的不同实例共用同一个…

反转链表 II(LeetCode)

题目 给你单链表的头指针 和两个整数 和 &#xff0c;其中 。请你反转从位置 到位置 的链表节点&#xff0c;返回 反转后的链表 。 解题 class ListNode:def __init__(self, value0, nextNone):self.value valueself.next nextdef reverseBetween(head: ListNode, lef…

crm客户管理系统有哪些?盘点大家使用最广泛的15款

将对比的客户管理CRM系统包括&#xff1a;纷享销客、Zoho CRM、销售易、用友CRM、Salesforce、Microsoft Dynamics 365、销帮帮CRM、HubSpot、Oracle CRM、悟空CRM、神州云动CRM、红圈CRM、SAP CRM、Odoo、OroCRM。 一个合适的CRM系统可以极大地提高你的销售效率和客户满意度&a…

SpringMVC执行流程

1 流程对比 1.1 原生servlet开发流程 根据需求编写servlet程序在web.xml 中通过配置&#xff0c;指定servlet所能处理的请求&#xff0c;即建立servlet与请求路径间的映射在Servlet的service方法中对路径进行再判断&#xff0c;从而进行具体的逻辑处理servlet参数从request中…

数据结构-递归

用递归代替循环 假设工作中的你&#xff0c;需要写一个倒数程序。该程序接收一个数字&#xff0c;例如10&#xff0c;然后显示从10到0的数字。现在先暂停一下&#xff0c;选择一门编程语言来实现这个程序&#xff0c;做完以后&#xff0c;再往下阅读。或许你用了JavaScript&am…