当前位置: 首页 > news >正文

软件测试:C++ Google Test单元测试框架GTest

目录

        • 编译和安装
        • 框架使用
          • Assertions
          • Google Testing
          • Google Mocking
          • Matchers
          • Actions
        • 运行结果

最近在写项目的时候,学到了许多关于软件测试的知识,也不断的使用新的测试框架和测试工具,每次总是机械式的拼接其他人的代码,代码发生错误也不知道怎么解决,因此我打算直接将其学一遍,以便为了更灵活的写测试代码

编译和安装

下载地址:Google Test Github网站

然后直接在CMakeLists.txt引入就好了

include_directories(include) # 设置include路径set(CXXFLAGS -std=c++11 -lgtest -lpthread)
add_compile_options(${CXXFLAGS})target_link_libraries(test gtest pthread) # 链接gtest静态库
框架使用

框架的使用主要分为几个模块:AssertionsGoogle TestingGoogle MockingMatchersActions

Assertions

这一部分主要是一些断言和比较宏定义,内容较多,以下是一部分,想看全部的可以去看源码

这一部分理解比较简单,不做概述

#define EXPECT_THROW(statement, expected_exception) \GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
#define EXPECT_NO_THROW(statement) \GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
#define EXPECT_ANY_THROW(statement) \GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
#define ASSERT_THROW(statement, expected_exception) \GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
#define ASSERT_NO_THROW(statement) \GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
#define ASSERT_ANY_THROW(statement) \GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)
Google Testing

这部分是框架的主要部分,也是开发人员接触最多的地方

首先来介绍三个常用的宏:TESTTEST_FTEST_P

TEST:一般测试,在其内部设置断言

TestSuiteName定义了测试套件名称,TestName定义了自定义测试名

  • 注意这两个的命名不要包括下划线_
TEST(TestSuiteName, TestName) 
{// statements
}

TEST_F:多样测试,就是多种不同情况的测试中都会使用相同一份的测试数据的情况

TEST_P(TestFixtureName, TestName) 
{// statements
}

TEST_P:值参数化测试,自动化产生输入参数进行测试

TEST_P(TestFixtureName, TestName) 
{// statements
}

TEST_P为例写一个小demo

首先定义一个测试套件类,在其中定义要产生测试输入参数的类型

// 其中TestWithParam从Test类和WithParamInterface类派生来的,这两个类是必要的
class FooTest : public ::testing::TestWithParam<int> {};

产生自动化输入参数结构

INSTANTIATE_TEST_CASE_P(InstantiationName, // 此处自定义名称FooTest, // 测试套件类::testing::Values(1, 2, 3));

第三个参数是可更改的,比如RangeBoolValuesInValues

INSTANTIATE_TEST_SUITE_P(MyInstantiation, MyTestSuite,testing::Values(...),[](const testing::TestParamInfo<MyTestSuite::ParamType>& info) {// Can use info.param here to generate the test suffixstd::string name = ...return name;});

要注意的是Combine,它会把其中的变量组成一个联合排列输入参数(确保支持tr/tuple<T>特性)


class Bis {bool Even(int dd) {}bool Suc(bool dc) {}
};class CombineTest : public ::testing::TestWithParam< ::testing::tuple<bool, int> > {
protected:bool CheckData() {bool dc = ::testing::get<0>(GetParam());int dd = ::testing::get<1>(GetParam());return bis.Suc(dc) && bis.Even(dd);}
private:Bis bis;
}TEST_P(MyCombineTest, CombineTestUnit)
{EXPECT_TRUE(CheckData());
}INSTANTIATE_TEST_CASE_P(TestBisValuesCombine, CombineTest, ::testing::Combine(::testing::Bool(), ::testing::Values(3, 4)));

最后在TEST_P中写测试代码

bool IsPrime(int n)
{return n > 0;
}TEST_P(FooTest, DoesBlah) 
{// Inside a test, access the test parameter with the GetParam() method// of the TestWithParam<T> class://在测试中,使用TestWithParam <T>类的GetParam()方法访问测试参数:int n =  GetParam();EXPECT_TRUE(IsPrime(n));// ...
}

其他部分API用的时候直接看官网就好了,主体是这三个API,其他基本上都是辅助宏

Google Mocking

有点类似于伪装接口,一般情况下用不着,不做概述

Matchers

有点类似于前面的断言,直接看部分源码(在gmok-matchers.h文件中)

inline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring>> StrEq(const std::wstring& str) {return MakePolymorphicMatcher(internal::StrEqualityMatcher<std::wstring>(str, true, true));
}// Matches a string not equal to str.
inline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring>> StrNe(const std::wstring& str) {return MakePolymorphicMatcher(internal::StrEqualityMatcher<std::wstring>(str, false, true));
}// Matches a string equal to str, ignoring case.
inline PolymorphicMatcher<internal::StrEqualityMatcher<std::wstring>> StrCaseEq(const std::wstring& str) {return MakePolymorphicMatcher(internal::StrEqualityMatcher<std::wstring>(str, true, false));
}
Actions

这玩意也是一个和断言差不多的东西,看部分源码

template <size_t k, typename Ptr>
struct SaveArgAction {Ptr pointer;template <typename... Args>void operator()(const Args&... args) const {*pointer = std::get<k>(std::tie(args...));}
};template <size_t k, typename Ptr>
struct SaveArgPointeeAction {Ptr pointer;template <typename... Args>void operator()(const Args&... args) const {*pointer = *std::get<k>(std::tie(args...));}
};
运行结果

下面来看看一个普通测试套件的运行结果

#include <gtest/gtest.h>
#include <stdint.h>
#include <stdio.h>int Add(uint32_t a, uint32_t b)
{return a + b;
}TEST(LLT, MAIN)
{EXPECT_EQ(Add(1U, 1U), 1U);
}int main(int argc, char **argv)
{testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}
ubuntu@VM-8-16-ubuntu:~/finale/llt/build$ ./test 
[==========] Running 1 test from 1 test suite.
[----------] Global test environment set-up.
[----------] 1 test from LLT
[ RUN      ] LLT.MAIN
/home/ubuntu/finale/llt/src/test_main.cc:17: Failure
Expected equality of these values:add(1U, 1U)Which is: 21UWhich is: 1
[  FAILED  ] LLT.MAIN (0 ms)
[----------] 1 test from LLT (0 ms total)[----------] Global test environment tear-down
[==========] 1 test from 1 test suite ran. (0 ms total)
[  PASSED  ] 0 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] LLT.MAIN1 FAILED TEST

这个框架自定义的界面还是很好看的!

相关文章:

软件测试:C++ Google Test单元测试框架GTest

目录 编译和安装框架使用AssertionsGoogle TestingGoogle MockingMatchersActions 运行结果 最近在写项目的时候&#xff0c;学到了许多关于软件测试的知识&#xff0c;也不断的使用新的测试框架和测试工具&#xff0c;每次总是机械式的拼接其他人的代码&#xff0c;代码发生错…...

大数据面试题 —— HBase

目录 什么是HBase简述HBase 的数据模型HBase 的读写流程HBase 在写的过程中的region的split的时机HBase 和 HDFS 各自的使用场景HBase 的存储结构HBase 中的热现象&#xff08;数据倾斜&#xff09;是怎么产生的&#xff0c;以及解决办法有哪些HBase rowkey的设计原则HBase 的列…...

SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现GWO-TCN-BiGRU-Attention灰狼算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型描述程序…...

SpringMVC的执行原理

SpringMVC的执行原理可以简单地概括为以下几个步骤&#xff1a; 客户端发送请求&#xff1a;客户端&#xff08;一般是浏览器&#xff09;发送HTTP请求到服务器&#xff0c;请求特定的URL资源。 前端控制器&#xff08;DispatcherServlet&#xff09;接收请求&#xff1a;在Sp…...

Qt + HTTP 线程交互类封装

介绍 QT的HTTP模块封装的交互类&#xff0c;线程运行。使用时添加自己的业务逻辑即可 代码 头文件 /*** file httpcontroller.h* brief 云台相机的协议交互类* author xintong-zhou* date 2024-03-13*/#ifndef HTTPCONTROLLER_H #define HTTPCONTROLLER_H#include <QNet…...

GitHub Copilot+ESP开发实战-串口

上篇文章讲了GitHub Copilot在应用中可能遇到的问题&#xff0c;接下来小启就简单介绍下GitHub Copilot在ESP32开发中C语言实现串口功能&#xff0c;感兴趣的可以看看。 一、向Copilot提问&#xff1a; 1. ESP32用C语言实现串口初始化&#xff1b; 2.配置uart为1&#xff0c…...

C# 使用ffmpeg将图片保存为mp4视频

使用 FFmpeg 这个强大的多媒体处理工具&#xff0c;可以轻松地将一系列图片转换为一个 MP4 视频文件。以下是一个基本的命令行示例来完成这个任务&#xff1a; ffmpeg -framerate 25 -i image-%03d.jpg -c:v libx264 -r 30 -pix_fmt yuv420p output.mp4 命令参数说明&#xf…...

Java安全技术及代码审计技巧

概述 Java安全编码和代码审计是确保Java应用程序安全性的重要环节。本文旨在介绍Java中常见的Web漏洞、安全编码示例以及一些常见漏洞函数&#xff0c;并提供一个自动化查找危险函数的Python脚本。 1. XML外部实体 (XXE) 漏洞 介绍 XML文档结构包括XML声明、DTD文档类型定义&…...

C# 使用OpenCvSharp4将Bitmap合成为MP4视频的环境

环境安装步骤&#xff1a; 在VS中选中项目或者解决方案&#xff0c;鼠标右键&#xff0c;选择“管理Nuget包”&#xff0c;在浏览窗口中搜索OpenCVSharp4 1.搜索OpenCvSharp4,选择4.8.0版本&#xff0c;点击安装 2.搜索OpenCvSharp4.runtime.win,选择4.8.0版本&#xff0c;点…...

[游戏开发][Unity] 导出Xcode工程,完成调试与发布

Unity导出Xcode工程(模拟器版本与真机调试) [游戏开发][Unity] 打包Xcode工程模拟器真机调试_unity5 打包xcod-CSDN博客 Unity导出发布版本Xcode工程&#xff0c;上传app到官网&#xff0c;正式发布或创建TestFlight Xcode发布AppStore与TestFlight全流程_xcode 上传到testfit-…...

JSONP 实现跨域请求案例

后端使用 express 搭建&#xff0c;案例代码如下&#xff1a; const express require(express)const app express() const PORT 3000app.get(/data, (req, res) > {const jsonData {name: Alan,age: 666,city: GD}const callback req.query.callback // 获取前端中的回…...

2024年智慧城市、人文发展与区域经济国际会议(ICSCCDRE 2024)

2024年智慧城市、人文发展与区域经济国际会议&#xff08;ICSCCDRE 2024&#xff09; 2024 International Conference on Smart Cities, Cultural Development and Regional Economy 会议简介&#xff1a; 城市经济人文发展是一个综合性的过程&#xff0c;它关注城市在经济、…...

目标检测——PP-YOLO算法解读

PP-YOLO系列&#xff0c;均是基于百度自研PaddlePaddle深度学习框架发布的算法&#xff0c;2020年基于YOLOv3改进发布PP-YOLO&#xff0c;2021年发布PP-YOLOv2和移动端检测算法PP-PicoDet&#xff0c;2022年发布PP-YOLOE和PP-YOLOE-R。由于均是一个系列&#xff0c;所以放一起解…...

多特征变量序列预测(11) 基于Pytorch的TCN-GRU预测模型

往期精彩内容&#xff1a; 时序预测&#xff1a;LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较-CSDN博客 风速预测&#xff08;一&#xff09;数据集介绍和预处理-CSDN博客 风速预测&#xff08;二&#xff09;基于Pytorch的EMD-LSTM模型-CSDN博客 风速预测&#xff…...

Lvs+keepalived+nginx搭建高可用负载均衡集群

环境配置 master主机192.168.199.149&#xff0c;虚拟IP192.168.199.148 back备机192.168.199.150 真实服务器1 192.168.199.155 真实服务器2 192.168.199.156 关闭防火墙和selinux master配置&#xff08;149&#xff09; 添加虚拟IP ip addr add 192.168.199.148/24 …...

WPF —— 控件模版和数据模版

1:控件模版简介: 自定义控件模版&#xff1a;自己添加的样式、标签&#xff0c;控件模版也是属于资源的一种&#xff0c; 每一个控件模版都有一唯一的 key&#xff0c;在控件上通过template属性进行绑定 什么场景下使用自定义控件模版&#xff0c;当项目里面多个地方…...

如何动态修改spring中定时任务的调度策略(1)

在我们日常开发中经常会调度工具来处理一下需要定时执行的任务&#xff0c;比如定时导出报表数据给业务方发送邮件。你在工作中是如何这种定时调度&#xff1f; 如何实现调度任务 使用java技术栈的老铁来说&#xff0c;现成定时调度的解决方案应该有很多&#xff0c;总结来说…...

idea import的maven类报红

idea 报红/显示红色的原因 一般报红&#xff0c;显示红色&#xff0c;是因为 idea 在此路径下&#xff0c;找不到这个类。 找到是哪个 jar 包的类导致 idea 报红 点击报红的路径的上一层&#xff0c;进入jar 包。比如&#xff1a; import com.aaa.bbb.ccc.DddDto;这个 impo…...

React——class组件中setState修改state

class组件中通过state去存储当前组件的数据&#xff0c;那怎么对其进行修改呢&#xff1f;就是方法this.setState({ 要修改的部分数据 }) setState() 作用&#xff1a;1 、修改 state 内容&#xff1b;2 、更新 UI 特别注意&#xff1a;react的核心其实是虚拟dom&#xff08;数…...

搭建基于 Snowflake 的 CI/CD 最佳实践!

Snowflake 提供了可扩展的计算和存储资源&#xff0c;和基于 SQL 的界面 Snowsight&#xff0c;方便用户进行数据操作和分析。然而&#xff0c;如果用户想将自己的 CI/CD 流程与 Snowflake 集成时&#xff0c;会发现一些不便之处&#xff08;尤其相比其 SnowSight 优秀的查询能…...

创新技术学习:如何快速掌握一个全新的技术领域

创新技术学习&#xff1a;如何快速掌握一个全新的技术领域 在技术飞速发展的今天&#xff0c;掌握新技能已成为职业发展的关键。无论是人工智能、区块链&#xff0c;还是云计算&#xff0c;快速学习新技术的能力决定了个人和企业的竞争力。面对庞杂的知识体系&#xff0c;许多…...

Kaggle老手都在用的随机森林调参避坑指南:从特征重要性到OOB误差的实战技巧

Kaggle老手都在用的随机森林调参避坑指南&#xff1a;从特征重要性到OOB误差的实战技巧 在数据科学竞赛和工业级模型优化中&#xff0c;随机森林因其出色的表现和相对简单的调参流程&#xff0c;成为众多从业者的首选算法。然而&#xff0c;真正掌握随机森林的调参技巧&#xf…...

从零到一:用Python驱动AS7343,解锁树莓派上的光谱感知能力

1. 认识AS7343光谱传感器 AS7343是AMS公司推出的一款数字式多光谱传感器&#xff0c;专门用于检测可见光范围内的光线强度。这款传感器通过I2C接口与树莓派等嵌入式系统连接&#xff0c;能够提供高分辨率的光谱数据。在实际应用中&#xff0c;AS7343可以用于环境光照监测、颜色…...

EasyAnimate核心技术解析:Transformer Diffusion如何工作

EasyAnimate核心技术解析&#xff1a;Transformer Diffusion如何工作 【免费下载链接】EasyAnimate &#x1f4fa; An End-to-End Solution for High-Resolution and Long Video Generation Based on Transformer Diffusion 项目地址: https://gitcode.com/gh_mirrors/ea/Eas…...

颠覆性视频生成革命:ComfyUI-FramePackWrapper如何将显存占用降低60%并重塑AI视频工作流

颠覆性视频生成革命&#xff1a;ComfyUI-FramePackWrapper如何将显存占用降低60%并重塑AI视频工作流 【免费下载链接】ComfyUI-FramePackWrapper 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-FramePackWrapper 在AI视频生成领域&#xff0c;开发者长期面临着…...

终极指南:如何在Windows 10/11上完美修复ViPER4Windows音频增强工具

终极指南&#xff1a;如何在Windows 10/11上完美修复ViPER4Windows音频增强工具 【免费下载链接】ViPER4Windows-Patcher Patches for fix ViPER4Windows issues on Windows-10/11. 项目地址: https://gitcode.com/gh_mirrors/vi/ViPER4Windows-Patcher 厌倦了Windows 1…...

告别apt install:手动编译安装MySQL 5.7在Ubuntu上的完整配置与性能调优

告别apt install&#xff1a;手动编译安装MySQL 5.7在Ubuntu上的完整配置与性能调优 在数据库管理的世界里&#xff0c;预编译的二进制包虽然方便&#xff0c;却像是一套现成的西装——永远无法完美贴合你的身形。对于追求极致性能和控制力的开发者或DBA来说&#xff0c;手动编…...

Blender贝塞尔曲线终极指南:从零到精通的完整工作流

Blender贝塞尔曲线终极指南&#xff1a;从零到精通的完整工作流 【免费下载链接】blenderbezierutils Blender Add-on with Bezier Utility Ops 项目地址: https://gitcode.com/gh_mirrors/bl/blenderbezierutils 如果你曾经在Blender中尝试绘制贝塞尔曲线&#xff0c;可…...

2026年大模型开启涨价模式,从价格战到价值战,竞争焦点转向了哪里?

大模型告别低价时代&#xff0c;国产定价看齐海外迈入2026年&#xff0c;大模型毫不掩饰地开启了涨价模式&#xff0c;智普甚至在短短三个月内两次提价&#xff0c;国产大模型定价首次与海外头部厂商对齐。曾几何时&#xff0c;降价才是大模型的竞争基调&#xff0c;为了AI普惠…...

AI 引发互联网流量变革:从 1.0 到 2.0,传统企业如何转型突围?

【现象&#xff1a;发生了什么】 互联网流量的底层逻辑正被 AI 撼动。过去三年&#xff0c;四个标志性事件共同撬动了互联网流量 1.0 范式的根基。2022 年 11 月&#xff0c;ChatGPT 面世&#xff0c;两个月内用户突破 1 亿&#xff0c;截至 2026 年&#xff0c;其周活跃用户已…...