C/C++测试框架googletest使用示例

文章目录

    • 文档
    • 编译安装
    • 示例
    • 参考文章

文档

https://github.com/google/googletest
https://google.github.io/googletest/

编译安装

googletest是cmake项目,可以用cmake指令编译

cmake -B build && cmake --build build

将编译产物libinclude 两个文件夹复制到单独的文件夹,例如:/local/package/googletest

tree
.
├── include
│   └── gtest
│       ├── gtest-assertion-result.h
│       ├── gtest-death-test.h
│       ├── gtest-matchers.h
│       ├── gtest-message.h
│       ├── gtest-param-test.h
│       ├── gtest-printers.h
│       ├── gtest-spi.h
│       ├── gtest-test-part.h
│       ├── gtest-typed-test.h
│       ├── gtest.h
│       ├── gtest_pred_impl.h
│       ├── gtest_prod.h
│       └── internal
│           ├── custom
│           │   ├── README.md
│           │   ├── gtest-port.h
│           │   ├── gtest-printers.h
│           │   └── gtest.h
│           ├── gtest-death-test-internal.h
│           ├── gtest-filepath.h
│           ├── gtest-internal.h
│           ├── gtest-param-util.h
│           ├── gtest-port-arch.h
│           ├── gtest-port.h
│           ├── gtest-string.h
│           └── gtest-type-util.h
└── lib├── libgmock.a├── libgmock_main.a├── libgtest.a└── libgtest_main.a

设置环境变量

# ~/.bashrc
# googletest env
GOOGLETEST_HOME=/local/package/googletest# 静态库
export LIBRARY_PATH=$GOOGLETEST_HOME/lib:$LIBRARY_PATH# include
export CPLUS_INCLUDE_PATH=$GOOGLETEST_HOME/include:$CPLUS_INCLUDE_PATH

示例

项目结构

.
├── CMakeLists.txt
├── include
│   └── math_util.h
├── src
│   ├── main.c
│   └── math_util.c
└── test├── CMakeLists.txt├── main.cpp└── math_util_test.cpp4 directories, 7 files

test 是测试文件夹,使用cpp编写,src是代码库文件夹

./CMakeLists.txt

# cmake -B build && cmake --build build && ./build/App
cmake_minimum_required(VERSION 3.15)project(App)add_subdirectory(test)include_directories("./include")aux_source_directory("./src" DIR_SRCS)add_executable(App ${DIR_SRCS})
add_library(APPLib STATIC ${DIR_SRCS})enable_testing()
add_test(NAME test COMMAND test/AppTest)

./test/CMakeLists.txt

# cmake -B build && cmake --build build && ./build/AppTestcmake_minimum_required(VERSION 3.15)project(AppTest)set(CMAKE_CXX_STANDARD 14)# include
include_directories("../include")# lib
link_libraries(gtest gtest_main APPLib)# 编译文件
aux_source_directory(. TEST_SRC)# 生成测试可执行程序
add_executable(AppTest ${TEST_SRC})

./test/math_util_test.cpp

#include <gtest/gtest.h>
#include <stdio.h>extern "C"{#include "math_util.h"
}TEST(AddTest, PositiveNos) {printf("PositiveNos");EXPECT_EQ(2, add(1, 1));EXPECT_EQ(10, add(5, 5));EXPECT_EQ(100, add(50, 50));
}TEST(AddTest, NegativeNos) {printf("NegativeNos");EXPECT_EQ(-2, add(-1, -1));EXPECT_EQ(-10, add(-5, -5));EXPECT_EQ(-100, add(-50, -50));EXPECT_EQ(-20, add(-50, 30));
}

./test/main.cpp

#include <gtest/gtest.h>int main(int argc, char* argv[])
{testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}

./include/math_util.h

// math_util.h
#ifndef MATH_UTIL_H
#define MATH_UTIL_Hint add(int a, int b);#endif

./src/math_util.c

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

./src/main.c

#include "math_util.h"
#include <stdio.h>int main(int argc, char* argv[])
{int result = add(1, 1);printf("%d\n", result);return 0;
}

运行测试

cmake -B build && cmake --build build && ./build/test/AppTest[==========] Running 2 tests from 1 test suite.
[----------] Global test environment set-up.
[----------] 2 tests from AddTest
[ RUN      ] AddTest.PositiveNos
test PositiveNos[       OK ] AddTest.PositiveNos (0 ms)
[ RUN      ] AddTest.NegativeNos
test NegativeNos[       OK ] AddTest.NegativeNos (0 ms)
[----------] 2 tests from AddTest (0 ms total)[----------] Global test environment tear-down
[==========] 2 tests from 1 test suite ran. (0 ms total)
[  PASSED  ] 2 tests.

完整代码:https://github.com/mouday/gtest-demo

参考文章

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

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

相关文章

LintCode第974题-求矩阵各节点的最短路径(以0为标准)

描述 给定一个由0和1组成的矩阵&#xff0c;求每个单元格最近的0的距离。 两个相邻细胞之间的距离是1。 给定矩阵的元素数不超过10,000。 在给定的矩阵中至少有一个0。 单元格在四个方向上相邻:上&#xff0c;下&#xff0c;左和右。 样例 例1: 输入: [[0,0,0],[0,0,0],[0…

Redis核心机制-缓存、分布式锁

目录 缓存 缓存更新策略 定期生成 实时生成 缓存问题 缓存预热&#xff08;Cache preheating&#xff09; 缓存穿透&#xff08;Cache penetration&#xff09; 缓存雪崩&#xff08;Cache avalanche&#xff09; 缓存击穿&#xff08;Cache breakdown&#xff09; 分…

CF每日5题(1300-1500)

最近急速补练蓝桥杯中&#xff0c;疏于cf练习。 感觉自己过题还是太慢了。 今日水题&#xff0c;我水水水水。 1- 1979C lcm 水 1400 第 i i i局赢了&#xff0c;1个硬币顶 k [ i ] k[i] k[i]个贡献&#xff0c;所以每局分硬币 x i 1 k [ i ] x_i{1\over k[i]} xi​k[i]1​个…

从代码学习深度学习 - LSTM PyTorch版

文章目录 前言一、数据加载与预处理1.1 代码实现1.2 功能解析二、LSTM介绍2.1 LSTM原理2.2 模型定义代码解析三、训练与预测3.1 训练逻辑代码解析3.2 可视化工具功能解析功能结果总结前言 深度学习中的循环神经网络(RNN)及其变种长短期记忆网络(LSTM)在处理序列数据(如文…

easy-poi 一对多导出

1. 需求&#xff1a; 某一列上下两行单元格A,B值一样且这两个单元格&#xff0c; 前面所有列对应单元格值一样的话&#xff0c; 就对A,B 两个单元格进行纵向合并单元格 1. 核心思路&#xff1a; 先对数据集的国家&#xff0c;省份&#xff0c;城市...... id 身份证进行排序…

AI比人脑更强,因为被植入思维模型【42】思维投影思维模型

giszz的理解&#xff1a;本质和外在。我们的行为举止&#xff0c;都是我们的内心的表现。从外边可以看内心&#xff0c;从内心可以判断外在。曾国藩有&#xff17;个识人的方法&#xff0c;大部分的人在他的面前如同没穿衣服一样。对于我们自身的启迪&#xff0c;我认为有四点&…

Spring Boot 打印日志

1.通过slf4j包中的logger对象打印日志 Spring Boot内置了日志框架slf4j&#xff0c;在程序中调用slf4j来输出日志 通过创建logger对象打印日志&#xff0c;Logger 对象是属于 org.slf4j 包下的不要导错包。 2.日志级别 日志级别从高到低依次为: FATAL:致命信息&#xff0c;表…

【IOS webview】源代码映射错误,页面卡住不动

报错场景 safari页面报源代码映射错误&#xff0c;页面卡住不动。 机型&#xff1a;IOS13 技术栈&#xff1a;react 其他IOS也会报错&#xff0c;但不影响页面显示。 debug webpack配置不要GENERATE_SOURCEMAP。 解决方法&#xff1a; GENERATE_SOURCEMAPfalse react-app…

ES中经纬度查询geo_point

0. ES版本 6.x版本 1. 创建索引 PUT /location {"settings": {"number_of_shards": 1,"number_of_replicas": 0},"mappings": {"location": {"properties": {"id": {"type": "keywor…

OpenCV界面编程

《OpenCV计算机视觉开发实践&#xff1a;基于Python&#xff08;人工智能技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 OpenCV的Python开发环境搭建(Windows)-CSDN博客 OpenCV也支持有限的界面编程&#xff0c;主要是针对窗口、控件和鼠标…

GOC L2 第五课模运算和周期二

课堂回顾&#xff1a; 求取余数的过程叫做模运算 每轮的动作都是重复的&#xff0c;我们称这个过程位周期。 课堂学习&#xff1a; 剩余计算器 秋天到了&#xff0c;学校里的苹果熟了&#xff0c;太乙老师&#xff0c;想让哪吒帮忙设计一个计算器&#xff0c;看每个小朋友能分…

54.大学生心理健康管理系统(基于springboot项目)

目录 1.系统的受众说明 2.相关技术 2.1 B/S结构 2.2 MySQL数据库 3.系统分析 3.1可行性分析 3.1.1时间可行性 3.1.2 经济可行性 3.1.3 操作可行性 3.1.4 技术可行性 3.1.5 法律可行性 3.2系统流程分析 3.3系统功能需求分析 3.4 系统非功能需求分析 4.系统设计…

Redis 除了数据类型外的核心功能 的详细说明,包含事务、流水线、发布/订阅、Lua 脚本的完整代码示例和表格总结

以下是 Redis 除了数据类型外的核心功能 的详细说明&#xff0c;包含事务、流水线、发布/订阅、Lua 脚本的完整代码示例和表格总结&#xff1a; 1. Redis 事务&#xff08;Transactions&#xff09; 功能描述 事务通过 MULTI 和 EXEC 命令将一组命令打包执行&#xff0c;保证…

STM32F103C8T6单片机硬核原理篇:讨论GPIO的基本原理篇章1——只讨论我们的GPIO简单输入和输出

目录 前言 输出时的GPIO控制部分 标准库是如何操作寄存器完成GPIO驱动的初始化的&#xff1f; 问题1&#xff1a;如何掌握GPIO的编程细节——跟寄存器如何打交道 问题2&#xff1a;哪些寄存器&#xff0c;去哪里找呢&#xff1f; 问题三&#xff0c;寄存器的含义&#xff…

前端布局难题:父元素padding导致子元素无法全屏?3种解决方案

大家好&#xff0c;我是一诺。今天要跟大家分享一个我在实际项目中经常用到的CSS技巧——如何让子元素突破父元素的padding限制&#xff0c;实现真正的全屏宽度效果。 为什么会有这个需求&#xff1f; 记得我刚入行的时候&#xff0c;接到一个需求&#xff1a;要在内容区插入…

当网页受到DDOS网络攻击有哪些应对方法?

分布式拒绝服务攻击也是人们较为熟悉的DDOS攻击&#xff0c;这类攻击会通过大量受控制的僵尸网络向目标服务器发送请求&#xff0c;以此来消耗服务器中的资源&#xff0c;致使用户无法正常访问&#xff0c;当网页受到分布式拒绝服务攻击时都有哪些应对方法呢&#xff1f; 建立全…

LeNet-5简介及matlab实现

文章目录 一、LeNet-5网络结构简介二、LeNet-5每一层的实现原理2.1. 第一层 (C1) &#xff1a;卷积层&#xff08;Convolution Layer&#xff09;2.2. 第二层 (S2) &#xff1a;池化层&#xff08;Pooling Layer&#xff09;2.3. 第三层&#xff08;C3&#xff09;&#xff1a;…

【LLM】MCP(Python):实现 stdio 通信的Client与Server

本文将详细介绍如何使用 Model Context Protocol (MCP) 在 Python 中实现基于 STDIO 通信的 Client 与 Server。MCP 是一个开放协议&#xff0c;它使 LLM 应用与外部数据源和工具之间的无缝集成成为可能。无论你是构建 AI 驱动的 IDE、改善 chat 交互&#xff0c;还是构建自定义…

Docker 安装 Elasticsearch 教程

目录 一、安装 Elasticsearch 二、安装 Kibana 三、安装 IK 分词器 四、Elasticsearch 常用配置 五、Elasticsearch 常用命令 一、安装 Elasticsearch &#xff08;一&#xff09;创建 Docker 网络 因为后续还需要部署 Kibana 容器&#xff0c;所以需要让 Elasticsearch…

Swagger @ApiOperation

ApiOperation 注解并非 Spring Boot 自带的注解&#xff0c;而是来自 Swagger 框架&#xff0c;Swagger 是一个规范且完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务&#xff0c;而 ApiOperation 主要用于为 API 接口的操作添加描述信息。以下为…