基于gtest、mockcpp写C++LLT测试入门级教程

article/2025/8/30 6:52:58

一、googletest

下载地址:https://github.com/google/googletest

编译googletest:
在根目录下执行
cmake .
make
在这里插入图片描述
编译出的libgtest.a后面用
注意:有可能编译会失败,是gtest需要C++11以上 可以在顶级的CMakeList.txt里加入 set(CMAKE_CXX_STANDARD 11)

二、mockcpp

googletest中也有gmock,但是gmock其实只能用于对对象函数的mocker,不能对C代码中的一般函数进行mcoker,因此用了mockcpp
下载地址:https://code.google.com/archive/p/mockcpp/downloads
官方手册:https://code.google.com/p/mockcpp
中文手册:https://blog.csdn.net/tony_wong/article/details/38752355
编译mockcpp:
cmake .
make install
在这里插入图片描述
可以看到上图编译完成后生成了一个libmockcpp.a

三、写测试用例

第一个gtest程序
frame.h

#ifndef __FRAME_H__
#define __FRAME_H__namespace Frameuitl {
int add(int a, int b);
}
#endif

frame.cpp

#include "frame.h"namespace Frameuitl {
int add(int a, int b)
{return a + b;
}
}

main.cpp

#include <iostream>
#include "gtest/gtest.h"
#include "frame/frame.h"TEST(TestAdd, TestCase1)
{EXPECT_EQ(5, Frameuitl::add(2, 3));
}TEST(TestAdd, TestCase2)
{EXPECT_EQ(6, Frameuitl::add(2, 3));
}int main(int argc, char **argv)
{std::cout << "gtest begin.." << std::endl;testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}

上面是测试代码,TEST(TestAdd, TestCase1)定义了一个测试用例,EXPECT_EQ 第一个入参表示预期结果,第二个入参是要测试的接口。
目录结构如下LLT_demon_1/third_party用来放gtest、mockcpp的头文件及静态库;LLT_demon_1/common是需要测试的公共接口,LLT_demon_1/src/test是gtest测试代码

LLT_demon_1
├── bin
│   ├── main
│   └── test_main
├── build
├── CMakeLists.txt
├── common
│   ├── CMakeLists.txt
│   └── frame
│       ├── frame.cpp
│       └── frame.h
├── libs
│   └── libframe.a
├── README.md
├── src
│   ├── CMakeLists.txt
│   ├── main
│   │   ├── CMakeLists.txt
│   │   └── main.cpp
│   └── test
│       ├── CMakeLists.txt
│       └── main.cpp
└── third_party├── googletest│   └── include│       └── gtest├── libs│   ├── libgtest.a│   └── libmockcpp.a└── mockcpp└── include└── mockcpp

经过编译测试代码生成test_main,执行后运行结果如下:
经过编译
可以看到main.cpp中两个测试用例 TestCase1通过 ,TestCase2失败

第一个mockcpp程序
因为接口中可能会调用到其他接口,所以需要自定义接口模拟下其他接口的行为。
场景如:你的接口中调用了一个查询数据库的接口或者发消息给另外一个进程获取某些资源

1、mockcpp编译需要依赖boost,环境需要安装boost
命令:sudo apt-get install libboost-dev
2、mockcpp编译需要依赖python2
如果是其他版本python会有语法报错 如:mockcpp/src/get_long_opt.py", line 29 print sys.argv[0], getUsageString(longOpts)
3、mockcpp定义了static_assert,而C++11引入了static_assert,重定义了,编译会报错
mockcpp/mockcpp.h:59:8: error: expected identifier before ‘static_assert’
解决办法:注释掉mockcpp.h中的static_assert
#if __cplusplus < 199711L

struct static_assert

#endif

func.cpp

#include "frame.h"namespace Frameuitl {int add(int a, int b)
{sleep(10);return a + b;
}}

main.cpp

#include <iostream>#include "gtest/gtest.h"
#include <mockcpp/mockcpp.hpp>
#include "frame/frame.h"inline unsigned int mok_sleep(unsigned int seconds) {std::cout << "running mok_sleep" << std::endl;
}TEST(TestAdd, TestCase1)
{EXPECT_EQ(5, Frameuitl::add(2, 3));
}TEST(TestAdd, TestCase2)
{MOCKER(sleep).stubs().will(invoke(mok_sleep));EXPECT_EQ(5, Frameuitl::add(2, 3));GlobalMockObject::verify(); // 用来清理case中的Mock函数,如果不调用,这个Mock函数在整个cpp中都生效
}int main(int argc, char **argv)
{std::cout << "gtest begin.." << std::endl;testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}

上面的例子,我们在TestCase2测试用例执行将add中调用的标准库函数sleep mock成日志打印,TestCase1用例没有mock,因此sleep了10秒,运行结果如下:
在这里插入图片描述

可能会有接口需要共用一个Mock函数,可以用下面的写法,所有的Mock函数都可以放在SetUp()中,这种方法减少了mock次数,通过内存换时间,提升LL速度:

#include <iostream>#include "gtest/gtest.h"
#include <mockcpp/mockcpp.hpp>
#include "frame/frame.h"inline unsigned int mok_sleep(unsigned int seconds) {std::cout << "running mok_sleep" << std::endl;
}class FooEnvironment : public testing::Environment
{
public:void SetUp() override {MOCKER(sleep).stubs().will(invoke(mok_sleep));}void TearDown() {}
};TEST(TestAdd, TestCase1)
{EXPECT_EQ(5, Frameuitl::add(2, 3));
}TEST(TestAdd, TestCase2)
{EXPECT_EQ(5, Frameuitl::add(2, 3));
}int main(int argc, char **argv)
{std::cout << "gtest begin.." << std::endl;testing::AddGlobalTestEnvironment(new FooEnvironment());testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}
  • 通过gcov+lcov查看代码覆盖率

参考资料:
https://blog.csdn.net/xueyong4712816/article/details/34086649
http://www.voidcn.com/article/p-yxgtonll-gn.html
http://t.zoukankan.com/heimianshusheng-p-13530672.html
https://cloud.tencent.com/developer/article/1552518?from=information.detail.mockcpp
https://www.cnblogs.com/coderzh/archive/2009/04/06/1430364.html
https://blog.csdn.net/russell_tao/article/details/7333226


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

相关文章

量化策略分享 | MA超进化:LLT低延迟趋势线

移动平均线&#xff08;MA&#xff09;是我们技术分析中常用的一种趋势跟踪指标&#xff0c;但在使用的时候你是否也会有这样的烦恼&#xff1a;交易信号延迟太久&#xff0c;或者交易信号太频繁了&#xff01;延迟性和平滑性问题似乎是不可兼得的“鱼和熊掌”。 针对这个问题&…

LLT-发现股市中的“大浪”

引言&#xff1a; 股市中小的波动经常干扰股票投资人对大趋势的判断&#xff0c;倘若股市的波动同信号波动类似&#xff0c;那是不是可以用处理信号的方式处理股票波动发现大的波动呢&#xff1f;我们知道通信领域在处理信号波动时也常会遇到被噪音干扰的问题&#xff0c;这些噪…

HDU2544 最短路dij

纯最短路。 1 ///HDU 2544堆优化的最短路2 #include <cstdio>3 #include <iostream>4 #include <sstream>5 #include <cmath>6 #include <cstring>7 #include <cstdlib>8 #include <string>9 #include <vector>10 #include &l…

dij算法堆优化_迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少(示例代码)...

算法实现步骤&#xff1a; a.初始时&#xff0c;只包括源点&#xff0c;即S {v}&#xff0c;v的距离为0。U包含除v以外的其他顶点&#xff0c;即&#xff1a;U {其余顶点}&#xff0c;若v与U中顶点u有边&#xff0c;则(u,v)为正常权值&#xff0c;若u不是v的出边邻接点,则(u,v…

dij算法堆优化_迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少

算法实现步骤&#xff1a; a.初始时&#xff0c;只包括源点&#xff0c;即S {v}&#xff0c;v的距离为0。U包含除v以外的其他顶点&#xff0c;即&#xff1a;U {其余顶点}&#xff0c;若v与U中顶点u有边&#xff0c;则(u,v)为正常权值&#xff0c;若u不是v的出边邻接点,则(u,v…

图的最短路径——DIJ算法,有向图的矩阵实现,图的基本操作

图是一种非常重要的数据结构&#xff0c;在研究从一点出发到各个顶点的最短距离。 实验目的 1. 掌握图的基本概念、表示方法、遍历方法。 2. 掌握图的最短路径算法。 实验要求 1&#xff0e; 输入图的顶点数n&#xff08;不超过10个&#xff09;、边数m&#xff0c;顶点分…

堆优化dij

模板 【算法介绍】 用一个优先级队列来记录点和dis值&#xff0c;按照顺序进行边的松弛即可 1.农场派对 【题意】 有向图&#xff0c;求1-n所有点中到x点一去一回的最短路的最大值 【分析】 建立原图和反图&#xff0c;以x为源点跑两次dijkstra&#xff0c;对于1-n每个点…

图中的搜索——dij

Dijkstra(迪杰斯特拉算法)常常用于求解图中的单点最短路径问题。其主要实现方法可拆分为两个步骤&#xff1a;①更新距离信息②找出当前最小路径 如下图所示&#xff0c;要求求出1结点到6结点的最短路径。 我们可以先定义一下重点内容&#xff1a; 邻接矩阵map[i][j]&#xf…

关于普通dij算法为什么不能解决负权边的分析

我们首先来分析下含负权边的无向图&#xff1a; 1.先看图 我们求A点到C点的最短距离&#xff0c;很明显答案为1. 2.我们用dij来跑下&#xff0c;看过程&#xff1a; 先把A点标记哈&#xff0c;不需要访问本身首先找到距A最近的且直接相连的点&#xff08;也就是两点间没有…

dij最短路+堆优化

dij一个主要思路&#xff0c;将所有点分为两个集合S&#xff0c;T&#xff0c;初始集合S中只包含了起点&#xff0c;T集合包含所有点&#xff0c;要做的就是从T集合中不断选取与S集合中的点距离最短的并且未被加入S集合中的点&#xff0c;将这个点加入S集合&#xff0c;并用这个…

FreeType移植到 STM32 单片机以支持矢量字体

目录 一、准备工作 二、复制文件 三、添加C文件到Keil中 四、修改接口 五、调用 六、优化 七、效果 一、准备工作 下载Freetype源码 ----- 下载FreeType 以移植到Keil 的STM32工程为例 移植前的软件环境&#xff1a; 1&#xff0c;实现了内存分配函数 2&#xff0c;实现了文件…

freetype库实现文字显示

原文&#xff1a;http://www.cnblogs.com/lifexy/p/8503070.html 1 .数码相框-通过freetype库实现矢量显示 本章主要内容如下: 1)矢量字体原理2)使用freetype库实现矢量字体显示 1. 矢量字体原理 将汉字的笔划边缘用直线段描述成封闭的曲线&#xff0c;并将线段各端点的坐标经压…

常用字体介绍(freetype)

字体显示原理 字体和图片一样&#xff0c;存储为像素&#xff0c;绘制的时候需要找到字体对应的像素显示 字体文件格式 ttf&#xff0c;只包含一种字体格式&#xff0c;矢量字体ttc&#xff0c;ttc包含多个ttf文件&#xff0c;包含多种字体格式otf&#xff0c;ttf的扩展&…

FreeType 简单使用

FreeType 2 第一步 &#xff0d;&#xff0d; 简易的字形装载 介绍 这是“FreeType2 教程”的第一部分。它将教会你如何&#xff1a; * 初始化库 * 通过创建一个新的 face 对象来打开一个字体文件 * 以点或者象素的形式选择一个字符大小 * 装载一个字形(glyph)图像&…

freetype的安装与使用

一、在PC上的安装与使用 1) 开发环境 系统版本&#xff1a; ubuntu14.04 freetype版本&#xff1a; freetype-2.4.10 gcc版本&#xff1a; gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3) 2) 步骤 1. 解压缩 tar xjf freetype-2.4.10.tar.bz2 2. 配置 …

freetype环境安装记录

&#xff08;一&#xff09;摘要 最近在学习韦东山老师的驱动入门课程&#xff0c;在freetype环境安装时碰到到了一下这个报错&#xff0c;于是想记录下自己的安装过程方便其他碰到问题的同学解决&#xff01; &#xff08;二&#xff09;碰到的报错 我是用的是IMX6ULL PRO开…

freetype的简单使用

安装完毕以后我们先做个简单的实例程序看看效果 1.首先先下载字体 链接&#xff1a;https://pan.baidu.com/s/1FCOh9SYcVkYCkaT6wtXWtA 提取码&#xff1a;rohm 2.编写程序 编译测试文件example.c /*编译命令*/ -I指定库文件所在位置-L指定动态库位置gcc example.c…

(转)FreeType字体位图属性

原文链接&#xff1a;https://blog.csdn.net/wlk1229/article/details/92424456 从原文中摘取一部分记录如下&#xff1a; FreeType获取的位图是一张刚好包含文字的位图&#xff0c;不包含左右上下的空白信息。如果绘制文字时直接把每一张位图连接在一起&#xff0c;文字则会一…

freetype编译

freetype简介 FreeType库是一个完全免费(开源)的、高质量的且可移植的字体引擎&#xff0c;它提供统一的接口来访问多种字体格式文件&#xff0c;包括TrueType, OpenType, Type1, CID, CFF, Windows FON/FNT, X11 PCF等。支持单色位图、反走样位图的渲染。FreeType库是高度模块…

windows下编译OpenCV带opencv_contrib和freetype

目录 1. 下载安装cmake、opencv2. 编译freetype和harfbuzz2.1 pkg-config2.2 freetype2.3 harfbuzz2.4 修改opencv_contrib下的modules/freetype/CMakeLists.txt 3. 编译OpenCV5. 示例6. 编译好的OpenCV下载地址7. 参考文章 1. 下载安装cmake、opencv cmake下载地址&#xff1…