C++ 测试框架 Gtest学习——qt版本

news2025/7/21 5:09:45

目录标题

    • 一、参考文档
    • 二、获取Gtest
    • 三、使用
    • (一)qt项目导入Gtest
    • (二)修改pro文件
    • (三)一个简单的例子
    • (四)EXPECT(期望)和ASSERT(断言)介绍
    • (五)EXPECT(ASSERT)分类
    • (六)TEST(测试分类)
        • 1、TEST
        • 2、TEST_F
        • 3、TEST_P

一、参考文档

官方文档

介绍的比较详细的博客

二、获取Gtest

参考

三、使用

(一)qt项目导入Gtest

在项目中创建下面两个文件夹:

  • include
  • lib
    创建后将gtest的依赖放入里面。依赖获取可以参考获取Gtest

或者在这里获取跟我一样的依赖
在这里插入图片描述

(二)修改pro文件

TEMPLATE = app
CONFIG += console c++11
CONFIG -= app_bundle
CONFIG -= qt

# 项目根目录
CPP_ROOT     = $${PWD}

# include 所在目录
INC_PATH     = $${CPP_ROOT}/include
# lib所在目录
LIB_PATH     = $${CPP_ROOT}/lib


# 导入依赖,注意-L 和 -l 是有含义的。详细:https://blog.csdn.net/weixin_42156552/article/details/121871417
INCLUDEPATH += $$INC_PATH/gtest
LIBS        += -L$$LIB_PATH/-lgtest

SOURCES += main.cpp

(三)一个简单的例子

#include <iostream>
#include <gtest.h>

using namespace std;

//一个测试,里面的参数表示这个测试属于那个分组的。如果不会(简单的使用一下),名字可以随便写。
TEST(a1, b2)
{
    int a = 2;
    int b = 1;
    //判断a是不是等于b ,如果不等于会输出 "a!=b" 。EXPECT_EQ 是有特定含义的,用来判断是否相等
    EXPECT_EQ(a, b) << "a!=b" ;

}

int main(int argc, char* argv[])
{
    //固定代码  启动gtest
    testing::InitGoogleTest(&argc, argv);
    //运行所有测试(符合条件的)用例
    return  RUN_ALL_TESTS();
}

(四)EXPECT(期望)和ASSERT(断言)介绍

上面的例子中的EXPECT_EQ(a,b) 可以理解为期望a和b相等。

EXPECT 和 ASSERT 可以看作是测试类型的两大分类。EXPECT 类型的测试如果条件不满足,会继续执行接下来的测试。ASSERT 如果遇到一个不满足的,就会停止整个测试 ,注意:ASSERT 是停止一个{}中的所以测试。,不会继续运行其他测试。

  • 例子
#include <iostream>
#include <gtest.h>

using namespace std;

//一个测试,里面的参数表示这个测试属于那个分组的。如果不会(简单的使用一下),名字可以随便写。
TEST(a1, b1)
{
    int a = 2;
    int b = 1;
    EXPECT_EQ(2, 1) << "2!=1" ;

    EXPECT_EQ(3, 1) << "3!=1" ;

    //判断a是不是等于b ,如果不等于会输出 "a!=b" EXPECT_EQ 是有特定含义的。用来判断是否相等
    
    //遇到断言不满足,停止运行
    ASSERT_EQ(a, b) << "a!=b" ;

    EXPECT_EQ(4, 1) << "4!=1" ;

    //ASSERT_EQ(a, b) << "a!=b" ;
}

//如果b1测试中的断言为flase,不会影响b2测试的进行,只会影响b1后面的测试。
TEST(a1, b2)
{
    EXPECT_EQ(2, 1) << "2!=1" ;

    EXPECT_EQ(3, 1) << "3!=1" ;
}

int main(int argc, char* argv[])
{
    //固定代码  启动gtest
    testing::InitGoogleTest(&argc, argv);
    //运行所有测试(符合条件的)用例
    return  RUN_ALL_TESTS();
}

ASSERT_EQ(a, b) << “a!=b” ; 在 EXPECT_EQ(4, 1) << “4!=1” ; 之前测试,结果为:

在这里插入图片描述
ASSERT_EQ(a, b) << “a!=b” 在之后

在这里插入图片描述

(五)EXPECT(ASSERT)分类

如下:
在这里插入图片描述
更多查看官网,跳转

(六)TEST(测试分类)

参考官方文档

1、TEST

TEST(TestSuiteName, TestName) 
{
  
}

在测试套件 TestSuiteName 中定义一个名为 TestName 的单个测试,该测试由给定的语句组成。
参数 TestSuiteName 和 TestName 都必须是有效的C++标识符,并且不得包含下划线 ()。不同测试套件中的测试可以具有相同的单个名称。
测试主体中的语句可以是任何受测代码。测试机构中使用的断言决定了测试的结果。

第一个参数 TestSuiteName,为测试组的名字,一般将相同类型的测试分成一组,名字可以随意取,但是命名要符合规范。
第二个参数 TestName,为该测试的名字,是唯一的,不能重名,名字可以随意取,但是命名要符合规范。

#include <iostream>
#include <gtest.h>

using namespace std;

//一个测试,里面的参数表示这个测试属于那个分组的。如果不会(简单的使用一下),名字可以随便写。
//a1组中的,b1测试
TEST(a1, b1)
{
    int a = 2;
    int b = 1;
    EXPECT_EQ(2, 1) << "2!=1" ;

    EXPECT_EQ(3, 1) << "3!=1" ;

    //判断a是不是等于b ,如果不等于会输出 "a!=b" EXPECT_EQ 是有特定含义的。用来判断是否相等

    //遇到断言不满足,停止运行
    //ASSERT_EQ(a, b) << "a!=b" ;

    EXPECT_EQ(4, 1) << "4!=1" ;

    ASSERT_EQ(a, b) << "a!=b" ;
}

//a1组中的,b2测试
TEST(a1, b2)
{
    int a = 2;
    int b = 1;
    EXPECT_EQ(2, 1) << "2!=1" ;

    EXPECT_EQ(3, 1) << "3!=1" ;

    //判断a是不是等于b ,如果不等于会输出 "a!=b" EXPECT_EQ 是有特定含义的。用来判断是否相等

    //遇到断言不满足,停止运行
    //ASSERT_EQ(a, b) << "a!=b" ;

    EXPECT_EQ(4, 1) << "4!=1" ;

    ASSERT_EQ(a, b) << "a!=b" ;
}

int main(int argc, char* argv[])
{
    //固定代码  启动gtest
    testing::InitGoogleTest(&argc, argv);
    //运行所有测试(符合条件的)用例
    return  RUN_ALL_TESTS();
}

2、TEST_F

这种方式需要结合类使用,继承Gtest提供的接口类。

TEST_F(TestFixtureName, TestName) {
 
}

定义一个名为 TestName 的单个测试,该测试使用测试夹具类 TestFixtureName。测试套件名称为 TestFixtureName。

参数 TestFixtureName(一个继承了::testing::Test 的类) 和 TestName 都必须是有效的标识符C++并且不得包含下划线,不能重名。

  • mian
#include <iostream>
#include <gtest.h>
#include "testfixture.h"
using namespace std;


TEST_F(TestFixture, test1)
{
    EXPECT_EQ(id, 1);

    EXPECT_EQ(name, "xiaoming");
}

//将测试用例存放到 QueueTest里面。能重复调用测试用例
TEST_F(TestFixture, test2)
{
    EXPECT_EQ(age, 20);
}

int main(int argc, char* argv[])
{
    //固定代码  启动gtest
    testing::InitGoogleTest(&argc, argv);
    //运行所有测试(符合条件的)用例
    return  RUN_ALL_TESTS();
}

  • TestFixture.h
#include "gtest.h"


using namespace std;


class TestFixture : public ::testing::Test
{

    // Test interface
protected:
    //测试开始前框架会调用这个方法,(初始化测试数据)
    void SetUp() override;
    //测试完后运行这个方法
    void TearDown() override;

public:
    TestFixture();
    int id = 1;
    string name = "lihua";
    int age = 18;
};

  • TestFixture.cpp
#include "testfixture.h"
#include <iostream>

using namespace std;

TestFixture::TestFixture()
{

}

void TestFixture::SetUp()
{
    cout << "------------before testing!!!------------" << endl;
    //初始化测试数据
    id = 2;
    name = "xiaoming";
    age  = 12;
}

void TestFixture::TearDown()
{
    cout << "-----------after the test!!!--------------" << endl;
}

在这里插入图片描述
运行过程:

  1. 谷歌测试构造一个对象(我们称之为)。TestFixture t1 (框架创建的对象)
  2. t1.SetUp()初始化。(在测试前调用初始化方法)
  3. 运行测试名为: test1的测试。
  4. 测试完成后调用 t1.TearDown() 进行(处理业务)清理数据。
  5. t1对象销毁。
  6. 在另一个对象上重复上述步骤,这次运行测试。test2

3、TEST_P

没搞懂。

TEST_P

其他讲解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/35736.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ImportError: cannot import name ‘xxx‘ from ‘xxx‘关于python导包的问题

github clone下来的代码&#xff0c;在矩池云跑的好好的&#xff0c;在自己电脑跑却报错。 ImportError: cannot import name ‘helper’ from ‘utils’ (D:\anaconda\envs\TF2.1\lib\site-packages\utils_init_.py) 搜了网上&#xff0c;说加路径 import sys sys.path.appe…

力控关节机器人(关节扭矩传感器力控)

力控机器人本质上属于协作机器人中的一种&#xff0c;其每个关节都带有力矩传感器&#xff1b; [1] 广泛应用在工业、医疗、新零售领域或智能厨房行业。 Franka Emika&#xff1a; 力控机器人每个关节都带有力矩传感器 力矩传感器提供了一种提高机器人力控性能的途径。 更加…

[毕业设计]基于机器视觉的车辆速度检测与识别算法

前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投…

面板平滑转换回归(PSTR)分析案例实现

建模过程包括三个阶段&#xff1a;表述&#xff0c;估计和评估&#xff0c;本文帮助用户进行模型表述、估计&#xff0c;进行PSTR模型评估。 最近我们被客户要求撰写关于PSTR的研究报告&#xff0c;包括一些图形和统计输出。 在程序包中实现了集群依赖性和异方差性一致性检验…

电脑删除的照片怎么找回来?总结了四种方法

照片被删除似乎是常有的事情&#xff0c;如果是重要的照片被删了&#xff0c;想要办法恢复才是最重要的。而对于删除的照片您是如何恢复的呢&#xff1f;这里总结了几种恢复方法&#xff0c;根据自己的需要选择恢复方法&#xff0c;不出意料的话&#xff0c;按照下面的方法你将…

以分割栅格为例实现FME模板的方案优化

一、利用FME分割栅格 &#xff08;一&#xff09;问题的产生 对于FME使用者来说&#xff0c;利用FME完成栅格的批量分割是一件极为平常且容易的事情。只需要输入栅格和确定分割方案就可以实现利用FME对栅格数据的分割&#xff0c;再配合FME的“扇出”功能&#xff0c;就能够实…

WebDAV之葫芦儿·派盘+多彩笔记

多彩笔记 支持webdav方式连接葫芦儿派盘。 还记得小时候那款带密码锁的笔记本?有没有好用的笔记app可以将笔记加上密码,不怕小秘密被偷看?推荐朋友们体验下多彩笔记。 多彩笔记是一款简单又精致的记事软件,用户可以在多彩笔记app中存储,编辑,删除或查找记录,对于写作…

干货 | 如何获取Servlet内存马?

前言 对于回显的获取主要是在ApplicationFilterChain类的lastServicedRequest / lastServicedResponse两个属性&#xff0c;是使用的ThreadLocal进行修饰的&#xff0c;并且&#xff0c;在执行请求的过程中&#xff0c;通过反射修改属性值&#xff0c;能够记录下当前线程的req…

CS224W 7 A General Perspective on Graph Neural Networks

目录 A General GNN Framework A single GNN layer 基本形式 Classical GNN Layers: GCN Classical GNN Layers: GraphSAGE Classical GNN Layers: GAT 动机 Attenion Mechanism Multi-head attention Attenion Mechanism的优点 GNN Layer in Practice Stacking Lay…

股票交易接口软件服务涵盖范围有哪些?

通常所说的股票交易接口软件是指量化交易程序员们可以自行查询各大交易网站或交易所的股票历史数据及行情数据的工具&#xff0c;如&#xff1a;实时报价&#xff1b;走势图&#xff1b;价差图&#xff1b;基金、债券、期货、外汇、保险等各类金融数据查询等&#xff0c;进行数…

elasticsearch7.6安装教程及启动常见错误解决方法

elasticsearch就是一个类似数据库用来专门做搜索的一款工具,在大量的搜索条件下,效率很好,可以直接把它当成一个数据库。 1.打开官网 Download Elasticsearch | Elastic,下载历史版本 这里我选择7.6.1 然后点击linux sha 下载,我这里采用迅雷下载到本地后,再利用Xftp上…

【设计模式】装饰器模式( Decorator Pattern)

装饰器模式属于结构型模式&#xff0c;主要解决当系统需要添加新功能&#xff0c;需要向旧类中不断添加新的属性和方法&#xff0c;从而导致整个类的复杂度不断增长的问题。假如新加的代码仅仅是为了满足特定场景下才会执行的需要&#xff0c;那么就没必要全部写在主类中&#…

一个年薪20万软件测试工程师都具备的能力,你有吗?

今天和大家一起来讨论一下一个很火的问题&#xff1a;作为软件测试工程师需要具备哪些实力。 硬实力&#xff1a;学历技术 目前随着社会的发展&#xff0c;各个行业对岗位学历的要求也越来越高&#xff0c;尤其是对于工资水平高的技术岗位。 测试通用技能&#xff1a; 软件…

Revit中参数化弹簧族怎么做?

Revit中参数化弹簧族制作 第一步&#xff1a;新建族&#xff0c;族样板选择 “公制常规模型第二步&#xff1a;在平面视图中&#xff0c;在中心参照平面两端创建两条参照平面&#xff0c;等分标注&#xff0c;赋予其参数“一圈弹簧直径”&#xff0c;如图 1 第三步&#xff1a;…

环糊精-PEG-麦芽糖 maltose-Cyclodextrin 麦芽糖-环糊精

环糊精-PEG-麦芽糖 maltose-Cyclodextrin 麦芽糖-环糊精 英文名称&#xff1a;maltose-Cyclodextrin 别称&#xff1a;环糊精修饰麦芽糖&#xff0c;环糊精-麦芽糖 还可以提供PEG接枝修饰麦芽糖&#xff0c;麦芽糖-聚乙二醇-环糊精Cyclodextrin-PEG-maltose&#xff0c;环糊…

05、Spring事务详解

本文主要介绍Spring中的事务相关知识&#xff1a; 1、熟悉事务管理的三个核心接口 2、了解Spring事务的两种方式 3、掌握基于XML和注解的事务使用 1、Spring事务管理概述 1、事务管理的核心接口 1、PlatformTransactionManager PlatformTransactionManage接口是Spring平台提…

FineReport智能表格软件-JS实现大数据集导出(一)

前言 帆软FineReport大批量数据导出的时候&#xff0c;会对服务器、网络传输、数据库造成一定的压力。为了防止这样的风险&#xff0c;FineReport 11.0 新增了「大数据集导出」的功能&#xff0c;可直接根据数据集结果进行导出。 1.接口简介与注意事项 1.1 接口简介 大数据…

Redis订阅发布

Redis发布订阅(pub/sub)是一种消息通信模式&#xff1a;发送者(pub)发送消息&#xff0c;订阅者(sub)接受消息。&#xff08;微信、微博、关注系统&#xff09; Redis客户端可以订阅任意数量的频道 订阅发布消息图&#xff1a; 三个角色&#xff1a;消息发送者、频道、消息订…

VMware 安装Ubuntu22.04

0、前提条件 操作系统&#xff1a;Windows10 VMware Workstation版本&#xff1a;15.1.0 build-13591040 1、安装 下载地址&#xff1a;下载Ubuntu桌面系统 | Ubuntu 打开VMware&#xff0c;选择文件 -> 新建虚拟机 配置类型选择典型&#xff0c;单击“下一步”按钮 选择…

python操作Excel之提取字符串中的中文/过滤字符串(win32com)

Python实用篇-Excel1.前言2.关于Excel3.win32com库操作4.问题解决4.1.问题描述4.2.安装库4.3.编码与解决1.前言 本人大学期间自学了Python后&#xff0c;但是又因不是大数据相关专业&#xff0c;并且没有计划从事Python相关方向&#xff0c;之后就几乎没有怎么使用过Python了。…