【Kuiperinfer】笔记02 GoogleTest入门

文章目录

  • Google Test
    • 基本概念
  • 编写测试
    • 头文件
    • Assertion
    • TEST
    • Test Fixture
    • Invoking the Tests
    • 编写main()函数
  • 参考

Google Test

Google Test是用于编写C++测试的框架,支持多种类型的测试,而不是只有单元测试(unit test)。

编写测试的要求:

  • 测试应该是独立且结果可重复的
  • 测试应该是有组织的(organized),并且能够反映被测试代码的结构
  • 测试应该是轻量(portable)且可重用的
  • 如果测试未通过,应尽可能返回更多信息
  • 测试框架应该能够帮助测试者更多关注被测试的代码,而不是过多关注如何编写测试
  • 测试应该能够快速运行

Test定义:使用特定的输入,运行特定的程序,并验证运行的结果。

基本概念

使用GoogleTest的第一步是编写assertionassertion用来验证某个条件是否为真,其结果可以是success,nonfatal failure或者是fatal failure。

如果测试报了fatal failure,则会中断。

Test使用assertion来检验代码是否如期运行,如果测试出现问题,则测试失败。

Test suite(测试组)包含一个或多个测试,组织test suite应档能够反映被测试代码的结构。如果测试组中有测试需要共享对象或者写成,应当放进test fixture类中。

一个测试程序(test program)可包含多个测试组。

整体来说是个层级结构,从assertion开始写,组成test,test组成suite,suite组成测试程序。

编写测试

头文件

需要声明以下头文件

#include <gtest/gtest.h>
#include <glog/logging.h>

Assertion

Assertion是一种宏。包括下面两种:

  • ASSERT_*:如果fail,则产生fatal failures,并中断当前函数。

  • EXPECT_*:如果fail,产生nonfatal failures,不中断。

EXPECT_*能够在一个test中报多个failure,通常来说更适合;当然,如果某个错误发生后,程序没必要再继续运行下去,则用ASSERT_*更好。

可以通过<<assertion后面添加额外的信息。

例子:

ASSERT_EQ(x.size(), y.size()) << "Vectors x and y are of unequal length";
for(int i = 0; i < x.size(); ++i){EXPECT_EQ(x[i], y[i]) << "Vectors x and y differ at index " << i;
}

所有可被流式输出的内容都可以被放在assertion信息里。

除了EQ之外,还有很多种类型的assertion,可参考https://google.github.io/googletest/reference/assertions.html。

可能比较常用的:THAT,TRUE,FALSE,EQ,NE,LT,LE,GT,GE

在test1.cpp和axby.cpp中,用到了EQ和LE。

TEST

创建test的方法:

  1. 使用TEST()宏来定义和命名test函数;该函数是通常的C++函数,且不返回值
  2. 在函数中写assertion
  3. test的结果取决于assertion,如果一个test内任意assertion报fail,则test报fail

TEST()的参数按general到specific排列,第一个参数是suite名,第二个参数是test名,名称中不能有下划线_

例子:

int f(int n); // 函数声明
TEST(fTest, ZeroInput){EXPECT_EQ(f(0), 1);
} // TEST 1
TEST(fTest, PositiveInput){EXPECT_EQ(f(1), 1);EXPECT_EQ(f(8), 512);
} // TEST 2

上例中,fTest是suite名,ZeroInput和PositiveInput为Test名。

逻辑上相关的test应当放在同一个suite中,即TEST()的第一个参数应该相同。

Test Fixture

如果两个或更多的test会使用同一个数据,则可以用test fixture来重用对象。

  1. testing::Test派生一个类,该类以protected:起始
  2. 在这个派生类中,声明要使用的对象
  3. 编写默认的constructor或者SetUp()函数来配置每个test中的对象。
  4. 编写destructor或者TearDown()来释放在SetUp()中alloc的内存。
  5. 定义test中要用的subroutine。

TEST_F()来代替TEST(),并将派生类的类名称作为第一个传参名称。派生类要在TEST_F()之前定义。

例子。以一个队列类Queue的测试为例,首先给出该类的接口:

template <typename E>
class Queue{public:Queue();void Enqueue(const E& element);E* Dequeue();size_t size() const;...
};

定义fixture class,习惯上命名为*Test*为要测试的类名称

class QueueTest : public testing::Test{protected:void SetUp() override{// q0_ remains emptyq1_.Enqueue(1);q2_.Enqueue(2);q2_.Enqueue(3);}Queue<int> q0_;Queue<int> q1_;Queue<int> q2_;
};

编写test

TEST_F(QueueTest, IsEmptyInitially){EXPECT_EQ(q0_.size(), 0);
}
TEST_F(QueueTest, DqueueWorks){int * n = q0_.Dequeue();EXPECT_EQ(n, nullptr);n = q1_.Dequeue();ASSERT_NE(n, nullptr);EXPECT_EQ(*n, 1);EXPECT_EQ(q1_.size(), 0);delete ;n = q2_.Dequeue();ASSERT_NE(n, nullptr);EXPECT_EQ(*n, 2);EXPECT_EQ(q1_.size(), 1);delete ;
}

Invoking the Tests

在定义好test后,可以通过调用RUN_ALL_TESTS()来运行所有的test,如果所有的test都通过,则返回0,否则返回1。

该函数会测试所有可以关联的test,包括不同test suite甚至不同文件中的test

编写main()函数

通常情况可以不用写main(),用gtest_main()就行。

如果需要在test之前做一些其他框架内没法处理的操作,则可以自己写个main(),并将返回值设为RUN_ALL_TESTS().

例子:

int main(int argc, char **argv){testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}

testing::InitGoogleTest()用于传递控制台参数,使得用户可以控制测试程序的行为,这部分可参考:https://google.github.io/googletest/advanced.html。

参考

  • 用户手册:https://google.github.io/googletest/
  • 入门:https://google.github.io/googletest/primer.html
  • GitHub:https://github.com/google/googletest/tree/main

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

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

相关文章

weblogic8版本修改控制台密码

weblogic的8.1老版本在控制台界面上没有修改密码的按钮选项&#xff0c;因此需要通过修改服务器配置文件来更新密码。 步骤1&#xff1a; 备份域目录下的DefaultAuthenticatorInit.ldift文件 通过find /域目录 -name weblogic.jar 查到jar包&#xff0c;通过命令生成文件 …

css3的var()函数

css3的var()函数 变量要以两个连字符--(横杆)(减号)为开头 变量可以在:root{}中定义, :root可以在css中创建全局样式变量。通过 :root本身写的样式&#xff0c;相当于 html&#xff0c;但优先级比后者高。 在CSS3中&#xff0c;var()函数是一个用于插入CSS自定义属性&#xff…

Vulhub 靶场训练 DC-6解析

一、搭建环境 kali充当攻击机 ip地址是&#xff1a;192.168.200.14 DC-6充当靶机 &#xff1a; IP地址暂时未知 注意&#xff1a;让两台机器的使用同一种网络适配器 二、信息收集 1、探索同网段存活的主机 ①第一种方法 arp-scan -l②第二种方法 netdiscover -i eth0 -…

Python内置函数67个语法、参数和用法详解

要获取Python解释器中所有当前可用的内置函数和变量的完整列表,您可以在Python解释器中使用dir(__builtins__)命令。这将返回一个包含所有内置函数、异常和其他内置对象的列表。 分为10类 数学运算(7): abs 绝对值divmod 商和余数max 最大min最小pow 指数幂round 取整sum 求…

npm/nodejs安装、切换源

前言 发现自己电脑上没有npm也没有node很震惊&#xff0c;难道我没写过代码么&#xff1f;不扯了&#xff0c;进入正题哈哈…… 安装 一般没有npm的话会报错&#xff1a; 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称而且报这个错&#xff0c;我们执行…

【骑行新纪元】社交风暴来袭,你准备加入骑友圈了吗?

当你的自行车轮轻轻滑过清晨的露水&#xff0c;你是否曾想与志同道合的骑友分享这一刻的喜悦&#xff1f;骑行&#xff0c;这个曾经只是简单运动的代名词&#xff0c;如今正在悄然转变。随着科技的进步和社交平台的发展&#xff0c;骑行不再只是一种健身方式&#xff0c;它还带…

【机器学习】是什么?——讲解

机器学习 机器学习是人工智能&#xff08;AI&#xff09;的一个子领域&#xff0c;它提供了系统通过数据学习并改进其性能的能力&#xff0c;而不需要人为进行显式编程&#xff0c;机器学习模型利用大量的数据样本&#xff08;训练数据&#xff09;来学习如何识别模式和关系&a…

C-指针-010

1指针 1.1语法&#xff1a; 【基类型*指针变量名】 【int *p&a】1.2语义&#xff1a; 【基类型】&#xff1a;指针变量指向的目标的数据类型 【*】&#xff1a;表示此时定义的变量是一个指针类型的变量 【&a】&#xff1a;一块存放着int类型数据的空间的地址 【*p】…

slot全局属性 <slot>标签</slot> ::slotted()伪元素 笔记240223

slot全局属性 标签 ::slotted()伪元素 MDN HTML全局属性 MDN HTML全局属性 slot MDN HTML <slot>标签元素 MDN CSS ::slotted()为元素 MDN 使用 templates and slots <slot>标签 <slot>标签是的 display 是 contents 在Web开发中&#xff0c;<s…

【高德地图】Android搭建3D高德地图详细教

&#x1f4d6;Android搭建3D高德地图详细教程 &#x1f4d6;第1章 高德地图介绍✅了解高德地图✅2D地图与3D地图 &#x1f4d6;第2章 搭建3D地图并显示✅第 1 步&#xff1a;创建 Android 项目✅第 2 步&#xff1a;获取高德Key✅第 3 步&#xff1a;下载地图SDK✅第 4 步&…

照片上多余的人怎么处理?这几种方法让你的照片更完美!

照片怎么去掉多余人像&#xff1f;这是许多摄影爱好者经常遇到的问题。有时候&#xff0c;我们拍摄了一张非常美好的照片&#xff0c;但由于某些原因&#xff0c;照片中出现了不希望出现的人物。这时候&#xff0c;我们该如何处理呢&#xff1f;下面&#xff0c;我将分享几种常…

2.5网安学习第二阶段第五周回顾(个人学习记录使用)

本周重点 ①多进程和多线程 1、进程和线程 2、多线程爆破 ②Redis数据库 1、Redis的使用 2、Redis持久化 3、Redis未授权免密登录 ③嗅探和Python攻击脚本 1、嗅探&#xff08;端口扫描和IP扫描&#xff09; 2、SCAPY的应用 3、Python攻击脚本&#xff08;SYN半连接…

【More Effective C++】条款22:采用op+=取代op+优势

采用operator实现operator优点&#xff1a; 降低维护成本&#xff0c;只需要维护operator即可&#xff1b;如果operator为publicoperator不需要称为class的友元&#xff1b;通过模板的方式自动实现operator版本&#xff1b;提供两种操作方式&#xff0c;operator效率高&#x…

计算机网络-局域网

文章目录 局域网局域网拓扑结构以太网以太网传输介质以太网时隙提高传统以太网带宽的途径以太网帧格式 局域网协议IEEE 802参考模型IEEE802.2协议LLC帧格式及其控制字段LLC提供的三种服务 IEEE 802.3协议IEEE 802.4协议IEEE 802.5协议 高速局域网100M以太网千兆以太网万兆以太网…

冲突管理最佳实践

任何团队都无法避免冲突&#xff0c;如何有效管理冲突&#xff0c;将冲突转化为团队成长和凝聚的动力&#xff0c;是任何一个团队管理者的必修课。原文: Best Practices for Managing Conflict in Engineering Management Obie Fernandez Unsplash 冲突在任何组织中都不可避免&…

计算机网络中的与或非运算

三种基本逻辑运算关系 搭建中小公司网络&#xff0c;根据网址计算&#xff0c;用户的人数 需要ip和掩码&#xff0c;确定可分配的ip数 与运算电路为串联电路&#xff0c;的&#xff0c;A,B的组合情况 具体参考三种基本逻辑运算关系

图片参考网站

摄图网-正版高清图片免费下载_商用设计素材图库 (699pic.com) AIGC数字艺术素材图片-数字艺术-数字艺术图片-摄图网 (699pic.com) 花瓣网 - 陪你做生活的设计师&#xff08;创意灵感天堂&#xff0c;搜索、发现设计灵感、设计素材&#xff09; (huaban.com) 千图网-免费在线…

python视频流处理工具

在当今数字化的时代&#xff0c;视频处理应用变得越来越普遍。无论是视频流分析、实时视频处理还是视频流转码&#xff0c;都需要强大的工具来实现。Python Vidgear 库就是这样一个工具&#xff0c;它为开发人员提供了丰富的功能&#xff0c;用于处理实时视频流。本文将深入探讨…

Android中Transition过渡动画的简单使用

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 一、布局xml文件代码如下&#xff1a; <?xml version"1.0" encoding&quo…

Feign接口GET方式注意事项

1. GET请求方式&#xff0c;对于feign接口一定得用 RequestParam/SpringQueryMap等注解声明是路径参数&#xff0c;否则会自动识别为body params报错(controller接口则可不用&#xff0c;springmvc会自动匹配相同字段名) demo: API 层controller接口&#xff1a; 前端传参可直…