【Kuiperinfer】笔记02 GoogleTest入门

2024-02-23 19:28

本文主要是介绍【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

这篇关于【Kuiperinfer】笔记02 GoogleTest入门的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/739670

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

数论入门整理(updating)

一、gcd lcm 基础中的基础,一般用来处理计算第一步什么的,分数化简之类。 LL gcd(LL a, LL b) { return b ? gcd(b, a % b) : a; } <pre name="code" class="cpp">LL lcm(LL a, LL b){LL c = gcd(a, b);return a / c * b;} 例题:

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

poj 2104 and hdu 2665 划分树模板入门题

题意: 给一个数组n(1e5)个数,给一个范围(fr, to, k),求这个范围中第k大的数。 解析: 划分树入门。 bing神的模板。 坑爹的地方是把-l 看成了-1........ 一直re。 代码: poj 2104: #include <iostream>#include <cstdio>#include <cstdlib>#include <al

MySQL-CRUD入门1

文章目录 认识配置文件client节点mysql节点mysqld节点 数据的添加(Create)添加一行数据添加多行数据两种添加数据的效率对比 数据的查询(Retrieve)全列查询指定列查询查询中带有表达式关于字面量关于as重命名 临时表引入distinct去重order by 排序关于NULL 认识配置文件 在我们的MySQL服务安装好了之后, 会有一个配置文件, 也就

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2