gtest 单元测试工具的基本使用

article/2025/9/10 13:30:36

gtest 单元测试

  • gtest 简介
  • gtest 优点
  • 安装 gtest
  • 测试 demo
  • 总结

gtest 简介

gtest是Google的一套用于编写C++测试的框架,可以运行在很多平台上(包括Linux、Mac OS X、Windows、Cygwin等等)。基于xUnit架构。支持很多好用的特性,包括自动识别测试、丰富的断言、断言自定义、死亡测试、非终止的失败、生成XML报告等等。

gtest 优点

好的测试应该有下面的这些特点,我们看看GTest是如何满足要求的。

  1. 测试应该是独立的、可重复的。一个测试的结果不应该作为另一个测试的前提。GTest中每个测试运行在独立的对象中。如果某个测试失败了,可以单独地调试它。
  2. 测试应该是有清晰的结构的。GTest的测试有很好的组织结构,易于维护。
  3. 测试应该是可移植和可复用的。有很多代码是不依赖平台的,因此它们的测试也需要不依赖于平台。GTest可以在多种操作系统、多种编译器下工作,有很好的可移植性。
  4. 测试失败时,应该给出尽可能详尽的信息。GTest在遇到失败时并不停止接下来的测试,而且还可以选择使用非终止的失败来继续执行当前的测试。这样一次可以测试尽可能多的问题。
  5. 测试框架应该避免让开发者维护测试框架相关的东西。GTest可以自动识别定义的全部测试,你不需要一一列举它们。
  6. 测试应该够快。GTest在满足测试独立的前提下,允许你复用共享数据,它们只需创建一次。
  7. GTest采用的是xUnit架构,你会发现和JUnit、PyUnit很类似,所以上手非常快。

安装 gtest

2.搭建测试框架
gtest下载地址: https://github.com/google/googletest
下载方法是:git clone https://github.com/google/googletest.git
安装方法是:
$ cd googletest
注意:如果在make 过程中报错,可在CMakeLists.txt 中增加如下行,再执行下面的命令: SET(CMAKE_CXX_FLAGS “-std=c++11”)
$ cmake .
$ make
然后在lib目录下会生成:libgmock.a libgmock_main.a libgtest.a libgtest_main.a
最后我们再sudo make install。

测试 demo

待测试的代码文件:
sample1.cc
写得比较简单: 一个函数是 n 的阶乘计算,另外一个是判断是否为素数

#include "sample1.h"// Returns n! (the factorial of n).  For negative n, n! is defined to be 1.
int Factorial(int n) {int result = 1;for (int i = 1; i <= n; i++) {result *= i;}return result;
}// Returns true iff n is a prime number.
bool IsPrime(int n) {// Trivial case 1: small numbersif (n <= 1) return false;// Trivial case 2: even numbersif (n % 2 == 0) return n == 2;// Now, we have that n is odd and n >= 3.// Try to divide n by every odd number i, starting from 3for (int i = 3; ; i += 2) {// We only have to try i up to the square root of nif (i > n/i) break;// Now, we have i <= n/i < n.// If n is divisible by i, n is not prime.if (n % i == 0) return false;}// n has no integer factor in the range (1, n), and thus is prime.return true;
}

测试代码头文件


#ifndef GTEST_SAMPLES_SAMPLE1_H_
#define GTEST_SAMPLES_SAMPLE1_H_// Returns n! (the factorial of n).  For negative n, n! is defined to be 1.
int Factorial(int n);// Returns true iff n is a prime number.
bool IsPrime(int n);#endif

创建测试文件,其中使用的规则 和 gtest 库相关 sample_unittest.cc

#include <limits.h>
#include "sample1.h"
#include "gtest/gtest.h"
//加上命名空间 避免和 gtest 里面的变量 命名冲突
namespace {
//TEST 是标号,gtest 识别,标号后面 (待测试的函数名称,以及一个标识符),命名没有特别要求,但是建议顾名思义,第一个是你要测试的函数名,第二个是参数是正还是负,这是待会测试打印的,便于查看的
TEST(FactorialTest, Negative) {// This test is named "Negative", and belongs to the "FactorialTest"// test case.EXPECT_EQ(1, Factorial(-5));//这里就是 将 -5 传到 Factorial 函数中去,看是不是预期等于1EXPECT_EQ(1, Factorial(-1));//同理 传入 -1 预期是否为1EXPECT_GT(Factorial(-10), 0);	//GT 大于等原因的意思,是否是大于0
}TEST(FactorialTest, Zero) {EXPECT_EQ(1, Factorial(0));
}
//与上面同理,这种 传值,大小的分类是便于我们自己查看,也可以一锅炖,都在一个 TEST 里面测试。但是这不方便我们查看。
TEST(FactorialTest, Positive) {EXPECT_EQ(1, Factorial(1));EXPECT_EQ(2, Factorial(2));EXPECT_EQ(6, Factorial(3));EXPECT_EQ(40320, Factorial(8));
}// Tests IsPrime()
TEST(IsPrimeTest, Negative) {EXPECT_FALSE(IsPrime(-1));EXPECT_FALSE(IsPrime(-2));EXPECT_FALSE(IsPrime(INT_MIN));
}TEST(IsPrimeTest, Trivial) {EXPECT_FALSE(IsPrime(0));EXPECT_FALSE(IsPrime(1));EXPECT_TRUE(IsPrime(2));EXPECT_TRUE(IsPrime(3));
}TEST(IsPrimeTest, Positive) {EXPECT_FALSE(IsPrime(4));EXPECT_TRUE(IsPrime(5));EXPECT_FALSE(IsPrime(6));EXPECT_TRUE(IsPrime(23));
}
}  // namespace

编译上述 三个文件 需要加上 gtest 库,线程库
g++ sample1.cc sample1_unittest.cc -lgtest -std=c++11 -lgtest_main -lpthread -o test1

测试效果
执行 ./tese1

在这里插入图片描述
如果我们故意 将
sample1.cc
中 n <= 1 ,改为 return false‘
立马定位到我们的错误
在这里插入图片描述

总结

上述介绍了 gtest 两个案例,一是 n 的阶乘,另一个是 判断是否是素数.gtest 功能强大,在实际项目开发中必不可少。


http://chatgpt.dhexx.cn/article/HcHFFxBh.shtml

相关文章

Python Selenium破解滑块验证码最新版(GEETEST 95%以上通过率)

一、滑块验证码简述 有爬虫&#xff0c;自然就有反爬虫&#xff0c;就像病毒和杀毒软件一样&#xff0c;有攻就有防&#xff0c;两者彼此推进发展。而目前最流行的反爬技术验证码&#xff0c;为了防止爬虫自动注册&#xff0c;批量生成垃圾账号&#xff0c;几乎所有网站的注册页…

Python Selenium 破解极验(GeeTest)滑动验证

A r m o u r G e e T e s t ArmourGeeTest ArmourGeeTest [TOS] 本项目仅供交流学习&#xff0c;有疑问请在issue中提出&#xff1b;本项目不提供面向任何商业需求的版本迭代&#xff1b;关于本项目源码的使用请遵循Apache-2.0 License&#xff1b;禁止任何人使用本项目及其分支…

基于行为式验证的GeeTest验证码研究

什么是行为式验证 行为式验证的核心思想是利用用户的“行为特征”来做验证安全判别。整个验证框架采用高效的“行为沙盒”主动框架, 这个框架会引导用户在“行为沙盒”内产生特定的行为数据&#xff0c;利用“多重复合行为判别”算法从特指、视觉、思考等多重行为信息中辨识出生…

reactNative集成极验(GeeTest)

考虑到网上还没有rn极验的集成文章&#xff0c;前俩天公司业务正好集成了一下android和ios的sdk&#xff0c;平时时间少没时间写&#xff0c;今天简单介绍一下集成方案&#xff0c;要是时间允许的话&#xff0c;我搞一个极验的rn版sdk&#xff0c;给大家分享一下&#x1f604; …

项目gtest测试框架 - GoogleTest(十)

精简版本的C单元测试框架 &#xff0c;通过编写这个简单的测试框架&#xff0c;将有助于我们理解gtest。 1. 目录 类型文件说明文件./CMakeLists.txt整体项目工程文件目录./debiandeb包打包脚本目录&#xff0c;未实现目录./rpmrpm打包目录&#xff0c;rpm打包的详细内容可以…

Geetest极验+VUE把验证码绑定到自己的按钮(例如获取验证码)

极验流程 客户端gt.js里调用initGeetest发起初始化&#xff0c;会向后端获取gt等参数&#xff08;后端会跟极验通信&#xff09;&#xff0c;然后前端会根据传回的数据去决定用什么做验证&#xff0c;然后验证通过之后会有三个参数提供给后端进行二次校验的。具体接入看极验官…

【日常】Geetest滑动验证码(三代canvas版)处理小结(以B站登录验证为例)

问题描述 这个问题确实让我困扰了太长时间&#xff0c;今天花了半天时间&#xff0c;并没有找到非常完满的解决方案&#xff0c;只是在解决问题的过程中学会了一些其他知识&#xff0c;我最后还是要通过人工来判断大致的移动距离&#xff0c;然后根据误差做微调。大致做个总结…

geetest极验空间推理验证码破解与研究

看了很多的破解滑动验证码&#xff0c;决定破解一下空间推理验证码。破解思路&#xff0c;通过分析接口请求&#xff0c;对图片物体进行定位分类&#xff0c;通过模拟请求破解验证码。 研究的网站为 https://www.geetest.com/show 一、极验请求分析 请求详细 一、register-s…

googletest简介

googletest是由谷歌的测试技术团队开发的测试框架&#xff0c;使用c实现&#xff0c;具有跨平台等特性。 好的测试框架 引用谷歌给出的文档&#xff0c;好的测试应当具备以下特征&#xff1a; 测试应该是独立的和可重复的。调试一个由于其他测试而成功或失败的测试是一件痛苦…

破解极验(geetest)验证码

最近在搞爬虫的时候在好几个网站都碰到了一种叫做geetest的滑动条验证码,一直没有太好的办法只能在触发这个验证码后发个报警去手动处理一下。http://www.geetest.com/exp_embed是他们官网的样例。 后来研究了下觉得要破解这个验证码有这么几个问题: 无法直接通过发送…

破解滑块验证码最新版(GEETEST 95%以上通过率)

一、滑块验证码简述 有爬虫&#xff0c;自然就有反爬虫&#xff0c;就像病毒和杀毒软件一样&#xff0c;有攻就有防&#xff0c;两者彼此推进发展。而目前最流行的反爬技术验证码&#xff0c;为了防止爬虫自动注册&#xff0c;批量生成垃圾账号&#xff0c;几乎所有网站的注册页…

极验GeeTest简单demo

概述 人机验证 3.0 解决方案(基于生物行为与人工智能) 2012 年极验将人机验证从1.0时代推动到了 2.0 时代。在 5 年时间中&#xff0c;超过千亿次数据学习与优化&#xff0c;极验利用三角防护理论和 AI 智能决策引擎&#xff0c;全面更新安全架构。2017 年&#xff0c;正式推出…

极验geetest的使用

项目中会遇到 滑块验证的需求&#xff1a; 前端vue里 1.新建/utils/gt3.js "v0.4.8 Geetest Inc.";(function (window) {"use strict";if (typeof window undefined) {throw new Error(Geetest requires browser environment);}var document window.do…

爬虫进阶教程:极验(GEETEST)验证码破解教程

摘要: 爬虫最大的敌人之一是什么&#xff1f;没错&#xff0c;验证码&#xff01;Geetest作为提供验证码服务的行家&#xff0c;市场占有率还是蛮高的。遇到Geetest提供的滑动验证码怎么破&#xff1f;授人予鱼不如授人予渔&#xff0c;接下来就为大家呈现本教程的精彩内容。 一…

【已解决】安卓手机的GeeTest文件夹是什么

网上关于安卓系统手机的GeeTest目录是什么的文章和帖子&#xff0c;绝大部分打着GeeTest的标题&#xff0c;内容都是牛头不对马嘴&#xff0c;答非所问&#xff0c;没一个能解释清楚。 我刚刚找到了正式的答复如下&#xff1a; Android 手机上的“geetest”目录与名为“极验”的…

正定二次型与半正定二次型

对于实二次型其中A是实对称的&#xff0c;下列条件等价&#xff1a; 正定的 &#xff08;1&#xff09;是正定的. &#xff08;2&#xff09;它的正惯性指数p等于n. &#xff08;3&#xff09;有可逆实矩阵C&#xff0c;使得其中 &#xff08;4&#xff09;实对称矩阵A是正…

怎么对document.write写出来的内容调整对齐方式_【求职技巧】给少数人:硅谷BAT级别的简历这么写...

我什么都不会”,“我什么都没干”,“这个项目很水”,这是我在帮别人修改简历时听到的最多的几句话。难道你真的什么都不会吗?真的什么都没干吗?真的很水吗?其实很多情况下,是这样的。 但是很水就放弃治疗了吗?不会的。放下无谓的抱怨和遗憾,好好梳理自己,认真编…

c语言八皇后问题经典算法,经典算法之八皇后问题

八皇后问题是一个古老而又著名的问题&#xff0c;是学习回溯算法的一个经典案例。今天我们就一起来探究一下吧&#xff01; 时间退回到1848年&#xff0c;国际西洋棋棋手马克斯贝瑟尔提出了这样的一个问题&#xff0c; 在88格的国际象棋上摆放八个皇后&#xff0c;使其不能互相…

从八皇后问题思考回溯法

一、八皇后问题 八皇后是经典的回溯法问题&#xff0c;题目是说将八个皇后&#xff0c;放到88的国际象棋棋盘中中&#xff0c;使得任意两个皇后都不能在同一行、同一列以及同一条对角线上。下图是一个四皇后的搜索示意图。 八皇后问题可以通过暴力法求解&#xff0c;代码也很…

八皇后问题(Python)

一.问题简介 八皇后问题&#xff1a; 如何能在 8*8 的国际象棋棋盘上放置八个皇后&#xff0c;使得任何一个皇后都无法直接吃掉其他的皇后&#xff1f;为了到达此目的&#xff0c;任两个皇后都不能处于同一条横行、纵行或斜线上。 二.几种思路和方法 1.回溯法递归思想 如图所…