gtest 单元测试

devtools/2024/9/18 20:51:04/ 标签: 单元测试

概述

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

安装

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

第一步:假设实现两个函数:

// 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;
}

这两个函数定义在sample1.cc文件里,函数声明在 sample1.h 里:

#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 

第二步:现在我们就是要测试Factorial和IsPrime两个函数是否正确,好了开始写我们的测试用例把。新建一个文件,命名为sample_unittest.cc,代码如下:

#include <limits.h>
#include "sample1.h"
#include "gtest/gtest.h"
namespace {TEST(FactorialTest, Negative) {// This test is named "Negative", and belongs to the "FactorialTest"// test case.EXPECT_EQ(1, Factorial(-5));EXPECT_EQ(1, Factorial(-1));EXPECT_GT(Factorial(-10), 0);
}TEST(FactorialTest, Zero) {EXPECT_EQ(1, Factorial(0));
}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

TEST是gtest的测试宏,我们的测试用例必须按照这样格式写,isPrimeTest是测试套的名字,一个测试套下可以有多个测试用例,那么Positive、Trivial就是我们测试用例的名称,EXPECT_EQ、EXPECT_FALSE和EXPECT_TRUE等等,都是gtest提供的测试断言,比如 EXPECT_EQ(1, Factorial(1));就是表示Factorial(1)和1是不是相等的,如果是则表示EXPECT_EQ会返回成功,否则失败,也即我们测试用例会失败或者成功。

第三步: 实现测试的main函数,当然我们也可以不用写 main 函数,那就需要连接gtest_main.a这个库。比如这样子编译:

g++ sample1.cc sample1_unittest.cc -lgtest -std=c++14 -lgtest_main -lpthread -o test1

在这里插入图片描述

然后运行测试程序test:

$ ./test1

会有以下输出:
在这里插入图片描述
添加main 函数后,编译命令改为:

g++ sample1.cc sample_unittest_main.cc -lgtest -std=c++14 -lpthread -o test2

测试程序解读

首先,测试时使用 gtest 需包含头文件 gtest/gtest.h,并链接库 gtest_main.lib 和 gtest.lib.

TEST(分类名, 测试名) {测试代码也是如何测试,设置测试力}

test 中对数值的测试后缀:
在这里插入图片描述
对字符串的检查后缀:
在这里插入图片描述

gtest入门教程


http://www.ppmy.cn/devtools/17372.html

相关文章

第66天:API攻防-接口安全阿里云KEYPostmanDVWSXXE鉴权泄漏

案例一&#xff1a;安全问题-Dvws泄漏&鉴权&XXE 靶场地址&#xff1a;https://github.com/snoopysecurity/dvws-node 利用docker命令去启动 首先先注册一个账户 注册后登录点击admin area 发现点不进去 这里把bp打开但是不抓包&#xff0c;只做流量转发&#xff0c;进…

数据结构常见算法

文章目录 1. 排序算法1.1 冒泡排序1.2 快速排序1.3 归并排序 1. 排序算法 1.1 冒泡排序 冒泡排序是一种简单直观的排序算法&#xff0c;它重复地走访要排序的元素列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就将它们交换过来。这个过程持续多次&#xff0…

井字棋源码(网络线程池版)

源码链接&#xff1a;game 效果可能没有那么好&#xff0c;大家可以给点建议。 效果展示 game.h #include <stdio.h> #include <stdlib.h> #include <time.h>#define ROW 3 #define COL 3void InitBoard(char board[ROW][COL], int row, int col) {int i…

02 贪吃蛇

前言 呵呵 这是不知道 在哪里看到的 别人做的一个贪吃蛇 因此 也把我 之前的 贪吃蛇 移植上来了 当然 这个不过是为了 简单的入门了解, 呵呵 然后 c版本的贪吃蛇 需要先移植成 c 版本, 然后 再根据 单片机相关 设计调整 比如 led 点阵的输出, 比如 c99 语法的一些不兼容…

React18+TS+NestJS+GraphQL 全栈开发在线教育平台

React18TSNestJSGraphQL 全栈开发在线教育平台 React18TypeScriptNestJSGraphQL&#xff1a;全栈开发在线教育平台的无懈可击组合 随着科技的进步和互联网的普及&#xff0c;在线教育平台逐渐成为人们获取知识的重要途径。为了提供更加优质、高效的教育服务&#xff0c;我们需…

系统架构设计

领域驱动设计(DDD)_骆驼整理说-CSDN博客 SpringCloud、Springboot、nacos集成依赖jar包版本对比&#xff1a; https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery https://github.com/xai-org/grok-1/ 领域驱动设计的原则…

135. 分发糖果

n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xff0c;计算并返回需要准备的…

git强制覆盖本地命令

git强制覆盖本地命令&#xff08;单条执行&#xff09;&#xff1a; git fetch --all && git reset --hard origin/master && git pull 第一个是&#xff1a;拉取所有更新&#xff0c;不同步&#xff1b; 第二个是&#xff1a;本地代码同步线上最新版本(会覆盖…

leetcode543--二叉树的直径

1. 题意 求二叉树上最远两个节点之间的距离。 2. 题解 2.1 暴力 最长路径的三种情况 通过根节点在左子树在右子树 12 4 5 6 7 8 9 diameter 5通过根节点的最长路径长度一定是左右子树深度之和。 但是这样求左右子树的深度会不断重复&#xff0c;所以复杂度…

PS入门|图片如何去水印?这个教程很简单

前言 水印是图片上很常见的小东西。包括小白自己文章里所插入的图片都会有右下角的水印。 去除这种水印的办法其实很简单&#xff0c;直接打开PS&#xff0c;然后用一块同背景颜色的遮住它就行。 但是遇到渐变底色就比较麻烦&#xff0c;比如这张渐变颜色背景的 如果直接在旁边…

【STM32+HAL+Proteus】系列学习教程3---GPIO输出模式(LED流水灯、LED跑马灯)

实现目标 1、掌握GPIO 输出模式控制 2、学会STM32CubeMX软件配置GPIO 3、具体目标&#xff1a;1、开发板4个LED实现流水灯&#xff1b;2、开发板4个LED实现跑马灯灯。 一、STM32 GPIO 概述 1、GPIO定义 GPIO&#xff08;General-purpose input/output&#xff09;是通用输入…

Java23种设计模式-行为型模式之策略模式

策略模式&#xff08;Strategy Pattern&#xff09;&#xff1a;将算法的使用从算法的实现中分离出来&#xff0c;从而让算法的变化不会影响到使用算法的用户。 通常涉及三个角色&#xff1a; 1.上下文&#xff08;Context&#xff09;&#xff1a;持有策略接口的引用&#xf…

mybatis快速入门-注解版

mybatis 使用注解&#xff0c;简化 xml 配置&#xff0c;汲及到动态 sql 或是多表查询&#xff0c;还是使用 xml 映射文件配置编写。(企业工作中&#xff0c;几乎全是 xml 配置&#xff0c;xml 的 sql 使用注解方式少,而类引用注解方式)。 注解 Select()&#xff1a;查询Inse…

阿里云直播推流和播流地址的生成方法PHP

最近在用阿里云的直播SDK在进行直播功能的开发,整体来说磕磕绊绊&#xff0c;因为里面有好多的东西&#xff0c;一时半会的搞不定&#xff0c;但是工期又有期限&#xff0c;所以天天熬夜&#xff0c;程序员真心不容易&#xff0c;废话不多说&#xff0c;今天分享这个主要就是来…

4月25(信息差)

&#x1f384;宁德时代在 2024 北京车展上发布神行 PLUS 电池&#xff0c;该电池充电 10 分钟可续航 600 公里&#xff0c;并宣布今年内将推出 50 多款新车&#xff0c;同时启动构建神行超充网络。 &#x1f30b; 我国科学家自主研发的「北脑二号」成功填补了国内高性能侵入式…

WiTUnet:一种集成CNN和Transformer的u型架构,用于改进特征对齐和局部信息融合

WiTUnet:一种集成CNN和Transformer的u型架构&#xff0c;用于改进特征对齐和局部信息融合 摘要IntroductionRelated workMethod WiTUnet: A U-Shaped Architecture Integrating CNN and Transformer for Improved Feature Alignment and Local Information Fusion. 摘要 低剂量…

Hive架构原理

Hive Hive 的架构是设计用于在大数据环境下进行数据仓库操作和分析的系统。它建立在 Hadoop 生态系统之上&#xff0c;利用 Hadoop 的存储&#xff08;HDFS&#xff09;和计算&#xff08;MapReduce、Tez、Spark 等&#xff09;能力。 1. 元数据存储&#xff08;Metastore&am…

static作用

一、static的作用是什么&#xff1f; 在C语言中&#xff0c;static关键字有多种用途。它可以用于函数、变量和内部类型定义。总结一下&#xff0c;这些用途包括&#xff1a; 1. static函数&#xff1a;使用static关键字修饰的函数只能在其所在的源文件中访问&#xff0c;不能被…

react —— useState 深入

基础用法 useState Hook 提供了这两个功能&#xff1a; State 变量 在第一次重新渲染期间&#xff0c;这将具有作为参数传递的值State setter 函数 set 函数将允许将状态的值更新为不同的值&#xff0c;如果 set 函数中提供的值不同&#xff0c;则将触发重新渲染。 注意&…

Vscode上使用Clang,MSVC, MinGW, (Release, Debug)开发c++完全配置教程(包含常见错误),不断更新中.....

1.VSCode报错头文件找不到 clang(pp_file_not_found) 在Fallback Flags中添加 -I&#xff08;是-include的意思&#xff0c;链接你的编译器对应头文件地址&#xff0c;比如我下面的是MSVC的地址&#xff09; 问题得到解决~