gtest之primer

news/2024/11/23 3:20:17/

目录

  • 准备工作
  • 测试宏
  • 两个概念
  • Test Fixtures
  • main函数
  • 关于线程安全

准备工作

GoogleTest官网:https://google.github.io/googletest/
gtest github仓库:https://github.com/google/googletest
目前最新稳定版本:https://github.com/google/googletest/releases/tag/v1.13.0
下载源码,到目录下创建build文件夹进入后运行 cmake …

测试宏

gtest有两套测试宏:ASSERT_* 和 EXPECT_*:

  • ASSERT_* 会生成fatal错误并终止当前函数,EXPECT_* 生成非fatal错误,不会终止当前函数。在使用中优先选择EXPECT_* 。如果发生错误继续测试下去没有意义可以使用ASSERT_*
  • ASSERT_* 断言失败后会立即返回,很有可能跳过清理代码,所以有可能发生资源泄露,看使用场景是否允许这种情况发生

两个概念

  • test suites
  • test fixtures

Test Fixtures

创建一个fixture:

  1. 继承自::testing::Test,使用protected(因为TEST_F中可以直接访问到继承类中定义的数据成员)
  2. 可以在类中声明任何想要的对象
  3. 如果需要可以实现默认构造或者SetUp(),注意不要写成Setup(),使用override关键字可以防止拼写错误
  4. 如果需要可以实现析构或者TearDown()释放SetUp中申请的资源。在哪些地方使用构造/析构,在哪些地方使用SetUp()/TearDown(),参考https://google.github.io/googletest/faq.html#CtorVsSetUp
    当使用fixture时,使用TEST_F()代替TEST(),TEST_F()(_F代表Fixture)允许你在test fixture中访问对象和子程序
    TEST_F()的第一个参数必须是 test fixture 的类名,所以必须在使用TEST_F之前定义一个test fixture类
    对于每个定义了的TEST_F(),gtest会在运行时创建一个新的test fixture,通过SetUp立即初始化,运行完测试程序后通过TearDown清理,并删除test fixture。注意,在test suite中不同的tests有不同的test fixture对象,gtest会在创建新的test fixture之前先删除以前的。gtest不会在多个tests中复用test fixture。任何一个test的改变不会影响其他的
    (TEST和TEST_F要写在cpp中,h和hpp中没法调用)
TEST_F(QueueTest, IsEmptyInitially) {EXPECT_EQ(q0_.size(), 1);
}TEST_F(QueueTest, DequeueWorks) {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;n = q2_.Dequeue();ASSERT_NE(n, nullptr);EXPECT_EQ(*n, 2);EXPECT_EQ(q2_.size(), 1);delete n;
}

处理流程如下:

  1. 开始第一个测试(IsEmptyInitially)gtest构造QueueTest对象(我们称之为t1)
  2. 自动调用 t1.SetUp() 初始化t1
  3. 执行第一个test的test body
  4. t1.TearDown()执行清理工作
  5. t1析构
  6. 重复第二个test(DequeueWorks)

定义完tests之后,可以运行 RUN_ALL_TESTS(),它会让所有的tests运行。成功返回0,否则返回1。
RUN_ALL_TESTS()运行之后:

  1. 保存gtest flags的状态
  2. 为第一个test创建test fixture
  3. 通过SetUp()初始化
  4. 在fixture对象上运行test
  5. 通过TearDown() 清理fixture
  6. 删除fixture
  7. 保存gtest flags的状态
  8. 重复开始下一个test,直到所有的tests都运行完

main函数

对于不需要做额外操作的用户来说应该使用gtest_main代替main。如果要使用main,就需要返回RUN_ALL_TESTS()

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

::testing::InitGoogleTest() 解析命令行参数,必须要在RUN_ALL_TESTS()前调用,详细信息参考https://google.github.io/googletest/advanced.html

关于线程安全

gtest在pthreads库中被设计为是线程安全的,在其他情况下多线程下是不安全的,大多数情况下断言只在main线程中执行,所以不会有问题,如果要支持多线程安全需要使用gtest-port.h中的同步机制


http://www.ppmy.cn/news/61036.html

相关文章

手动实现 Spring 底层机制【初始化 IOC容器+依赖注入+BeanPostProcessor 机制+AOP】

目录 手动实现 Spring 底层机制【初始化 IOC容器依赖注入BeanPostProcessor 机制AOP】 前面我们实际上已经用代码简单实现了 代码演示使用框架 创建一个maven项目 创建UserAction类 创建UserDao类 创建UserService类 创建beans.xml 说明 创建AppMain类 运行效果 如图…

python处理图像的各种技术镜像、旋转、遮挡、叠加、条带化

2.6 图像镜面对称 1、将图像水平镜面转换。 2、将图像垂直镜面转换。 import random #导入模块 import numpy as np import matplotlib.pyplot as plt a plt.imread("1.jpg") # 将图像沿着水平方向重复三次。 ba.copy() da.copy() # 将图像水平镜面转换。&…

对象浅拷贝的5种方式

参考原文:浅拷贝的五种实现方式 - 掘金 (juejin.cn) 哈喽 大家好啊 最近发现自己对对象都不是很熟练,特别是涉及到一些复制,深浅拷贝的东西 1.Object.assign 首先 我们创建一个空对象obj1 然后创建一个对象obj2 用object.assign(目标对象&#xff0c…

Java --- String类

(一)String java.lang.String 类代表字符串。Java 程序中所有的字符串文字(例如 "hello" )都可以看作是实现此类的实例。 字符串是常量,用双引号引起来表示。它们的值在创建之后不能更改。 字符串 St…

【Ehcache技术专题】「入门到精通」带你一起从零基础进行分析和开发Ehcache框架的实战指南(设置缓存)

带你一起从零基础进行分析和开发Ehcache框架的实战指南 缓存大小的设置CacheManager级别maxBytesLocalHeapmaxBytesLocalOffHeapmaxBytesLocalDisk配置案例Xml代码 Cache级别Cache支持百分比控制百分比需要注意要点大小限制注意要点 Cache指定元素数量maxEntriesLocalHeapmaxEn…

QT教程demo之串口助手代码设计实现

关注WeChat Official Account 南山府嵌入式获取更多精彩 我创建了一个群关注V号后加入。因为这里不允许添加二维码 代码&#xff1a;QT_Pr 1-QT开发串口助手需要的基本文件 在QT6开发串口助手时&#xff0c;通常需要以下头文件&#xff1a; #include <QSerialPort> #i…

pulsar-admin接入项目

练手项目 第一步&#xff1a;添加依赖 <dependency> <groupId>org.apache.pulsar</groupId> <artifactId>pulsar-client-admin</artifactId> <version>2.10.1</version> </dependency> 第二步&#xff1a;编写代码 Stri…

彻底搞懂this的指向问题(JavaScript的this)

前言 为什么要有this 首先你应该先了解执行上下文的概念&#xff0c;例如下面这个函数&#xff0c;javaScript运行在函数体内部&#xff0c;引用当前上下文的其他变量。 function func() {console.log(a); }问题是&#xff1a;函数的调用可以在任何其他执行上下文中被调用&a…